Skip to content

Commit

Permalink
Generator: Fix bugs related to @Injector
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Forslund committed Jun 10, 2016
1 parent e4128e9 commit acddb41
Show file tree
Hide file tree
Showing 14 changed files with 29 additions and 96 deletions.
Expand Up @@ -170,6 +170,8 @@ private static void printLine() {
} }


private <T> void injectFields(T instance) { private <T> void injectFields(T instance) {
requireNonNull(instance);

final Set<Field> fields = traverseFields(instance.getClass()) final Set<Field> fields = traverseFields(instance.getClass())
.filter(f -> f.isAnnotationPresent(Inject.class)) .filter(f -> f.isAnnotationPresent(Inject.class))
.collect(toSet()); .collect(toSet());
Expand Down
Expand Up @@ -21,17 +21,11 @@
import com.speedment.generator.TranslatorConstructor; import com.speedment.generator.TranslatorConstructor;
import com.speedment.generator.TranslatorDecorator; import com.speedment.generator.TranslatorDecorator;
import com.speedment.generator.TranslatorKey; import com.speedment.generator.TranslatorKey;
import com.speedment.generator.TranslatorManager;
import com.speedment.runtime.component.Component; import com.speedment.runtime.component.Component;
import com.speedment.runtime.config.trait.HasMainInterface; import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;
import com.speedment.runtime.exception.SpeedmentException; import com.speedment.runtime.exception.SpeedmentException;
import com.speedment.common.codegen.Generator;
import com.speedment.common.codegen.model.ClassOrInterface; import com.speedment.common.codegen.model.ClassOrInterface;
import com.speedment.generator.util.JavaLanguageNamer;
import com.speedment.common.mapstream.MapStream;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;


/** /**
Expand All @@ -49,20 +43,6 @@ default Class<CodeGenerationComponent> getComponentClass() {
return CodeGenerationComponent.class; return CodeGenerationComponent.class;
} }


/**
* Returns the current {@link Generator}.
*
* @return the current {@link Generator}
*/
Generator getGenerator();

/**
* Returns the current {@link TranslatorManager}.
*
* @return the current {@link TranslatorManager}
*/
TranslatorManager getTranslatorManager();

/** /**
* Puts a new {@code TranslatorConstructor} for the given class/key pair. If * Puts a new {@code TranslatorConstructor} for the given class/key pair. If
* an old TranslatorConstructor exists for the same class/key pair, it is * an old TranslatorConstructor exists for the same class/key pair, it is
Expand Down Expand Up @@ -196,15 +176,4 @@ default Class<CodeGenerationComponent> getComponentClass() {
*/ */
<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> Translator<DOC, T> <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> Translator<DOC, T>
findTranslator(DOC document, Class<T> modelType, String key) throws SpeedmentException; findTranslator(DOC document, Class<T> modelType, String key) throws SpeedmentException;

/**
* Returns the current {@link JavaLanguageNamer} used by Speedment.
*
* @return the current {@link JavaLanguageNamer}
*/
JavaLanguageNamer javaLanguageNamer();

void setJavaLanguageNamerSupplier(Supplier<? extends JavaLanguageNamer> supplier);

MapStream<Class<? extends HasMainInterface>, Set<String>> stream();
} }
Expand Up @@ -21,14 +21,12 @@
import com.speedment.generator.Translator; import com.speedment.generator.Translator;
import com.speedment.generator.TranslatorConstructor; import com.speedment.generator.TranslatorConstructor;
import com.speedment.generator.TranslatorDecorator; import com.speedment.generator.TranslatorDecorator;
import com.speedment.generator.TranslatorManager;
import com.speedment.generator.component.CodeGenerationComponent; import com.speedment.generator.component.CodeGenerationComponent;
import com.speedment.runtime.config.Project; import com.speedment.runtime.config.Project;
import com.speedment.runtime.config.Table; import com.speedment.runtime.config.Table;
import com.speedment.runtime.config.trait.HasMainInterface; import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;
import com.speedment.runtime.exception.SpeedmentException; import com.speedment.runtime.exception.SpeedmentException;
import com.speedment.common.codegen.Generator;
import com.speedment.common.codegen.internal.java.JavaGenerator; import com.speedment.common.codegen.internal.java.JavaGenerator;
import com.speedment.common.codegen.model.ClassOrInterface; import com.speedment.common.codegen.model.ClassOrInterface;
import com.speedment.common.injector.Injector; import com.speedment.common.injector.Injector;
Expand All @@ -47,7 +45,6 @@
import com.speedment.generator.internal.manager.GeneratedEntityManagerImplTranslator; import com.speedment.generator.internal.manager.GeneratedEntityManagerImplTranslator;
import com.speedment.generator.internal.manager.GeneratedEntityManagerTranslator; import com.speedment.generator.internal.manager.GeneratedEntityManagerTranslator;
import com.speedment.generator.internal.util.DefaultJavaLanguageNamer; import com.speedment.generator.internal.util.DefaultJavaLanguageNamer;
import com.speedment.generator.util.JavaLanguageNamer;
import com.speedment.runtime.internal.component.InternalOpenSourceComponent; import com.speedment.runtime.internal.component.InternalOpenSourceComponent;
import com.speedment.runtime.license.Software; import com.speedment.runtime.license.Software;
import com.speedment.common.mapstream.MapStream; import com.speedment.common.mapstream.MapStream;
Expand All @@ -59,7 +56,6 @@
import com.speedment.generator.internal.lifecycle.GeneratedApplicationTranslator; import com.speedment.generator.internal.lifecycle.GeneratedApplicationTranslator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
Expand All @@ -74,9 +70,6 @@
}) })
public final class CodeGenerationComponentImpl extends InternalOpenSourceComponent implements CodeGenerationComponent { public final class CodeGenerationComponentImpl extends InternalOpenSourceComponent implements CodeGenerationComponent {


private @Inject TranslatorManager translatorManager;
private @Inject JavaLanguageNamer javaLanguageNamer;
private @Inject Generator generator;
private @Inject Injector injector; private @Inject Injector injector;


private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorSettings<?, ?>>> map; private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorSettings<?, ?>>> map;
Expand Down Expand Up @@ -109,16 +102,6 @@ protected String getDescription() {
return "Generates java code for a project based on a model tree."; return "Generates java code for a project based on a model tree.";
} }


@Override
public Generator getGenerator() {
return generator;
}

@Override
public TranslatorManager getTranslatorManager() {
return translatorManager;
}

@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> public <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>>
Expand Down Expand Up @@ -178,22 +161,6 @@ Translator<DOC, T> findTranslator(DOC document, Class<T> modelType, String key)
.map(injector::inject); .map(injector::inject);
} }


@Override
public JavaLanguageNamer javaLanguageNamer() {
return javaLanguageNamer;
}

@Override
public void setJavaLanguageNamerSupplier(Supplier<? extends JavaLanguageNamer> supplier) {
javaLanguageNamer = supplier.get();
}

@Override
public MapStream<Class<? extends HasMainInterface>, Set<String>> stream() {
return MapStream.of(map)
.mapValue(Map::keySet);
}

@Override @Override
public Stream<Software> getDependencies() { public Stream<Software> getDependencies() {
return Stream.empty(); return Stream.empty();
Expand Down
Expand Up @@ -40,6 +40,8 @@
import com.speedment.common.codegen.internal.model.value.ReferenceValue; import com.speedment.common.codegen.internal.model.value.ReferenceValue;
import com.speedment.common.codegen.internal.model.value.TextValue; import com.speedment.common.codegen.internal.model.value.TextValue;
import static com.speedment.common.codegen.internal.util.Formatting.shortName; import static com.speedment.common.codegen.internal.util.Formatting.shortName;
import com.speedment.common.injector.Injector;
import com.speedment.common.injector.annotation.Inject;
import static com.speedment.generator.internal.DefaultJavaClassTranslator.GETTER_METHOD_PREFIX; import static com.speedment.generator.internal.DefaultJavaClassTranslator.GETTER_METHOD_PREFIX;
import static com.speedment.generator.internal.DefaultJavaClassTranslator.SETTER_METHOD_PREFIX; import static com.speedment.generator.internal.DefaultJavaClassTranslator.SETTER_METHOD_PREFIX;
import com.speedment.generator.internal.EntityAndManagerTranslator; import com.speedment.generator.internal.EntityAndManagerTranslator;
Expand All @@ -63,6 +65,7 @@
public final class GeneratedEntityTranslator extends EntityAndManagerTranslator<Interface> { public final class GeneratedEntityTranslator extends EntityAndManagerTranslator<Interface> {


public final static String IDENTIFIER_NAME = "Identifier"; public final static String IDENTIFIER_NAME = "Identifier";
private @Inject Injector injector;


public GeneratedEntityTranslator(Table table) { public GeneratedEntityTranslator(Table table) {
super(table, Interface::of); super(table, Interface::of);
Expand Down Expand Up @@ -286,7 +289,7 @@ file, getSupport().tableOrThrow(), col, getSupport().entityType(), getNamer()
final List<String> methodNames = fkStreamers.get(referencingTable); final List<String> methodNames = fkStreamers.get(referencingTable);
if (!methodNames.isEmpty()) { if (!methodNames.isEmpty()) {
final Method method = Method.of(EntityTranslatorSupport.FIND + EntityTranslatorSupport.pluralis(referencingTable, final Method method = Method.of(EntityTranslatorSupport.FIND + EntityTranslatorSupport.pluralis(referencingTable,
getNamer()), Type.of(Stream.class).add(Generic.of().add(new TranslatorSupport<>(referencingTable).entityType()))); getNamer()), Type.of(Stream.class).add(Generic.of().add(injector.inject(new TranslatorSupport<>(referencingTable)).entityType())));


method.set(Javadoc.of( method.set(Javadoc.of(
"Creates and returns a <em>distinct</em> {@link Stream} of all " + "Creates and returns a <em>distinct</em> {@link Stream} of all " +
Expand Down
Expand Up @@ -30,20 +30,18 @@
*/ */
public final class ApplicationBuilderTranslator extends DefaultJavaClassTranslator<Project, Class> { public final class ApplicationBuilderTranslator extends DefaultJavaClassTranslator<Project, Class> {


private final String className = getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationBuilder";

public ApplicationBuilderTranslator(Project project) { public ApplicationBuilderTranslator(Project project) {
super(project, Class::of); super(project, Class::of);
} }


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationBuilder";
} }


@Override @Override
protected Class makeCodeGenModel(File file) { protected Class makeCodeGenModel(File file) {
return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {
clazz.public_().final_() clazz.public_().final_()
.setSupertype(generatedBuilderType()); .setSupertype(generatedBuilderType());
Expand Down
Expand Up @@ -30,20 +30,18 @@
*/ */
public final class ApplicationImplTranslator extends DefaultJavaClassTranslator<Project, Class> { public final class ApplicationImplTranslator extends DefaultJavaClassTranslator<Project, Class> {


private final String className = getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationImpl";

public ApplicationImplTranslator(Project project) { public ApplicationImplTranslator(Project project) {
super(project, Class::of); super(project, Class::of);
} }


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationImpl";
} }


@Override @Override
protected Class makeCodeGenModel(File file) { protected Class makeCodeGenModel(File file) {
return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {
clazz.public_().final_() clazz.public_().final_()
.setSupertype(generatedImplType()) .setSupertype(generatedImplType())
Expand Down
Expand Up @@ -30,21 +30,19 @@
*/ */
public final class ApplicationTranslator extends DefaultJavaClassTranslator<Project, Interface> { public final class ApplicationTranslator extends DefaultJavaClassTranslator<Project, Interface> {


private final String className = getSupport().typeName(getSupport().projectOrThrow()) + "Application";

public ApplicationTranslator(Project project) { public ApplicationTranslator(Project project) {


super(project, Interface::of); super(project, Interface::of);
} }


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return getSupport().typeName(getSupport().projectOrThrow()) + "Application";
} }


@Override @Override
protected Interface makeCodeGenModel(File file) { protected Interface makeCodeGenModel(File file) {
return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {
clazz.public_().add(generatedType()); clazz.public_().add(generatedType());
}).build(); }).build();
Expand Down
Expand Up @@ -32,6 +32,7 @@
import static com.speedment.common.codegen.internal.model.constant.DefaultAnnotationUsage.OVERRIDE; import static com.speedment.common.codegen.internal.model.constant.DefaultAnnotationUsage.OVERRIDE;
import static com.speedment.common.codegen.internal.model.constant.DefaultJavadocTag.AUTHOR; import static com.speedment.common.codegen.internal.model.constant.DefaultJavadocTag.AUTHOR;
import static com.speedment.common.codegen.internal.model.constant.DefaultType.VOID; import static com.speedment.common.codegen.internal.model.constant.DefaultType.VOID;
import com.speedment.common.injector.Injector;
import com.speedment.common.injector.annotation.Inject; import com.speedment.common.injector.annotation.Inject;
import com.speedment.generator.internal.DefaultJavaClassTranslator; import com.speedment.generator.internal.DefaultJavaClassTranslator;
import static com.speedment.generator.internal.lifecycle.GeneratedMetadataTranslator.METADATA; import static com.speedment.generator.internal.lifecycle.GeneratedMetadataTranslator.METADATA;
Expand All @@ -53,9 +54,8 @@
*/ */
public final class GeneratedApplicationBuilderTranslator extends DefaultJavaClassTranslator<Project, Class> { public final class GeneratedApplicationBuilderTranslator extends DefaultJavaClassTranslator<Project, Class> {


private final String className = "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationBuilder";

private @Inject InfoComponent infoComponent; private @Inject InfoComponent infoComponent;
private @Inject Injector injector;


public GeneratedApplicationBuilderTranslator(Project doc) { public GeneratedApplicationBuilderTranslator(Project doc) {
super(doc, Class::of); super(doc, Class::of);
Expand All @@ -70,7 +70,7 @@ public boolean isInGeneratedPackage() {
protected Class makeCodeGenModel(File file) { protected Class makeCodeGenModel(File file) {
requireNonNull(file); requireNonNull(file);


return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {


final Map<String, List<Table>> nameMap = traverseOver(project, Table.class) final Map<String, List<Table>> nameMap = traverseOver(project, Table.class)
Expand All @@ -93,7 +93,7 @@ protected Class makeCodeGenModel(File file) {
traverseOver(project, Table.class) traverseOver(project, Table.class)
.filter(HasEnabled::test) .filter(HasEnabled::test)
.forEachOrdered(t -> { .forEachOrdered(t -> {
final TranslatorSupport<Table> support = new TranslatorSupport<>(t); final TranslatorSupport<Table> support = injector.inject(new TranslatorSupport<>(t));
final Type managerType = support.managerImplType(); final Type managerType = support.managerImplType();
final String managerName = support.managerImplName(); final String managerName = support.managerImplName();
if (ambigousNames.contains(t.getName())) { if (ambigousNames.contains(t.getName())) {
Expand Down Expand Up @@ -147,7 +147,7 @@ protected String getJavadocRepresentText() {


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationBuilder";
} }


private Type builderType() { private Type builderType() {
Expand Down
Expand Up @@ -36,15 +36,13 @@
*/ */
public final class GeneratedApplicationImplTranslator extends DefaultJavaClassTranslator<Project, Class> { public final class GeneratedApplicationImplTranslator extends DefaultJavaClassTranslator<Project, Class> {


private final String className = "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationImpl";

public GeneratedApplicationImplTranslator(Project project) { public GeneratedApplicationImplTranslator(Project project) {
super(project, Class::of); super(project, Class::of);
} }


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "ApplicationImpl";
} }


@Override @Override
Expand All @@ -54,7 +52,7 @@ public boolean isInGeneratedPackage() {


@Override @Override
protected Class makeCodeGenModel(File file) { protected Class makeCodeGenModel(File file) {
return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {
file.add(Import.of(builderType())); file.add(Import.of(builderType()));
clazz.public_() clazz.public_()
Expand Down
Expand Up @@ -31,15 +31,13 @@
*/ */
public final class GeneratedApplicationTranslator extends DefaultJavaClassTranslator<Project, Interface> { public final class GeneratedApplicationTranslator extends DefaultJavaClassTranslator<Project, Interface> {


private final String className = "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "Application";

public GeneratedApplicationTranslator(Project project) { public GeneratedApplicationTranslator(Project project) {
super(project, Interface::of); super(project, Interface::of);
} }


@Override @Override
protected String getClassOrInterfaceName() { protected String getClassOrInterfaceName() {
return className; return "Generated" + getSupport().typeName(getSupport().projectOrThrow()) + "Application";
} }


@Override @Override
Expand All @@ -49,7 +47,7 @@ public boolean isInGeneratedPackage() {


@Override @Override
protected Interface makeCodeGenModel(File file) { protected Interface makeCodeGenModel(File file) {
return newBuilder(file, className) return newBuilder(file, getClassOrInterfaceName())
.forEveryProject((clazz, project) -> { .forEveryProject((clazz, project) -> {
clazz.public_() clazz.public_()
.add(Type.of(Speedment.class)); .add(Type.of(Speedment.class));
Expand Down
Expand Up @@ -57,6 +57,7 @@
import static com.speedment.common.codegen.internal.util.Formatting.block; import static com.speedment.common.codegen.internal.util.Formatting.block;
import static com.speedment.common.codegen.internal.util.Formatting.indent; import static com.speedment.common.codegen.internal.util.Formatting.indent;
import static com.speedment.common.codegen.internal.util.Formatting.nl; import static com.speedment.common.codegen.internal.util.Formatting.nl;
import com.speedment.common.injector.Injector;
import com.speedment.common.injector.annotation.Inject; import com.speedment.common.injector.annotation.Inject;
import com.speedment.runtime.component.DbmsHandlerComponent; import com.speedment.runtime.component.DbmsHandlerComponent;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.joining;
Expand All @@ -80,6 +81,7 @@ public final class GeneratedEntityManagerImplTranslator extends EntityAndManager


private @Inject ResultSetMapperComponent resultSetMapperComponent; private @Inject ResultSetMapperComponent resultSetMapperComponent;
private @Inject DbmsHandlerComponent dbmsHandlerComponent; private @Inject DbmsHandlerComponent dbmsHandlerComponent;
private @Inject Injector injector;


public GeneratedEntityManagerImplTranslator(Table table) { public GeneratedEntityManagerImplTranslator(Table table) {
super(table, Class::of); super(table, Class::of);
Expand Down Expand Up @@ -166,7 +168,7 @@ protected Method generateGetPrimaryKeyClasses(File file) {


private String readFromResultSet(Column c, AtomicInteger position) { private String readFromResultSet(Column c, AtomicInteger position) {


final TranslatorSupport<Table> support = new TranslatorSupport<>(c.getParentOrThrow()); final TranslatorSupport<Table> support = injector.inject(new TranslatorSupport<>(c.getParentOrThrow()));
final Dbms dbms = c.getParentOrThrow().getParentOrThrow().getParentOrThrow(); final Dbms dbms = c.getParentOrThrow().getParentOrThrow().getParentOrThrow();


final ResultSetMapping<?> mapping = resultSetMapperComponent.apply( final ResultSetMapping<?> mapping = resultSetMapperComponent.apply(
Expand Down
Expand Up @@ -32,7 +32,6 @@
import com.speedment.runtime.config.mapper.identity.StringIdentityMapper; import com.speedment.runtime.config.mapper.identity.StringIdentityMapper;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;
import com.speedment.generator.internal.component.CodeGenerationComponentImpl; import com.speedment.generator.internal.component.CodeGenerationComponentImpl;
import com.speedment.runtime.internal.config.dbms.StandardDbmsTypes;
import com.speedment.runtime.internal.runtime.DefaultApplicationBuilder; import com.speedment.runtime.internal.runtime.DefaultApplicationBuilder;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.Before; import org.junit.Before;
Expand Down
Expand Up @@ -56,7 +56,7 @@ public void testPreview() {
final String code = translator.toCode(); final String code = translator.toCode();
//System.out.println(code); //System.out.println(code);


final JavaLanguageNamer javaLanguageNamer = speedment.getOrThrow(CodeGenerationComponent.class).javaLanguageNamer(); final JavaLanguageNamer javaLanguageNamer = speedment.getOrThrow(JavaLanguageNamer.class);


assertTrue(code.contains(javaLanguageNamer.javaVariableName(table.getName()))); assertTrue(code.contains(javaLanguageNamer.javaVariableName(table.getName())));
assertTrue(code.contains(javaLanguageNamer.javaTypeName(table.getName()))); assertTrue(code.contains(javaLanguageNamer.javaTypeName(table.getName())));
Expand Down

0 comments on commit acddb41

Please sign in to comment.