From 5dbc528c41ecb3ffb79797aa3cf8dd59009347d1 Mon Sep 17 00:00:00 2001 From: Shaun Francis Date: Mon, 11 Sep 2017 14:40:38 +0100 Subject: [PATCH] Add PluginContext for generator plugins --- .../utils/GeneratorFactoryBuilder.java | 15 +++--- .../pojo/integration/utils/GeneratorUtil.java | 15 +++++- .../generation/SchemaPojoGenerator.java | 5 +- .../pojo/generators/ClassGenerator.java | 15 +++--- .../pojo/generators/JavaGeneratorFactory.java | 13 ++--- .../classgenerator/ClassGeneratorPlugin.java | 7 +-- .../classgenerator/EventAnnotationPlugin.java | 9 +--- .../classgenerator/FieldAndMethodPlugin.java | 10 ++-- .../plugin/classgenerator/PluginContext.java | 30 +++++++++++ .../classgenerator/SerializablePlugin.java | 7 +-- .../classgenerator/builder/BuilderPlugin.java | 10 ++-- .../pojo/generators/ClassGeneratorTest.java | 23 +++----- .../generators/JavaGeneratorFactoryTest.java | 12 +++-- .../EventAnnotationPluginTest.java | 28 ++-------- .../FieldAndMethodPluginTest.java | 25 ++++----- .../classgenerator/PluginContextTest.java | 53 +++++++++++++++++++ .../SerializablePluginTest.java | 15 ++---- .../builder/BuilderPluginTest.java | 13 ++--- 18 files changed, 167 insertions(+), 138 deletions(-) create mode 100644 pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContext.java create mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContextTest.java diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorFactoryBuilder.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorFactoryBuilder.java index 3c22188..aaf0a53 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorFactoryBuilder.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorFactoryBuilder.java @@ -3,14 +3,13 @@ import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.generators.ClassNameFactory; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; -import uk.gov.justice.generation.pojo.generators.TypeNameProvider; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; -import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor; public class GeneratorFactoryBuilder { private GenerationContext generationContext; private PluginProvider pluginProvider; + private ClassNameFactory classNameFactory; public GeneratorFactoryBuilder withGenerationContext(final GenerationContext generationContext) { this.generationContext = generationContext; @@ -22,6 +21,11 @@ public GeneratorFactoryBuilder withPluginProvider(final PluginProvider pluginPro return this; } + public GeneratorFactoryBuilder withClassNameFactory(final ClassNameFactory classNameFactory) { + this.classNameFactory = classNameFactory; + return this; + } + public JavaGeneratorFactory build() { if (generationContext == null) { @@ -32,10 +36,9 @@ public JavaGeneratorFactory build() { throw new RuntimeException("Please set the PluginProvider before calling build()"); } - - final TypeNameProvider typeNameProvider = new TypeNameProvider(generationContext); - final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider); - final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor); + if (classNameFactory == null) { + throw new RuntimeException("Please set the ClassNameFactory before calling build()"); + } return new JavaGeneratorFactory(classNameFactory); } diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorUtil.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorUtil.java index b2e48fc..41e1325 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorUtil.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/GeneratorUtil.java @@ -6,9 +6,13 @@ import uk.gov.justice.generation.io.files.loader.SchemaLoader; import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.core.NameGenerator; +import uk.gov.justice.generation.pojo.generators.ClassNameFactory; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; +import uk.gov.justice.generation.pojo.generators.TypeNameProvider; import uk.gov.justice.generation.pojo.generators.plugin.DefaultPluginProvider; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; +import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import uk.gov.justice.generation.pojo.visitable.Visitable; import uk.gov.justice.generation.pojo.visitable.VisitableFactory; import uk.gov.justice.generation.pojo.visitable.acceptor.AcceptorService; @@ -47,7 +51,7 @@ public List> generateAndCompileJavaSource(final File jsonSchemaFile, final String packageName, final OutputDirectories outputDirectories, final List ignoredClassNames) { - + final GenerationContext generationContext = new GenerationContext( outputDirectories.getSourceOutputDirectory(), packageName, @@ -68,13 +72,20 @@ public List> generateAndCompileJavaSource(final File jsonSchemaFile, final GeneratorFactoryBuilder generatorFactoryBuilder = new GeneratorFactoryBuilder(); final PluginProvider pluginProvider = new DefaultPluginProvider(); + final TypeNameProvider typeNameProvider = new TypeNameProvider(generationContext); + final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider); + final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor); + final JavaGeneratorFactory javaGeneratorFactory = generatorFactoryBuilder .withGenerationContext(generationContext) .withPluginProvider(pluginProvider) + .withClassNameFactory(classNameFactory) .build(); + final PluginContext pluginContext = new PluginContext(javaGeneratorFactory, classNameFactory, generationContext.getSourceFilename()); + return javaGeneratorFactory - .createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions(), pluginProvider, generationContext) + .createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions(), pluginProvider, pluginContext, generationContext) .stream() .map(classGeneratable -> { sourceWriter.write(classGeneratable, generationContext); diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaPojoGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaPojoGenerator.java index 902b8ae..b7e4824 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaPojoGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaPojoGenerator.java @@ -12,6 +12,7 @@ import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; import uk.gov.justice.generation.pojo.generators.plugin.PluginProviderFactory; import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import uk.gov.justice.generation.pojo.visitable.VisitableFactory; import uk.gov.justice.generation.pojo.visitable.acceptor.DefaultAcceptorService; import uk.gov.justice.generation.pojo.visitor.DefaultDefinitionFactory; @@ -86,10 +87,10 @@ private List getClassGeneratorsFrom( final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider); final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor); - final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(classNameFactory); + final PluginContext pluginContext = new PluginContext(javaGeneratorFactory, classNameFactory, generationContext.getSourceFilename()); - return javaGeneratorFactory.createClassGeneratorsFor(definitions, pluginProvider, generationContext); + return javaGeneratorFactory.createClassGeneratorsFor(definitions, pluginProvider, pluginContext, generationContext); } private void writeJavaClassesToFile(final GenerationContext generationContext, final List classGenerators) { diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java index 9d0d6df..ed59615 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java @@ -3,9 +3,9 @@ import static com.squareup.javapoet.TypeSpec.classBuilder; import static javax.lang.model.element.Modifier.PUBLIC; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.TypeSpec; @@ -15,20 +15,17 @@ public class ClassGenerator implements ClassGeneratable { private final ClassDefinition classDefinition; private final ClassNameFactory classNameFactory; - private final JavaGeneratorFactory javaGeneratorFactory; private final PluginProvider pluginProvider; - private final GenerationContext generationContext; + private final PluginContext pluginContext; public ClassGenerator(final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final PluginProvider pluginProvider, final ClassNameFactory classNameFactory, - final GenerationContext generationContext) { + final PluginProvider pluginProvider, + final PluginContext pluginContext) { this.classDefinition = classDefinition; this.classNameFactory = classNameFactory; - this.javaGeneratorFactory = javaGeneratorFactory; this.pluginProvider = pluginProvider; - this.generationContext = generationContext; + this.pluginContext = pluginContext; } @Override @@ -38,7 +35,7 @@ public TypeSpec generate() { .addModifiers(PUBLIC); pluginProvider.pluginClassGenerators().forEach(plugin -> - plugin.generateWith(typeSpecBuilder, classDefinition, javaGeneratorFactory, classNameFactory, generationContext)); + plugin.generateWith(typeSpecBuilder, classDefinition, pluginContext)); return typeSpecBuilder.build(); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java index d01d95b..b7c495e 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java @@ -9,6 +9,7 @@ import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import java.util.List; @@ -31,11 +32,12 @@ public ElementGeneratable createGeneratorFor(final Definition definition) { public List createClassGeneratorsFor(final List definitions, final PluginProvider pluginProvider, + final PluginContext pluginContext, final GenerationContext generationContext) { return definitions.stream() .filter(this::isClassOrEnum) .filter(definition -> isNotHardCoded(definition, generationContext.getIgnoredClassNames())) - .map(definition -> getClassGeneratable(pluginProvider, generationContext, definition)) + .map(definition -> getClassGeneratable(pluginProvider, pluginContext, definition)) .collect(toList()); } @@ -45,12 +47,12 @@ private boolean isClassOrEnum(final Definition definition) { private boolean isNotHardCoded(final Definition definition, final List hardCodedClassNames) { final String className = capitalize(definition.getFieldName()); - return ! hardCodedClassNames.contains(className); + return !hardCodedClassNames.contains(className); } private ClassGeneratable getClassGeneratable( final PluginProvider pluginProvider, - final GenerationContext generationContext, + final PluginContext pluginContext, final Definition definition) { if (definition.getClass() == EnumDefinition.class) { @@ -58,9 +60,8 @@ private ClassGeneratable getClassGeneratable( } return new ClassGenerator((ClassDefinition) definition, - this, - pluginProvider, classNameFactory, - generationContext); + pluginProvider, + pluginContext); } } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/ClassGeneratorPlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/ClassGeneratorPlugin.java index 8dd9124..892a554 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/ClassGeneratorPlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/ClassGeneratorPlugin.java @@ -1,9 +1,6 @@ package uk.gov.justice.generation.pojo.generators.plugin.classgenerator; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import com.squareup.javapoet.TypeSpec; @@ -11,7 +8,5 @@ public interface ClassGeneratorPlugin { TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final ClassNameFactory classNameFactory, - final GenerationContext generationContext); + final PluginContext pluginContext); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPlugin.java index 0ebdb32..aea7056 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPlugin.java @@ -3,10 +3,7 @@ import static uk.gov.justice.generation.pojo.dom.DefinitionType.ROOT; import uk.gov.justice.domain.annotation.Event; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.TypeSpec; @@ -19,13 +16,11 @@ public class EventAnnotationPlugin implements ClassGeneratorPlugin { @Override public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final ClassNameFactory classNameFactory, - final GenerationContext generationContext) { + final PluginContext pluginContext) { if (ROOT.equals(classDefinition.type())) { - final String eventName = removeFileExtensionFrom(generationContext.getSourceFilename()); + final String eventName = removeFileExtensionFrom(pluginContext.getSourceFilename()); typeSpecBuilder.addAnnotation(AnnotationSpec.builder(Event.class) .addMember("value", "$S", eventName) diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPlugin.java index f38bac5..1b02f4b 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPlugin.java @@ -5,13 +5,11 @@ import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PUBLIC; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.Definition; import uk.gov.justice.generation.pojo.generators.AdditionalPropertiesGenerator; import uk.gov.justice.generation.pojo.generators.ClassNameFactory; import uk.gov.justice.generation.pojo.generators.ElementGeneratable; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import java.util.List; @@ -28,15 +26,13 @@ public class FieldAndMethodPlugin implements ClassGeneratorPlugin { @Override public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final ClassNameFactory classNameFactory, - final GenerationContext generationContext) { + final PluginContext pluginContext) { final List fieldDefinitions = classDefinition.getFieldDefinitions(); final List fieldGenerators = fieldDefinitions .stream() - .map(javaGeneratorFactory::createGeneratorFor) + .map(pluginContext.getJavaGeneratorFactory()::createGeneratorFor) .collect(toList()); final List fields = fieldGenerators @@ -49,7 +45,7 @@ public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, .flatMap(ElementGeneratable::generateMethods) .collect(toList()); - typeSpecBuilder.addMethod(buildConstructor(fieldDefinitions, classNameFactory)) + typeSpecBuilder.addMethod(buildConstructor(fieldDefinitions, pluginContext.getClassNameFactory())) .addFields(fields) .addMethods(methods); diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContext.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContext.java new file mode 100644 index 0000000..cad8e22 --- /dev/null +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContext.java @@ -0,0 +1,30 @@ +package uk.gov.justice.generation.pojo.generators.plugin.classgenerator; + +import uk.gov.justice.generation.pojo.generators.ClassNameFactory; +import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; + +public class PluginContext { + private final JavaGeneratorFactory generatorFactory; + private final ClassNameFactory classNameFactory; + private final String sourceFilename; + + public PluginContext(final JavaGeneratorFactory generatorFactory, + final ClassNameFactory classNameFactory, + final String sourceFilename) { + this.generatorFactory = generatorFactory; + this.classNameFactory = classNameFactory; + this.sourceFilename = sourceFilename; + } + + public JavaGeneratorFactory getJavaGeneratorFactory() { + return generatorFactory; + } + + public ClassNameFactory getClassNameFactory() { + return classNameFactory; + } + + public String getSourceFilename() { + return sourceFilename; + } +} diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePlugin.java index 8fcc2ec..7795843 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePlugin.java @@ -5,10 +5,7 @@ import static javax.lang.model.element.Modifier.PRIVATE; import static javax.lang.model.element.Modifier.STATIC; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import java.io.Serializable; @@ -23,9 +20,7 @@ public class SerializablePlugin implements ClassGeneratorPlugin { @Override public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final ClassNameFactory classNameFactory, - final GenerationContext generationContext) { + final PluginContext pluginContext) { typeSpecBuilder.addSuperinterface(Serializable.class) .addField(FieldSpec diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPlugin.java index cc7436c..1d3fe55 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPlugin.java @@ -1,10 +1,8 @@ package uk.gov.justice.generation.pojo.generators.plugin.classgenerator.builder; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.ClassGeneratorPlugin; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; @@ -21,13 +19,11 @@ public BuilderPlugin(final BuilderGeneratorFactory builderGeneratorFactory) { public TypeSpec.Builder generateWith( final TypeSpec.Builder outerClassBuilder, final ClassDefinition classDefinition, - final JavaGeneratorFactory javaGeneratorFactory, - final ClassNameFactory classNameFactory, - final GenerationContext generationContext) { + final PluginContext pluginContext) { final BuilderGenerator builderGenerator = builderGeneratorFactory.create( classDefinition, - classNameFactory); + pluginContext.getClassNameFactory()); final TypeSpec innerClassBuilder = builderGenerator.generate(); final MethodSpec staticGetBuilderMethod = builderGenerator.generateStaticGetBuilderMethod(); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java index 48074db..06ac260 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java @@ -11,10 +11,10 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.ClassGeneratorPlugin; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.TypeSpec; @@ -30,9 +30,6 @@ public class ClassGeneratorTest { @Mock private ClassDefinition classDefinition; - @Mock - private JavaGeneratorFactory javaGeneratorFactory; - @Mock private PluginProvider pluginProvider; @@ -40,20 +37,18 @@ public class ClassGeneratorTest { private ClassNameFactory classNameFactory; @Mock - private GenerationContext generationContext; + private PluginContext pluginContext; @InjectMocks private ClassGenerator classGenerator; @Test - public void shouldCaplitalizeTheFieldNameToUseAsTheClassName() throws Exception { + public void shouldReturnCorrectSimpleClassNameForGenerator() throws Exception { final ClassName className = get(AlcubierreDrive.class); when(pluginProvider.pluginClassGenerators()).thenReturn(emptyList()); when(classNameFactory.createClassNameFrom(classDefinition)).thenReturn(className); - classGenerator.generate(); - assertThat(classGenerator.getSimpleClassName(), is("AlcubierreDrive")); } @@ -75,21 +70,15 @@ public void shouldGenerateAnEmptyClassAndUseThePluginsToGenerateTheClassInternal verify(plugin_1).generateWith( any(TypeSpec.Builder.class), eq(classDefinition), - eq(javaGeneratorFactory), - eq(classNameFactory), - eq(generationContext)); + eq(pluginContext)); verify(plugin_2).generateWith( any(TypeSpec.Builder.class), eq(classDefinition), - eq(javaGeneratorFactory), - eq(classNameFactory), - eq(generationContext)); + eq(pluginContext)); verify(plugin_3).generateWith( any(TypeSpec.Builder.class), eq(classDefinition), - eq(javaGeneratorFactory), - eq(classNameFactory), - eq(generationContext)); + eq(pluginContext)); } private class AlcubierreDrive { diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java index 8b0e827..d6ea1c8 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java @@ -16,6 +16,7 @@ import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import java.util.List; @@ -33,6 +34,9 @@ public class JavaGeneratorFactoryTest { @Mock private GenerationContext generationContext; + @Mock + private PluginContext pluginContext; + @Mock private PluginProvider pluginProvider; @@ -68,7 +72,7 @@ public void shouldReturnListOfClassGeneratorAndEnumGeneratorForClassDefinitionAn new EnumDefinition("test2", emptyList())); final List classGeneratables = new JavaGeneratorFactory(classNameFactory) - .createClassGeneratorsFor(classDefinitions, pluginProvider, generationContext); + .createClassGeneratorsFor(classDefinitions, pluginProvider, pluginContext, generationContext); assertThat(classGeneratables.size(), is(2)); assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class))); @@ -83,7 +87,7 @@ public void shouldReturnEmptyListIfClassesAreAlreadyCreated() throws Exception { when(generationContext.getIgnoredClassNames()).thenReturn(asList("Test1", "Test2")); final List classGeneratables = new JavaGeneratorFactory(classNameFactory) - .createClassGeneratorsFor(classDefinitions, pluginProvider, generationContext); + .createClassGeneratorsFor(classDefinitions, pluginProvider, pluginContext, generationContext); assertThat(classGeneratables.size(), is(0)); } @@ -91,7 +95,7 @@ public void shouldReturnEmptyListIfClassesAreAlreadyCreated() throws Exception { @Test public void shouldReturnEmptyListForEmptyListOfDefinitions() throws Exception { final List classGeneratables = new JavaGeneratorFactory(classNameFactory) - .createClassGeneratorsFor(emptyList(), pluginProvider, generationContext); + .createClassGeneratorsFor(emptyList(), pluginProvider, pluginContext, generationContext); assertThat(classGeneratables.isEmpty(), is(true)); } @@ -107,7 +111,7 @@ public void shouldIgnoreDefinitionsThatAreNotClassDefinitionOrEnumDefinition() t ); final List classGeneratables = new JavaGeneratorFactory(classNameFactory) - .createClassGeneratorsFor(classDefinitions, pluginProvider, generationContext); + .createClassGeneratorsFor(classDefinitions, pluginProvider, pluginContext, generationContext); assertThat(classGeneratables.size(), is(2)); assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class))); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPluginTest.java index 87e9ca6..7927e8f 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPluginTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/EventAnnotationPluginTest.java @@ -11,10 +11,7 @@ import static uk.gov.justice.generation.pojo.dom.DefinitionType.ROOT; import uk.gov.justice.domain.annotation.Event; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import com.squareup.javapoet.TypeSpec; import org.junit.Test; @@ -26,19 +23,13 @@ public class EventAnnotationPluginTest { @Mock - private JavaGeneratorFactory generatorFactory; - - @Mock - private ClassNameFactory classNameFactory; - - @Mock - private GenerationContext generationContext; + private PluginContext pluginContext; @Test public void shouldAddEventAnnotationToTypeSpecIfRoot() throws Exception { final ClassDefinition classDefinition = new ClassDefinition(ROOT, "address"); - when(generationContext.getSourceFilename()).thenReturn("example.events.address.json"); + when(pluginContext.getSourceFilename()).thenReturn("example.events.address.json"); final TypeSpec.Builder typeSpecBuilder = classBuilder("ClassName"); @@ -46,9 +37,7 @@ public void shouldAddEventAnnotationToTypeSpecIfRoot() throws Exception { .generateWith( typeSpecBuilder, classDefinition, - generatorFactory, - classNameFactory, - generationContext); + pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); @@ -59,9 +48,6 @@ public void shouldAddEventAnnotationToTypeSpecIfRoot() throws Exception { .build())); assertThat(typeSpec.fieldSpecs.size(), is(0)); assertThat(typeSpec.methodSpecs.size(), is(0)); - - verifyZeroInteractions(generatorFactory); - verifyZeroInteractions(classNameFactory); } @Test @@ -73,9 +59,7 @@ public void shouldNotAddEventAnnotationToNonRoot() throws Exception { .generateWith( typeSpecBuilder, classDefinition, - generatorFactory, - classNameFactory, - generationContext); + pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); @@ -84,8 +68,6 @@ public void shouldNotAddEventAnnotationToNonRoot() throws Exception { assertThat(typeSpec.fieldSpecs.size(), is(0)); assertThat(typeSpec.methodSpecs.size(), is(0)); - verifyZeroInteractions(generatorFactory); - verifyZeroInteractions(classNameFactory); - verifyZeroInteractions(generationContext); + verifyZeroInteractions(pluginContext); } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPluginTest.java index 82f3180..be547f3 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPluginTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/FieldAndMethodPluginTest.java @@ -15,7 +15,6 @@ import static uk.gov.justice.generation.pojo.dom.DefinitionType.CLASS; import static uk.gov.justice.generation.pojo.dom.DefinitionType.STRING; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; import uk.gov.justice.generation.pojo.generators.ClassNameFactory; @@ -44,7 +43,7 @@ public class FieldAndMethodPluginTest { private ClassNameFactory classNameFactory; @Mock - private GenerationContext generationContext; + private PluginContext pluginContext; @Test public void shouldGenerateTypeSpecForClassDefinitionWithNoFields() throws Exception { @@ -52,13 +51,13 @@ public void shouldGenerateTypeSpecForClassDefinitionWithNoFields() throws Except final TypeSpec.Builder typeSpecBuilder = classBuilder("ClassName"); + when(pluginContext.getJavaGeneratorFactory()).thenReturn(generatorFactory); + new FieldAndMethodPlugin() .generateWith( typeSpecBuilder, classDefinition, - generatorFactory, - classNameFactory, - generationContext); + pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); @@ -71,8 +70,6 @@ public void shouldGenerateTypeSpecForClassDefinitionWithNoFields() throws Except @Test public void shouldGenerateTypeSpecForClassDefinitionWithOneField() throws Exception { - final JavaGeneratorFactory generatorFactory = mock(JavaGeneratorFactory.class); - final ClassNameFactory classNameFactory = mock(ClassNameFactory.class); final ClassDefinition classDefinition = new ClassDefinition(CLASS, "address"); final FieldDefinition fieldDefinition = new FieldDefinition(STRING, "field"); classDefinition.addFieldDefinition(fieldDefinition); @@ -86,6 +83,8 @@ public void shouldGenerateTypeSpecForClassDefinitionWithOneField() throws Except final FieldGenerator fieldGenerator = mock(FieldGenerator.class); + when(pluginContext.getJavaGeneratorFactory()).thenReturn(generatorFactory); + when(pluginContext.getClassNameFactory()).thenReturn(classNameFactory); when(generatorFactory.createGeneratorFor(fieldDefinition)).thenReturn(fieldGenerator); when(fieldGenerator.generateField()).thenReturn(fieldSpec); when(fieldGenerator.generateMethods()).thenReturn(Stream.of(methodSpec)); @@ -97,9 +96,7 @@ public void shouldGenerateTypeSpecForClassDefinitionWithOneField() throws Except .generateWith( typeSpecBuilder, classDefinition, - generatorFactory, - classNameFactory, - generationContext); + pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); @@ -119,20 +116,18 @@ public void shouldGenerateTypeSpecForClassDefinitionWithOneField() throws Except @Test public void shouldGenerateTypeSpecForClassDefinitionWithAdditionalProperties() throws Exception { - final JavaGeneratorFactory generatorFactory = mock(JavaGeneratorFactory.class); - final ClassNameFactory classNameFactory = mock(ClassNameFactory.class); final ClassDefinition classDefinition = new ClassDefinition(CLASS, "address"); classDefinition.setAllowAdditionalProperties(true); + when(pluginContext.getJavaGeneratorFactory()).thenReturn(generatorFactory); + final TypeSpec.Builder typeSpecBuilder = classBuilder("ClassName"); new FieldAndMethodPlugin() .generateWith( typeSpecBuilder, classDefinition, - generatorFactory, - classNameFactory, - generationContext); + pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContextTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContextTest.java new file mode 100644 index 0000000..4452c6a --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/PluginContextTest.java @@ -0,0 +1,53 @@ +package uk.gov.justice.generation.pojo.generators.plugin.classgenerator; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +import uk.gov.justice.generation.pojo.generators.ClassNameFactory; +import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; + +import org.junit.Test; + +public class PluginContextTest { + + private static final JavaGeneratorFactory UNSPECIFIED_GENERATOR_FACTORY = null; + private static final ClassNameFactory UNSPECIFIED_CLASS_NAME_FACTORY = null; + private static final String BLANK = ""; + + @Test + public void shouldReturnJavaGeneratorFactory() throws Exception { + final JavaGeneratorFactory generatorFactory = mock(JavaGeneratorFactory.class); + + final PluginContext pluginContext = new PluginContext( + generatorFactory, + UNSPECIFIED_CLASS_NAME_FACTORY, + BLANK); + + assertThat(pluginContext.getJavaGeneratorFactory(), is(generatorFactory)); + } + + @Test + public void shouldReturnClassNameFactory() throws Exception { + final ClassNameFactory classNameFactory = mock(ClassNameFactory.class); + + final PluginContext pluginContext = new PluginContext( + UNSPECIFIED_GENERATOR_FACTORY, + classNameFactory, + BLANK); + + assertThat(pluginContext.getClassNameFactory(), is(classNameFactory)); + } + + @Test + public void shouldReturnSourceFilename() throws Exception { + final String sourceFilename = "sourceFilename"; + + final PluginContext pluginContext = new PluginContext( + UNSPECIFIED_GENERATOR_FACTORY, + UNSPECIFIED_CLASS_NAME_FACTORY, + sourceFilename); + + assertThat(pluginContext.getSourceFilename(), is(sourceFilename)); + } +} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePluginTest.java index 57d5576..f25b796 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePluginTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/SerializablePluginTest.java @@ -10,10 +10,7 @@ import static org.mockito.Mockito.verifyZeroInteractions; import static uk.gov.justice.generation.pojo.dom.DefinitionType.CLASS; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import java.io.Serializable; @@ -29,13 +26,7 @@ public class SerializablePluginTest { @Mock - private JavaGeneratorFactory generatorFactory; - - @Mock - private ClassNameFactory classNameFactory; - - @Mock - private GenerationContext generationContext; + private PluginContext pluginContext; @Test public void shouldAddSerializationToTypeSpec() throws Exception { @@ -43,7 +34,7 @@ public void shouldAddSerializationToTypeSpec() throws Exception { final TypeSpec.Builder typeSpecBuilder = classBuilder("ClassName"); - new SerializablePlugin().generateWith(typeSpecBuilder, classDefinition, generatorFactory, classNameFactory, generationContext); + new SerializablePlugin().generateWith(typeSpecBuilder, classDefinition, pluginContext); final TypeSpec typeSpec = typeSpecBuilder.build(); @@ -53,6 +44,6 @@ public void shouldAddSerializationToTypeSpec() throws Exception { .builder(TypeName.LONG, "serialVersionUID", PRIVATE, STATIC, FINAL) .initializer("1L").build())); - verifyZeroInteractions(generatorFactory); + verifyZeroInteractions(pluginContext); } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPluginTest.java index 93be50a..4824fcc 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPluginTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classgenerator/builder/BuilderPluginTest.java @@ -6,10 +6,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.generators.ClassNameFactory; -import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; +import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; @@ -32,18 +31,17 @@ public class BuilderPluginTest { public void shouldGenerateTheBuilderAsAnInnerClassAndAddToTheMainClassTypeSpec() throws Exception { final String fieldName = "alcubierreDrive"; - final String packageName = "org.bloggs.fred"; final TypeSpec innerClassBuilder = TypeSpec.classBuilder("Builder").build(); final MethodSpec staticGetBuilderMethod = MethodSpec.methodBuilder("alcubierreDrive").build(); final TypeSpec.Builder outerClassBuilder = TypeSpec.classBuilder("MyClass"); final ClassDefinition classDefinition = mock(ClassDefinition.class); - final JavaGeneratorFactory javaGeneratorFactory = mock(JavaGeneratorFactory.class); final ClassNameFactory classNameFactory = mock(ClassNameFactory.class); - final GenerationContext generationContext = mock(GenerationContext.class); final BuilderGenerator builderGenerator = mock(BuilderGenerator.class); + final PluginContext pluginContext = mock(PluginContext.class); + when(pluginContext.getClassNameFactory()).thenReturn(classNameFactory); when(classDefinition.getFieldName()).thenReturn(fieldName); when(builderGeneratorFactory.create( classDefinition, @@ -55,10 +53,7 @@ public void shouldGenerateTheBuilderAsAnInnerClassAndAddToTheMainClassTypeSpec() final TypeSpec.Builder builder = builderPlugin.generateWith( outerClassBuilder, classDefinition, - javaGeneratorFactory, - classNameFactory, - generationContext - ); + pluginContext); assertThat(builder, is(outerClassBuilder));