Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
convert additional properties to be a plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
amckenzie committed Sep 12, 2017
1 parent ce2498b commit 591e70a
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -84,8 +85,9 @@ public List<Class<?>> generateAndCompileJavaSource(final File jsonSchemaFile,
final List<ClassModifyingPlugin> classGeneratorPlugins = asList(
new MakeClassSerializablePlugin(),
new AddFieldsAndMethodsToClassPlugin(),
new GenerateBuilderForClassPlugin(new BuilderGeneratorFactory()
));
new GenerateBuilderForClassPlugin(new BuilderGeneratorFactory()),
new AddAdditionalPropertiesToClassPlugin()
);

final List<TypeModifyingPlugin> typeNamePlugins = asList(
new SupportJavaOptionalsPlugin(),
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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),
Expand All @@ -36,13 +51,12 @@ public FieldSpec generateField() {
.build();
}

@Override
public Stream<MethodSpec> generateMethods() {
private List<MethodSpec> gettersAndSetters() {

final MethodSpec getter = generateGetter();
final MethodSpec setter = generateSetter();

return Stream.of(getter, setter);
return asList(getter, setter);
}

private MethodSpec generateGetter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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,
Expand All @@ -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<MethodSpec> gettersAndSetters = additionalPropertiesGenerator
.generateMethods()
.collect(toList());

typeSpecBuilder.addField(additionalProperties);
typeSpecBuilder.addMethods(gettersAndSetters);
}

return typeSpecBuilder;
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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" +
"<java.lang.String, java.lang.Object> 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<java.lang.String, java.lang.Object> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}
}

0 comments on commit 591e70a

Please sign in to comment.