From 591e70a0677e8f15af7bc54a9d5fb7ae2de3dcff Mon Sep 17 00:00:00 2001 From: amckenzie Date: Tue, 12 Sep 2017 16:02:59 +0100 Subject: [PATCH] convert additional properties to be a plugin --- .../pojo/integration/utils/GeneratorUtil.java | 6 +- ...AddAdditionalPropertiesToClassPlugin.java} | 28 +++-- .../AddFieldsAndMethodsToClassPlugin.java | 14 --- .../AdditionalPropertiesGeneratorTest.java | 52 --------- ...AdditionalPropertiesToClassPluginTest.java | 102 ++++++++++++++++++ .../AddFieldsAndMethodsToClassPluginTest.java | 33 ------ 6 files changed, 127 insertions(+), 108 deletions(-) rename pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/{AdditionalPropertiesGenerator.java => plugin/classmodifying/AddAdditionalPropertiesToClassPlugin.java} (72%) delete mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGeneratorTest.java create mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPluginTest.java 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 b744504..7a6b0a1 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 @@ -14,6 +14,7 @@ import uk.gov.justice.generation.pojo.generators.plugin.ModifyingPluginProvider; 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.classmodifying.AddAdditionalPropertiesToClassPlugin; import uk.gov.justice.generation.pojo.generators.plugin.classmodifying.AddFieldsAndMethodsToClassPlugin; import uk.gov.justice.generation.pojo.generators.plugin.classmodifying.ClassModifyingPlugin; import uk.gov.justice.generation.pojo.generators.plugin.classmodifying.GenerateBuilderForClassPlugin; @@ -84,8 +85,9 @@ public List> generateAndCompileJavaSource(final File jsonSchemaFile, final List classGeneratorPlugins = asList( new MakeClassSerializablePlugin(), new AddFieldsAndMethodsToClassPlugin(), - new GenerateBuilderForClassPlugin(new BuilderGeneratorFactory() - )); + new GenerateBuilderForClassPlugin(new BuilderGeneratorFactory()), + new AddAdditionalPropertiesToClassPlugin() + ); final List typeNamePlugins = asList( new SupportJavaOptionalsPlugin(), diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPlugin.java similarity index 72% rename from pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGenerator.java rename to pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPlugin.java index 93473c2..f60f7a0 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPlugin.java @@ -1,14 +1,17 @@ -package uk.gov.justice.generation.pojo.generators; +package uk.gov.justice.generation.pojo.generators.plugin.classmodifying; import static com.squareup.javapoet.FieldSpec.builder; import static com.squareup.javapoet.MethodSpec.methodBuilder; +import static java.util.Arrays.asList; import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PRIVATE; import static javax.lang.model.element.Modifier.PUBLIC; +import uk.gov.justice.generation.pojo.dom.ClassDefinition; + import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.stream.Stream; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -18,11 +21,23 @@ import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; +import com.squareup.javapoet.TypeSpec; -public class AdditionalPropertiesGenerator implements ElementGeneratable { +public class AddAdditionalPropertiesToClassPlugin implements ClassModifyingPlugin { @Override - public FieldSpec generateField() { + public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, final PluginContext pluginContext) { + + if (classDefinition.allowAdditionalProperties()) { + typeSpecBuilder + .addField(additionalPropertiesMapField()) + .addMethods(gettersAndSetters()); + } + + return typeSpecBuilder; + } + + private FieldSpec additionalPropertiesMapField() { final ParameterizedTypeName map = ParameterizedTypeName.get( ClassName.get(Map.class), @@ -36,13 +51,12 @@ public FieldSpec generateField() { .build(); } - @Override - public Stream generateMethods() { + private List gettersAndSetters() { final MethodSpec getter = generateGetter(); final MethodSpec setter = generateSetter(); - return Stream.of(getter, setter); + return asList(getter, setter); } private MethodSpec generateGetter() { diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPlugin.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPlugin.java index c2df9c3..e1d0bdc 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPlugin.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPlugin.java @@ -7,7 +7,6 @@ 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; @@ -30,8 +29,6 @@ */ public class AddFieldsAndMethodsToClassPlugin implements ClassModifyingPlugin { - private final AdditionalPropertiesGenerator additionalPropertiesGenerator = new AdditionalPropertiesGenerator(); - @Override public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, final ClassDefinition classDefinition, @@ -58,17 +55,6 @@ public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder, .addFields(fields) .addMethods(methods); - if (classDefinition.allowAdditionalProperties()) { - - final FieldSpec additionalProperties = additionalPropertiesGenerator.generateField(); - final List gettersAndSetters = additionalPropertiesGenerator - .generateMethods() - .collect(toList()); - - typeSpecBuilder.addField(additionalProperties); - typeSpecBuilder.addMethods(gettersAndSetters); - } - return typeSpecBuilder; } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGeneratorTest.java deleted file mode 100644 index 30d5e5d..0000000 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/AdditionalPropertiesGeneratorTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package uk.gov.justice.generation.pojo.generators; - -import static java.util.stream.Collectors.toList; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -import java.util.List; - -import com.squareup.javapoet.MethodSpec; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.runners.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class AdditionalPropertiesGeneratorTest { - - @InjectMocks - private AdditionalPropertiesGenerator additionalPropertiesGenerator; - - @Test - public void shouldGenerateTheCorrectJavaForTheAdditionalPropertiesFieldDeclaration() throws Exception { - - final String expectedField = "private final java.util.Map" + - " additionalProperties " + - "= new java.util.HashMap<>();\n"; - - assertThat(additionalPropertiesGenerator.generateField().toString(), is(expectedField)); - } - - @Test - public void shouldGenerateTheCorrectGetter() throws Exception { - - final String expectedGetter = "@com.fasterxml.jackson.annotation.JsonAnyGetter\n" + - "public java.util.Map getAdditionalProperties() {\n" + - " return additionalProperties;\n" + - "}\n"; - - final String expectedSetter = "@com.fasterxml.jackson.annotation.JsonAnySetter\n" + - "public void setAdditionalProperty(" + - "final java.lang.String name, " + - "final java.lang.Object value) {\n" + - " additionalProperties.put(name, value);\n" + - "}\n"; - - final List methodSpecs = additionalPropertiesGenerator.generateMethods().collect(toList()); - - assertThat(methodSpecs.size(), is(2)); - assertThat(methodSpecs.get(0).toString(), is(expectedGetter)); - assertThat(methodSpecs.get(1).toString(), is(expectedSetter)); - } -} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPluginTest.java new file mode 100644 index 0000000..29b10dd --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddAdditionalPropertiesToClassPluginTest.java @@ -0,0 +1,102 @@ +package uk.gov.justice.generation.pojo.generators.plugin.classmodifying; + +import static com.squareup.javapoet.TypeSpec.classBuilder; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import uk.gov.justice.generation.pojo.dom.ClassDefinition; + +import com.squareup.javapoet.TypeSpec; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class AddAdditionalPropertiesToClassPluginTest { + + @InjectMocks + private AddAdditionalPropertiesToClassPlugin addAdditionalPropertiesToClassPlugin; + + @Test + public void shouldGenerateTheAdditionalPropertiesFieldDeclarationIfAllowAdditionalPropertiesIsTrue() throws Exception { + + final String expectedField = "private final java.util.Map" + + " additionalProperties " + + "= new java.util.HashMap<>();\n"; + + final TypeSpec.Builder classBuilder = classBuilder("MyClass"); + + final ClassDefinition classDefinition = mock(ClassDefinition.class); + final PluginContext pluginContext = mock(PluginContext.class); + + when(classDefinition.allowAdditionalProperties()).thenReturn(true); + + final TypeSpec.Builder modifiedBuilder = addAdditionalPropertiesToClassPlugin.generateWith( + classBuilder, + classDefinition, + pluginContext); + + final TypeSpec typeSpec = modifiedBuilder.build(); + + assertThat(typeSpec.fieldSpecs.size(), is(1)); + assertThat(typeSpec.fieldSpecs.get(0).toString(), is(expectedField)); + } + + @Test + public void shouldGenerateTheAdditionalPropertiesGetterAndSetterIfAllowAdditionalPropertiesIsTrue() throws Exception { + + final String expectedGetter = "@com.fasterxml.jackson.annotation.JsonAnyGetter\n" + + "public java.util.Map getAdditionalProperties() {\n" + + " return additionalProperties;\n" + + "}\n"; + + final String expectedSetter = "@com.fasterxml.jackson.annotation.JsonAnySetter\n" + + "public void setAdditionalProperty(" + + "final java.lang.String name, " + + "final java.lang.Object value) {\n" + + " additionalProperties.put(name, value);\n" + + "}\n"; + + final TypeSpec.Builder classBuilder = classBuilder("MyClass"); + + final ClassDefinition classDefinition = mock(ClassDefinition.class); + final PluginContext pluginContext = mock(PluginContext.class); + + when(classDefinition.allowAdditionalProperties()).thenReturn(true); + + final TypeSpec.Builder modifiedBuilder = addAdditionalPropertiesToClassPlugin.generateWith( + classBuilder, + classDefinition, + pluginContext); + + final TypeSpec typeSpec = modifiedBuilder.build(); + + assertThat(typeSpec.methodSpecs.size(), is(2)); + assertThat(typeSpec.methodSpecs.get(0).toString(), is(expectedGetter)); + assertThat(typeSpec.methodSpecs.get(1).toString(), is(expectedSetter)); + } + + @Test + public void shouldNotModifyTheClassSpecIfAdditionalPropertiesIsFalse() throws Exception { + + final TypeSpec.Builder classBuilder = classBuilder("MyClass"); + + final ClassDefinition classDefinition = mock(ClassDefinition.class); + final PluginContext pluginContext = mock(PluginContext.class); + + when(classDefinition.allowAdditionalProperties()).thenReturn(false); + + final TypeSpec.Builder modifiedBuilder = addAdditionalPropertiesToClassPlugin.generateWith( + classBuilder, + classDefinition, + pluginContext); + + final TypeSpec typeSpec = modifiedBuilder.build(); + + assertThat(typeSpec.fieldSpecs.size(), is(0)); + assertThat(typeSpec.methodSpecs.size(), is(0)); + } +} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPluginTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPluginTest.java index 73d8893..c3a08fc 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPluginTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/plugin/classmodifying/AddFieldsAndMethodsToClassPluginTest.java @@ -113,37 +113,4 @@ public void shouldGenerateTypeSpecForClassDefinitionWithOneField() throws Except methodSpec) ); } - - @Test - public void shouldGenerateTypeSpecForClassDefinitionWithAdditionalProperties() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "address"); - classDefinition.setAllowAdditionalProperties(true); - - when(pluginContext.getJavaGeneratorFactory()).thenReturn(generatorFactory); - - final TypeSpec.Builder typeSpecBuilder = classBuilder("ClassName"); - - new AddFieldsAndMethodsToClassPlugin() - .generateWith( - typeSpecBuilder, - classDefinition, - pluginContext); - - final TypeSpec typeSpec = typeSpecBuilder.build(); - - assertThat(typeSpec.annotations.isEmpty(), is(true)); - assertThat(typeSpec.name, is("ClassName")); - assertThat(typeSpec.fieldSpecs.size(), is(1)); - - assertThat(typeSpec.fieldSpecs.get(0).name, is("additionalProperties")); - - assertThat(typeSpec.methodSpecs.size(), is(3)); - assertThat(typeSpec.methodSpecs.get(0), is(constructorBuilder().addModifiers(PUBLIC).build())); - - final MethodSpec additionalPropertiesGetter = typeSpec.methodSpecs.get(1); - final MethodSpec additionalPropertiesSetter = typeSpec.methodSpecs.get(2); - - assertThat(additionalPropertiesGetter.name, is("getAdditionalProperties")); - assertThat(additionalPropertiesSetter.name, is("setAdditionalProperty")); - } }