diff --git a/generator/src/main/java/com/speedment/generator/internal/lifecycle/GeneratedApplicationBuilderTranslator.java b/generator/src/main/java/com/speedment/generator/internal/lifecycle/GeneratedApplicationBuilderTranslator.java index e743a5fd70..858bc66e27 100644 --- a/generator/src/main/java/com/speedment/generator/internal/lifecycle/GeneratedApplicationBuilderTranslator.java +++ b/generator/src/main/java/com/speedment/generator/internal/lifecycle/GeneratedApplicationBuilderTranslator.java @@ -33,7 +33,6 @@ import static com.speedment.common.codegen.internal.model.constant.DefaultJavadocTag.AUTHOR; import static com.speedment.common.codegen.internal.util.Formatting.nl; import static com.speedment.common.codegen.internal.util.Formatting.shortName; -import static com.speedment.common.codegen.internal.util.Formatting.tab; import com.speedment.common.codegen.model.Field; import com.speedment.common.injector.Injector; import com.speedment.common.injector.annotation.Inject; @@ -47,11 +46,10 @@ import static java.util.stream.Collectors.toSet; import com.speedment.common.mapstream.MapStream; import com.speedment.runtime.component.InfoComponent; -import com.speedment.runtime.component.ManagerComponent; import java.util.LinkedList; import static com.speedment.runtime.internal.util.document.DocumentDbUtil.traverseOver; -import com.speedment.runtime.util.CollectorUtil; import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.joining; /** * @@ -88,63 +86,46 @@ protected Class makeCodeGenModel(File file) { .keys() .collect(toSet()); - final List managers = new LinkedList<>(); final List managerImpls = new LinkedList<>(); traverseOver(project, Table.class) .filter(HasEnabled::test) .forEachOrdered(t -> { final TranslatorSupport support = injector.inject(new TranslatorSupport<>(t)); - final Type managerType = support.managerType(); final Type managerImplType = support.managerImplType(); if (ambigousNames.contains(t.getName())) { - managers.add(managerType.getName()); managerImpls.add(managerImplType.getName()); } else { - file.add(Import.of(managerType)); file.add(Import.of(managerImplType)); - managers.add(shortName(managerType.getName())); managerImpls.add(shortName(managerImplType.getName())); } }); file.add(Import.of(applicationType())); file.add(Import.of(applicationImplType())); - file.add(Import.of(Type.of(ManagerComponent.class))); final Method build = Method.of("build", applicationType()) .public_().add(OVERRIDE) .add(Field.of("injector", Type.of(Injector.class))) - .add("final " + ManagerComponent.class.getSimpleName() + - " managers = injector.getOrThrow(" + ManagerComponent.class.getSimpleName() + - ".class);" - ); - - managers.stream() - .map(s -> new StringBuilder("managers.put(injector.getOrThrow(").append(s).append(".class));")) - .map(StringBuilder::toString) - .forEachOrdered(build::add); - - build.add("return injector.getOrThrow(" + getSupport().typeName(getSupport().projectOrThrow()) + "Application.class);"); + .add("return injector.getOrThrow(" + getSupport().typeName(getSupport().projectOrThrow()) + "Application.class);"); final Constructor constr = Constructor.of().protected_(); - final StringBuilder constructorBody = new StringBuilder("super(").append(nl()); - constructorBody.append(tab()).append(getSupport().typeName(getSupport().projectOrThrow())).append("ApplicationImpl.class,").append(nl()); - constructorBody.append(tab()).append("Generated").append(getSupport().typeName(getSupport().projectOrThrow())).append(METADATA + ".class"); + final StringBuilder constructorBody = new StringBuilder("super("); + constructorBody.append(getSupport().typeName(getSupport().projectOrThrow())).append("ApplicationImpl.class, "); + constructorBody.append("Generated").append(getSupport().typeName(getSupport().projectOrThrow())).append(METADATA).append(".class);").append(nl()); - final String separator = "," + nl() + tab(); + final String separator = nl(); if (!managerImpls.isEmpty()) { constructorBody.append( managerImpls.stream() - .map(s -> s + ".class") - .collect(CollectorUtil.joinIfNotEmpty(separator, separator, "")) + .map(s -> "withManager(" + s + ".class);") + .collect(joining(separator)) ); } - constructorBody.append(nl()).append(");"); constr.add(constructorBody.toString()); clazz.public_().abstract_() diff --git a/maven-plugin/src/main/java/com/speedment/maven/AbstractSpeedmentMojo.java b/maven-plugin/src/main/java/com/speedment/maven/AbstractSpeedmentMojo.java index 7f274a298a..ff87dcc36d 100644 --- a/maven-plugin/src/main/java/com/speedment/maven/AbstractSpeedmentMojo.java +++ b/maven-plugin/src/main/java/com/speedment/maven/AbstractSpeedmentMojo.java @@ -27,6 +27,7 @@ import com.speedment.tool.internal.component.UserInterfaceComponentImpl; import static com.speedment.tool.internal.util.ConfigFileHelper.DEFAULT_CONFIG_LOCATION; import java.io.File; +import java.util.Arrays; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -95,6 +96,14 @@ protected final boolean hasConfigFile(File file) { try { final Class uncasted = Class.forName(component); + Class temp = uncasted; + while (temp != null) { + System.out.println("Class name: " + temp.getName()); + System.out.println("Annotations: " + Arrays.toString(temp.getAnnotations())); + System.out.println("Declared Annotations: " + Arrays.toString(temp.getDeclaredAnnotations())); + temp = temp.getSuperclass(); + } + @SuppressWarnings("unchecked") final Class casted = (Class) uncasted; result.with(casted); diff --git a/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/AbstractDbmsType.java b/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/AbstractDbmsType.java index 09f174e689..6889383683 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/AbstractDbmsType.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/AbstractDbmsType.java @@ -16,7 +16,8 @@ */ package com.speedment.runtime.internal.config.dbms; -import com.speedment.common.injector.annotation.Execute; +import static com.speedment.common.injector.State.INITIALIZED; +import com.speedment.common.injector.annotation.ExecuteBefore; import com.speedment.common.injector.annotation.Inject; import com.speedment.runtime.component.DbmsHandlerComponent; import com.speedment.runtime.config.parameter.DbmsType; @@ -34,7 +35,7 @@ */ public abstract class AbstractDbmsType implements DbmsType { - @Execute + @ExecuteBefore(INITIALIZED) void install(@Inject DbmsHandlerComponent component) { component.install(this); } diff --git a/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/PostgresDbmsType.java b/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/PostgresDbmsType.java index 477576e1cb..7890fc1128 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/PostgresDbmsType.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/config/dbms/PostgresDbmsType.java @@ -31,7 +31,6 @@ import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.toSet; import java.util.stream.Stream; -import static com.speedment.runtime.db.metadata.TypeInfoMetaData.of; import com.speedment.runtime.field.predicate.SpeedmentPredicateView; import com.speedment.runtime.internal.db.postgresql.PostgresqlDbmsMetadataHandler; import com.speedment.runtime.internal.db.postgresql.PostgresqlDbmsOperationHandler; diff --git a/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsMetadataHandler.java b/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsMetadataHandler.java index 51d9b0d142..3eb0224ac3 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsMetadataHandler.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsMetadataHandler.java @@ -16,6 +16,8 @@ */ package com.speedment.runtime.internal.db; +import static com.speedment.common.injector.State.INITIALIZED; +import com.speedment.common.injector.annotation.ExecuteBefore; import com.speedment.common.injector.annotation.Inject; import com.speedment.common.logger.Logger; import com.speedment.common.logger.LoggerManager; @@ -53,7 +55,6 @@ import static com.speedment.runtime.internal.util.CaseInsensitiveMaps.newCaseInsensitiveMap; import static com.speedment.runtime.internal.util.document.DocumentDbUtil.dbmsTypeOf; import com.speedment.runtime.internal.util.document.DocumentUtil; -import static com.speedment.runtime.util.NullUtil.requireNonNulls; import com.speedment.runtime.util.ProgressMeasure; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -66,14 +67,12 @@ import java.util.Map; import java.util.Objects; import static java.util.Objects.nonNull; -import static java.util.Objects.requireNonNull; import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.function.Supplier; -import com.speedment.common.injector.annotation.IncludeInjectable; import static com.speedment.runtime.util.NullUtil.requireNonNulls; import static java.util.Objects.requireNonNull; @@ -83,7 +82,6 @@ * @author Per Minborg * @since 2.4.0 */ -@IncludeInjectable(JavaTypeMap.class) public abstract class AbstractDbmsMetadataHandler implements DbmsMetadataHandler { private final static Logger LOGGER = LoggerManager.getLogger(AbstractDbmsMetadataHandler.class); @@ -93,10 +91,19 @@ public abstract class AbstractDbmsMetadataHandler implements DbmsMetadataHandler private @Inject DbmsHandlerComponent dbmsHandlerComponent; private @Inject TypeMapperComponent typeMapperComponent; private @Inject ProjectComponent projectComponent; - private @Inject JavaTypeMap javaTypeMap; + private JavaTypeMap javaTypeMap; protected AbstractDbmsMetadataHandler() {} + @ExecuteBefore(INITIALIZED) + final void createJavaTypeMap() { + this.javaTypeMap = newJavaTypeMap(); + } + + protected JavaTypeMap newJavaTypeMap() { + return new JavaTypeMap(); + } + @Override public CompletableFuture readSchemaMetadata( Dbms dbms, diff --git a/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsOperationHandler.java b/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsOperationHandler.java index 314c9c9b6e..af25d4bbd8 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsOperationHandler.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/db/AbstractDbmsOperationHandler.java @@ -138,17 +138,17 @@ protected void execute(Dbms dbms, List sqlStatementList) switch (sqlStatement.getType()) { case INSERT: { final SqlInsertStatement s = (SqlInsertStatement) sqlStatement; - handleSqlStatement(conn, s); + handleSqlStatement(dbms, conn, s); break; } case UPDATE: { final SqlUpdateStatement s = (SqlUpdateStatement) sqlStatement; - handleSqlStatement(conn, s); + handleSqlStatement(dbms, conn, s); break; } case DELETE: { final SqlDeleteStatement s = (SqlDeleteStatement) sqlStatement; - handleSqlStatement(conn, s); + handleSqlStatement(dbms, conn, s); break; } } @@ -202,7 +202,7 @@ protected void execute(Dbms dbms, List sqlStatementList) } } - protected void handleSqlStatement(final Connection conn, final SqlInsertStatement sqlStatement) throws SQLException { + protected void handleSqlStatement(Dbms dbms, final Connection conn, final SqlInsertStatement sqlStatement) throws SQLException { try (final PreparedStatement ps = conn.prepareStatement(sqlStatement.getSql(), Statement.RETURN_GENERATED_KEYS)) { int i = 1; for (Object o : sqlStatement.getValues()) { @@ -218,15 +218,15 @@ protected void handleSqlStatement(final Connection conn, final SqlInsertStatemen } } - protected void handleSqlStatement(final Connection conn, final SqlUpdateStatement sqlStatement) throws SQLException { - handleSqlStatementHelper(conn, sqlStatement); + protected void handleSqlStatement(Dbms dbms, final Connection conn, final SqlUpdateStatement sqlStatement) throws SQLException { + handleSqlStatementHelper(dbms, conn, sqlStatement); } - protected void handleSqlStatement(final Connection conn, final SqlDeleteStatement sqlStatement) throws SQLException { - handleSqlStatementHelper(conn, sqlStatement); + protected void handleSqlStatement(Dbms dbms, final Connection conn, final SqlDeleteStatement sqlStatement) throws SQLException { + handleSqlStatementHelper(dbms, conn, sqlStatement); } - private void handleSqlStatementHelper(final Connection conn, final SqlStatement sqlStatement) throws SQLException { + private void handleSqlStatementHelper(Dbms dbms, final Connection conn, final SqlStatement sqlStatement) throws SQLException { try (final PreparedStatement ps = conn.prepareStatement(sqlStatement.getSql(), Statement.NO_GENERATED_KEYS)) { int i = 1; for (Object o : sqlStatement.getValues()) { @@ -253,26 +253,6 @@ protected String encloseField(Dbms dbms, String fieldName) { return dbmsTypeOf(dbmsHandlerComponent, dbms).getDatabaseNamingConvention().encloseField(fieldName); } -// @Override -// public String getDbmsInfoString() throws SQLException { -// try (final Connection conn = connectionPoolComponent.getConnection(dbms)) { -// final DatabaseMetaData md = conn.getMetaData(); -// return new StringBuilder() -// .append(md.getDatabaseProductName()) -// .append(", ") -// .append(md.getDatabaseProductVersion()) -// .append(", ") -// .append(md.getDriverName()) -// .append(" ") -// .append(md.getDriverVersion()) -// .append(", JDBC version ") -// .append(md.getJDBCMajorVersion()) -// .append(".") -// .append(md.getJDBCMinorVersion()) -// .toString(); -// } -// } - @Override public Clob createClob(Dbms dbms) throws SQLException { return applyOnConnection(dbms, Connection::createClob); diff --git a/runtime/src/main/java/com/speedment/runtime/internal/db/JavaTypeMap.java b/runtime/src/main/java/com/speedment/runtime/internal/db/JavaTypeMap.java index 8289342739..2682072485 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/db/JavaTypeMap.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/db/JavaTypeMap.java @@ -16,9 +16,6 @@ */ package com.speedment.runtime.internal.db; -import static com.speedment.common.injector.State.CREATED; -import static com.speedment.common.injector.State.INITIALIZED; -import com.speedment.common.injector.annotation.ExecuteBefore; import com.speedment.runtime.db.metadata.ColumnMetaData; import com.speedment.runtime.db.metadata.TypeInfoMetaData; import com.speedment.runtime.exception.SpeedmentException; @@ -37,13 +34,14 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; /** * * @author Emil Forslund * @since 2.4.0 */ -public final class JavaTypeMap { +public class JavaTypeMap { @FunctionalInterface public interface Rule { @@ -53,9 +51,48 @@ public interface Rule { private final List rules; private final Map> inner; - private JavaTypeMap() { + public JavaTypeMap() { + this(map -> {}); + } + + /** + * Sets up the java type map for this database type + * @see http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html + */ + protected JavaTypeMap(Consumer>> installer) { rules = new CopyOnWriteArrayList<>(); inner = newCaseInsensitiveMap(); + + inner.put("CHAR", String.class); + inner.put("VARCHAR", String.class); + inner.put("LONGVARCHAR", String.class); + inner.put("LONGVARCHAR", String.class); + inner.put("NUMERIC", BigDecimal.class); + inner.put("DECIMAL", BigDecimal.class); + inner.put("BIT", Integer.class); /// + inner.put("TINYINT", Byte.class); + inner.put("SMALLINT", Short.class); + inner.put("INTEGER", Integer.class); + inner.put("BIGINT", Long.class); + inner.put("REAL", Float.class); + inner.put("FLOAT", Double.class); + inner.put("DOUBLE", Double.class); + inner.put("DATE", java.sql.Date.class); + inner.put("TIME", Time.class); + inner.put("TIMESTAMP", Timestamp.class); + inner.put("CLOB", Clob.class); + inner.put("BLOB", Blob.class); + inner.put("BOOLEAN", Boolean.class); + inner.put("BOOL", Boolean.class); + + //MySQL Specific mappings + inner.put("YEAR", Integer.class); + + //PostgreSQL specific mappings + inner.put("UUID", UUID.class); + + installer.accept(inner); + assertJavaTypesKnown(); } public void addRule(Rule rule) { @@ -106,43 +143,7 @@ public Class get(String key) { return inner.get(key); } - /** - * Sets up the java type map for this database type - * @see http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html - */ - @ExecuteBefore(INITIALIZED) - final void setupJavaTypeMap() { - inner.put("CHAR", String.class); - inner.put("VARCHAR", String.class); - inner.put("LONGVARCHAR", String.class); - inner.put("LONGVARCHAR", String.class); - inner.put("NUMERIC", BigDecimal.class); - inner.put("DECIMAL", BigDecimal.class); - inner.put("BIT", Integer.class); /// - inner.put("TINYINT", Byte.class); - inner.put("SMALLINT", Short.class); - inner.put("INTEGER", Integer.class); - inner.put("BIGINT", Long.class); - inner.put("REAL", Float.class); - inner.put("FLOAT", Double.class); - inner.put("DOUBLE", Double.class); - inner.put("DATE", java.sql.Date.class); - inner.put("TIME", Time.class); - inner.put("TIMESTAMP", Timestamp.class); - inner.put("CLOB", Clob.class); - inner.put("BLOB", Blob.class); - inner.put("BOOLEAN", Boolean.class); - inner.put("BOOL", Boolean.class); - - //MySQL Specific mappings - inner.put("YEAR", Integer.class); - - //PostgreSQL specific mappings - inner.put("UUID", UUID.class); - } - - @ExecuteBefore(CREATED) - void assertJavaTypesKnown() { + private void assertJavaTypesKnown() { final Map> unmapped = new LinkedHashMap<>(); inner.entrySet().stream().forEach((entry) -> { diff --git a/runtime/src/main/java/com/speedment/runtime/internal/db/mysql/MySqlDbmsMetadataHandler.java b/runtime/src/main/java/com/speedment/runtime/internal/db/mysql/MySqlDbmsMetadataHandler.java index 9bcf465efb..f9f38dca4c 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/db/mysql/MySqlDbmsMetadataHandler.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/db/mysql/MySqlDbmsMetadataHandler.java @@ -16,8 +16,7 @@ */ package com.speedment.runtime.internal.db.mysql; -import com.speedment.common.injector.annotation.Execute; -import com.speedment.common.injector.annotation.Inject; +import com.speedment.runtime.db.DbmsMetadataHandler; import com.speedment.runtime.internal.db.AbstractDbmsMetadataHandler; import com.speedment.runtime.internal.db.JavaTypeMap; import java.sql.Blob; @@ -32,9 +31,11 @@ * @since 2.0.0 */ public final class MySqlDbmsMetadataHandler extends AbstractDbmsMetadataHandler { - - @Execute - void installCustomTypes(@Inject JavaTypeMap javaTypeMap) { + + @Override + protected JavaTypeMap newJavaTypeMap() { + final JavaTypeMap javaTypeMap = super.newJavaTypeMap(); + javaTypeMap.put("YEAR", Integer.class); javaTypeMap.put("JSON", String.class); @@ -48,6 +49,7 @@ void installCustomTypes(@Inject JavaTypeMap javaTypeMap) { return Optional.of(Boolean.class); } else return Optional.empty(); }); + + return javaTypeMap; } - -} +} \ No newline at end of file diff --git a/runtime/src/main/java/com/speedment/runtime/internal/db/postgresql/PostgresqlDbmsMetadataHandler.java b/runtime/src/main/java/com/speedment/runtime/internal/db/postgresql/PostgresqlDbmsMetadataHandler.java index b3fac86e67..f372c6b3db 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/db/postgresql/PostgresqlDbmsMetadataHandler.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/db/postgresql/PostgresqlDbmsMetadataHandler.java @@ -16,8 +16,6 @@ */ package com.speedment.runtime.internal.db.postgresql; -import com.speedment.common.injector.annotation.Execute; -import com.speedment.common.injector.annotation.Inject; import com.speedment.runtime.config.Column; import com.speedment.runtime.db.metadata.ColumnMetaData; import com.speedment.runtime.internal.db.AbstractDbmsMetadataHandler; @@ -33,14 +31,18 @@ */ public final class PostgresqlDbmsMetadataHandler extends AbstractDbmsMetadataHandler { - @Execute - void installCustomTypes(@Inject JavaTypeMap javaTypeMap) { + @Override + protected JavaTypeMap newJavaTypeMap() { + final JavaTypeMap javaTypeMap = super.newJavaTypeMap(); + javaTypeMap.addRule((sqlTypeMapping, md) -> { // Map a BIT(1) to boolean if ("BIT".equalsIgnoreCase(md.getTypeName()) && md.getColumnSize() == 1) { return Optional.of(Boolean.class); } else return Optional.empty(); }); + + return javaTypeMap; } @Override diff --git a/runtime/src/main/java/com/speedment/runtime/internal/manager/sql/AbstractSqlManager.java b/runtime/src/main/java/com/speedment/runtime/internal/manager/sql/AbstractSqlManager.java index 3c4f49cc2b..25be37b2be 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/manager/sql/AbstractSqlManager.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/manager/sql/AbstractSqlManager.java @@ -16,10 +16,13 @@ */ package com.speedment.runtime.internal.manager.sql; +import com.speedment.common.injector.State; +import static com.speedment.common.injector.State.INITIALIZED; import static com.speedment.common.injector.State.RESOLVED; import com.speedment.common.injector.annotation.ExecuteBefore; import com.speedment.common.injector.annotation.Inject; import com.speedment.runtime.component.DbmsHandlerComponent; +import com.speedment.runtime.component.ManagerComponent; import com.speedment.runtime.component.ProjectComponent; import com.speedment.runtime.component.resultset.ResultSetMapperComponent; import com.speedment.runtime.config.Column; @@ -102,6 +105,11 @@ protected AbstractSqlManager() { this.hasPrimaryKeyColumns = primaryKeyFields().findAny().isPresent(); } + @ExecuteBefore(INITIALIZED) + void addToManager(@Inject(INITIALIZED) ManagerComponent managers) { + managers.put(this); + } + @ExecuteBefore(RESOLVED) void createFieldTraitMap() { final Project project = projectComponent.getProject(); diff --git a/runtime/src/main/java/com/speedment/runtime/internal/runtime/AbstractApplicationBuilder.java b/runtime/src/main/java/com/speedment/runtime/internal/runtime/AbstractApplicationBuilder.java index d6bc6c99e1..fbe29290e7 100644 --- a/runtime/src/main/java/com/speedment/runtime/internal/runtime/AbstractApplicationBuilder.java +++ b/runtime/src/main/java/com/speedment/runtime/internal/runtime/AbstractApplicationBuilder.java @@ -47,7 +47,10 @@ import java.util.function.BiConsumer; import static com.speedment.runtime.internal.util.document.DocumentUtil.relativeName; import static com.speedment.runtime.util.NullUtil.requireNonNulls; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import static java.util.Objects.requireNonNull; +import java.util.function.Function; /** * This abstract class is implemented by classes that can build a @@ -74,15 +77,13 @@ public abstract class AbstractApplicationBuilder< private boolean checkDatabaseConnectivity; private boolean validateRuntimeConfig; - @SuppressWarnings("varargs") protected AbstractApplicationBuilder( Class applicationImplClass, - Class metadataClass, - Class>... managerClasses) { + Class metadataClass) { this(Injector.builder() - .canInject(applicationImplClass, metadataClass) - .canInject(managerClasses) + .canInject(applicationImplClass) + .canInject(metadataClass) ); } @@ -213,15 +214,13 @@ public BUILDER withConnectionUrl(String dbmsName, String connectionUrl) { @Override public BUILDER with(Class componentImplType) { - requireNonNull(componentImplType); - injector.canInject(componentImplType); + withInjectable(injector, componentImplType, Component::getComponentClass); return self(); } @Override public > BUILDER withManager(Class managerImplType) { - requireNonNull(managerImplType); - injector.canInject(managerImplType); + withInjectable(injector, managerImplType, M::getEntityClass); return self(); } @@ -340,4 +339,24 @@ protected void printWelcomeMessage(Injector injector) { LOGGER.warn("This version is NOT INTENDED FOR PRODUCTION USE!"); } } + + private static void withInjectable(Injector.Builder injector, Class injectableImplType, Function> keyExtractor) { + requireNonNull(injectableImplType); + + final T injectable; + try { + final Constructor constructor = injectableImplType.getDeclaredConstructor(); + constructor.setAccessible(true); + injectable = constructor.newInstance(); + } catch (InstantiationException + | IllegalAccessException + | NoSuchMethodException + | InvocationTargetException ex) { + + throw new SpeedmentException(ex); + } + + final Class key = keyExtractor.apply(injectable); + injector.canInject(key.getName(), injectableImplType); + } } \ No newline at end of file