diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ClassGeneratorIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ClassGeneratorIT.java index a68a9de..8929cb7 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ClassGeneratorIT.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ClassGeneratorIT.java @@ -3,6 +3,7 @@ import static com.jayway.jsonassert.JsonAssert.with; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; +import static org.apache.commons.io.FileUtils.cleanDirectory; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -11,7 +12,6 @@ import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; import uk.gov.justice.generation.pojo.dom.FieldDefinition; -import uk.gov.justice.generation.pojo.generators.ClassGeneratable; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import uk.gov.justice.generation.pojo.integration.utils.ClassCompiler; import uk.gov.justice.generation.pojo.write.SourceWriter; @@ -25,6 +25,7 @@ import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; @@ -36,36 +37,41 @@ public class ClassGeneratorIT { private final ClassCompiler classCompiler = new ClassCompiler(); private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); + private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); + private File sourceOutputDirectory; + private File classesOutputDirectory; + + @Before @SuppressWarnings("ResultOfMethodCallIgnored") + public void setup() throws Exception { + sourceOutputDirectory = new File("./target/test-generation"); + classesOutputDirectory = new File("./target/test-classes"); + + sourceOutputDirectory.mkdirs(); + classesOutputDirectory.mkdirs(); + + if (sourceOutputDirectory.exists()) { + cleanDirectory(sourceOutputDirectory); + } + } + @Test public void shouldGenerateJavaClassSourceCode() throws Exception { final String packageName = "uk.gov.justice.pojo"; + final GenerationContext generationContext = new GenerationContextFactory().create(sourceOutputDirectory); final ClassDefinition addressDefinition = addressDefinition(packageName); final ClassDefinition employeeDefinition = employeeDefinition(packageName, addressDefinition); - final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); - - final List classGenerators = asList( - javaGeneratorFactory.createClassGeneratorFor(addressDefinition), - javaGeneratorFactory.createClassGeneratorFor(employeeDefinition) - ); - - final File sourceOutputDirectory = new File("./target/test-generation"); - final File classesOutputDirectory = new File("./target/test-classes"); - - sourceOutputDirectory.mkdirs(); - classesOutputDirectory.mkdirs(); - - final GenerationContext generationContext = new GenerationContextFactory().create(sourceOutputDirectory); - - sourceOutputDirectory.delete(); - final List> classes = classGenerators.stream().map(classGenerator -> { - sourceWriter.write(classGenerator, generationContext); - return classCompiler.compile(classGenerator, sourceOutputDirectory, classesOutputDirectory); - }).collect(toList()); + final List> classes = javaGeneratorFactory + .createClassGeneratorsFor(asList(addressDefinition, employeeDefinition)) + .stream() + .map(classGenerator -> { + sourceWriter.write(classGenerator, generationContext); + return classCompiler.compile(classGenerator, sourceOutputDirectory, classesOutputDirectory); + }).collect(toList()); assertThat(classes.get(0).getName(), is(addressDefinition.getClassName().getFullyQualifiedName())); assertThat(classes.get(1).getName(), is(employeeDefinition.getClassName().getFullyQualifiedName())); diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ComplexSchemaIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ComplexSchemaIT.java index ff1ae78..06de1a8 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ComplexSchemaIT.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/ComplexSchemaIT.java @@ -1,31 +1,48 @@ package uk.gov.justice.generation.pojo.integration.test; -import static java.util.stream.Collectors.toList; +import static org.apache.commons.io.FileUtils.cleanDirectory; import uk.gov.justice.generation.io.files.loader.ObjectSchemaLoader; import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor; import uk.gov.justice.generation.pojo.core.GenerationContext; import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper; import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator; -import uk.gov.justice.generation.pojo.generators.ClassGeneratable; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import uk.gov.justice.generation.pojo.integration.utils.ClassCompiler; import uk.gov.justice.generation.pojo.write.SourceWriter; import java.io.File; -import java.util.List; import org.everit.json.schema.ObjectSchema; +import org.junit.Before; import org.junit.Test; public class ComplexSchemaIT { private final SourceWriter sourceWriter = new SourceWriter(); private final ClassCompiler classCompiler = new ClassCompiler(); + private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); private final ObjectSchemaLoader objectSchemaLoader = new ObjectSchemaLoader(); + private File sourceOutputDirectory; + private File classesOutputDirectory; + + @Before + @SuppressWarnings("ResultOfMethodCallIgnored") + public void setup() throws Exception { + sourceOutputDirectory = new File("./target/test-generation"); + classesOutputDirectory = new File("./target/test-classes"); + + sourceOutputDirectory.mkdirs(); + classesOutputDirectory.mkdirs(); + + if (sourceOutputDirectory.exists()) { + cleanDirectory(sourceOutputDirectory); + } + } + @Test public void shouldParseAVeryComplexSchemaDocument() throws Exception { @@ -33,27 +50,17 @@ public void shouldParseAVeryComplexSchemaDocument() throws Exception { final ObjectSchema schema = objectSchemaLoader.loadFrom(jsonSchemaFile); final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile); + final GenerationContext generationContext = new GenerationContext(sourceOutputDirectory); final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo"); final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema); jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor); - final List classGeneratables = definitionBuilderVisitor.getDefinitions() - .stream() - .map(javaGeneratorFactory::createClassGeneratorFor) - .collect(toList()); - - - final File sourceOutputDirectory = new File("./target/test-generation"); - final File classesOutputDirectory = new File("./target/test-classes"); - - sourceOutputDirectory.delete(); - - final GenerationContext generationContext = new GenerationContext(sourceOutputDirectory); - - classGeneratables.forEach(classGeneratable -> { - sourceWriter.write(classGeneratable, generationContext); - classCompiler.compile(classGeneratable, sourceOutputDirectory, classesOutputDirectory); - }); + javaGeneratorFactory + .createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions()) + .forEach(classGeneratable -> { + sourceWriter.write(classGeneratable, generationContext); + classCompiler.compile(classGeneratable, sourceOutputDirectory, classesOutputDirectory); + }); } } diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/DefinitionBuilderIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/DefinitionBuilderIT.java index ec57a5a..61cd7a5 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/DefinitionBuilderIT.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/DefinitionBuilderIT.java @@ -1,6 +1,8 @@ package uk.gov.justice.generation.pojo.integration.test; import static com.jayway.jsonassert.JsonAssert.with; +import static java.util.Collections.singletonList; +import static org.apache.commons.io.FileUtils.cleanDirectory; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -22,6 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.everit.json.schema.ObjectSchema; +import org.junit.Before; import org.junit.Test; public class DefinitionBuilderIT { @@ -32,6 +35,23 @@ public class DefinitionBuilderIT { private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); private final ObjectSchemaLoader objectSchemaLoader = new ObjectSchemaLoader(); + private File sourceOutputDirectory; + private File classesOutputDirectory; + + @Before + @SuppressWarnings("ResultOfMethodCallIgnored") + public void setup() throws Exception { + sourceOutputDirectory = new File("./target/test-generation"); + classesOutputDirectory = new File("./target/test-classes"); + + sourceOutputDirectory.mkdirs(); + classesOutputDirectory.mkdirs(); + + if (sourceOutputDirectory.exists()) { + cleanDirectory(sourceOutputDirectory); + } + } + @Test public void shouldBuildTypeSpecFromSchema() throws Exception { final File schemaFile = new File("src/test/resources/schemas/person-schema.json"); @@ -43,14 +63,11 @@ public void shouldBuildTypeSpecFromSchema() throws Exception { final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema); jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor); - final ClassDefinition personClassDefinition = definitionBuilderVisitor.getDefinitions().get(0); - final ClassGeneratable personClassGenerator = new JavaGeneratorFactory().createClassGeneratorFor(personClassDefinition); - - - final File sourceOutputDirectory = new File("./target/test-generation"); - final File classesOutputDirectory = new File("./target/test-classes"); + final ClassDefinition personClassDefinition = (ClassDefinition) definitionBuilderVisitor.getDefinitions().get(0); - sourceOutputDirectory.delete(); + final ClassGeneratable personClassGenerator = new JavaGeneratorFactory() + .createClassGeneratorsFor(singletonList(personClassDefinition)) + .get(0); sourceWriter.write(personClassGenerator, new GenerationContext(sourceOutputDirectory)); final Class personClass = classCompiler.compile(personClassGenerator, sourceOutputDirectory, classesOutputDirectory); diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/SourceWriterIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/SourceWriterIT.java index dff3c8c..f650d71 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/SourceWriterIT.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/SourceWriterIT.java @@ -1,6 +1,8 @@ package uk.gov.justice.generation.pojo.integration.test; import static com.jayway.jsonassert.JsonAssert.with; +import static java.util.Collections.singletonList; +import static org.apache.commons.io.FileUtils.cleanDirectory; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -19,6 +21,7 @@ import java.lang.reflect.Constructor; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Before; import org.junit.Test; public class SourceWriterIT { @@ -28,24 +31,35 @@ public class SourceWriterIT { private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); + private File sourceOutputDirectory; + private File classesOutputDirectory; + + @Before + @SuppressWarnings("ResultOfMethodCallIgnored") + public void setup() throws Exception { + sourceOutputDirectory = new File("./target/test-generation"); + classesOutputDirectory = new File("./target/test-classes"); + + sourceOutputDirectory.mkdirs(); + classesOutputDirectory.mkdirs(); + + if (sourceOutputDirectory.exists()) { + cleanDirectory(sourceOutputDirectory); + } + } + @Test public void shouldWriteASingleSourceFile() throws Exception { - final File rootOutputDirectory = new File("target/sources-generated-from-tests"); - rootOutputDirectory.delete(); final String packageName = "org.bloggs.fred"; - final ClassDefinition addressDefinition = addressDefinition(packageName); - - final File sourceOutputDirectory = new File("./target/test-generation"); - final File classesOutputDirectory = new File("./target/test-classes"); - final GenerationContext generationContext = new GenerationContextFactory().create(sourceOutputDirectory); - sourceOutputDirectory.delete(); + final ClassGeneratable addressGenerator = new JavaGeneratorFactory() + .createClassGeneratorsFor(singletonList(addressDefinition)) + .get(0); - final ClassGeneratable addressGenerator = new JavaGeneratorFactory().createClassGeneratorFor(addressDefinition); sourceWriter.write(addressGenerator, generationContext); final Class addressClass = classCompiler.compile(addressGenerator, sourceOutputDirectory, classesOutputDirectory); @@ -57,7 +71,6 @@ public void shouldWriteASingleSourceFile() throws Exception { final Constructor addressConstructor = addressClass.getConstructor(String.class, String.class); final Object address = addressConstructor.newInstance(firstLine, postCode); - final String addressJson = objectMapper.writeValueAsString(address); with(addressJson) @@ -66,7 +79,6 @@ public void shouldWriteASingleSourceFile() throws Exception { ; } - private ClassDefinition addressDefinition(final String packageName) { final ClassDefinition addressDefinition = new ClassDefinition("address", new ClassName(packageName, "Address")); addressDefinition.addFieldDefinition(new FieldDefinition("firstLine", new ClassName(String.class))); diff --git a/integration-test/src/test/resources/schemas/person-enum-schema b/integration-test/src/test/resources/schemas/person-enum-schema new file mode 100644 index 0000000..37eb1ed --- /dev/null +++ b/integration-test/src/test/resources/schemas/person-enum-schema @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "id": "person", + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "title": { + "type": "string", + "enum": [ + "Mr", + "Mrs", + "Ms" + ] + }, + "required": { + "type": "boolean" + }, + "signedInCount": { + "type": "integer" + }, + "ratio": { + "type": "number" + } + }, + "additionalProperties": false, + "required": [ + "title", + "firstName", + "lastName", + "required", + "signedInCount", + "ratio" + ] +} diff --git a/pojo-generator-core/pom.xml b/pojo-generator-core/pom.xml index 326ac93..45e0c34 100644 --- a/pojo-generator-core/pom.xml +++ b/pojo-generator-core/pom.xml @@ -34,6 +34,10 @@ com.squareup javapoet + + org.apache.commons + commons-lang3 + uk.gov.justice.services generators-commons diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaToJavaGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaToJavaGenerator.java index 30da9dd..945042e 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaToJavaGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/SchemaToJavaGenerator.java @@ -31,9 +31,8 @@ public void run(final File source, final GeneratorConfig generatorConfig) { new JsonSchemaWrapper(schema).accept(fieldName, definitionBuilderVisitor); - definitionBuilderVisitor.getDefinitions() - .stream() - .map(javaGeneratorFactory::createClassGeneratorFor) + javaGeneratorFactory + .createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions()) .forEach(classGeneratable -> sourceWriter.write(classGeneratable, generationContext)); } } \ No newline at end of file diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitor.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitor.java index 9a52ccb..1c01631 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitor.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitor.java @@ -1,10 +1,12 @@ package uk.gov.justice.generation.pojo.core; -import static org.apache.commons.lang.StringUtils.capitalize; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.StringUtils.capitalize; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; import uk.gov.justice.generation.pojo.dom.Definition; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; import java.math.BigDecimal; @@ -12,6 +14,7 @@ import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.Set; import org.everit.json.schema.ArraySchema; import org.everit.json.schema.BooleanSchema; @@ -27,7 +30,7 @@ public class DefinitionBuilderVisitor implements Visitor { private final Deque definitions = new ArrayDeque<>(); - private final List classDefinitions = new ArrayList<>(); + private final List classDefinitions = new ArrayList<>(); private final ClassNameProvider classNameProvider = new ClassNameProvider(); private final String packageName; @@ -58,9 +61,7 @@ public void leave(final ObjectSchema schema) { @Override public void visit(final String fieldName, final StringSchema schema) { - final ClassName className = classNameProvider.classNameFor(schema.getDescription()); - definitions.push(new Entry(schema, new FieldDefinition(fieldName, className))); } @@ -75,6 +76,15 @@ public void visit(final String fieldName, final NumberSchema schema) { definitions.push(new Entry(schema, new FieldDefinition(fieldName, className))); } + @Override + public void visit(final String fieldName, final EnumSchema schema) { + final Set possibleValues = schema.getPossibleValues(); + final List enumValues = possibleValues.stream().map(i -> (String) i).collect(toList()); + final EnumDefinition enumDefinition = new EnumDefinition(fieldName, new ClassName(packageName, capitalize(fieldName)), enumValues); + definitions.push(new Entry(schema, enumDefinition)); + classDefinitions.add(enumDefinition); + } + @Override public void visit(final String fieldName, final CombinedSchema schema) { //TODO: Implement Combined Schema @@ -90,18 +100,13 @@ public void visit(final String fieldName, final EmptySchema schema) { //TODO: Implement Empty Schema } - @Override - public void visit(final String fieldName, final EnumSchema schema) { - //TODO: Implement Enum Schema - } - @Override public void visit(final String fieldName, final NullSchema schema) { //TODO: Implement Null Schema } @Override - public List getDefinitions() { + public List getDefinitions() { return classDefinitions; } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/Visitor.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/Visitor.java index b85856a..98ae189 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/Visitor.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/Visitor.java @@ -1,6 +1,6 @@ package uk.gov.justice.generation.pojo.core; -import uk.gov.justice.generation.pojo.dom.ClassDefinition; +import uk.gov.justice.generation.pojo.dom.Definition; import java.util.List; @@ -36,5 +36,5 @@ public interface Visitor { void visit(final String fieldName, final StringSchema schema); - List getDefinitions(); + List getDefinitions(); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java index f0d5d2c..fc332ba 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java @@ -1,37 +1,16 @@ package uk.gov.justice.generation.pojo.dom; import static java.util.Collections.unmodifiableList; -import static java.util.Optional.ofNullable; import java.util.ArrayList; import java.util.List; -import java.util.Optional; -public class ClassDefinition implements Definition { +public class ClassDefinition extends FieldDefinition { - private final ClassName className; - private final String fieldName; - private final Optional genericType; private final List fieldDefinitions = new ArrayList<>(); public ClassDefinition(final String fieldName, final ClassName className) { - this(fieldName, className, null); - } - - public ClassDefinition(final String fieldName, final ClassName className, final ClassName genericType) { - this.className = className; - this.fieldName = fieldName; - this.genericType = ofNullable(genericType); - } - - @Override - public ClassName getClassName() { - return className; - } - - @Override - public String getFieldName() { - return fieldName; + super(fieldName, className); } public void addFieldDefinition(final Definition fieldDefinition) { @@ -41,9 +20,4 @@ public void addFieldDefinition(final Definition fieldDefinition) { public List getFieldDefinitions() { return unmodifiableList(fieldDefinitions); } - - @Override - public Optional getGenericType() { - return genericType; - } } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/EnumDefinition.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/EnumDefinition.java new file mode 100644 index 0000000..0986b33 --- /dev/null +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/EnumDefinition.java @@ -0,0 +1,17 @@ +package uk.gov.justice.generation.pojo.dom; + +import java.util.List; + +public class EnumDefinition extends FieldDefinition { + + private final List enumValues; + + public EnumDefinition(final String fieldName, final ClassName className, final List enumValues) { + super(fieldName, className); + this.enumValues = enumValues; + } + + public List getEnumValues() { + return enumValues; + } +} diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ElementGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ElementGenerator.java index 5e564ba..ed18fc9 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ElementGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ElementGenerator.java @@ -6,7 +6,7 @@ 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 uk.gov.justice.generation.pojo.dom.Definition; import java.util.stream.Stream; @@ -16,28 +16,28 @@ public class ElementGenerator implements ElementGeneratable { - private final ClassDefinition classDefinition; + private final Definition classTypeDefinition; private final DefinitionToTypeNameConverter definitionToTypeNameConverter = new DefinitionToTypeNameConverter(); - ElementGenerator(final ClassDefinition classDefinition) { - this.classDefinition = classDefinition; + ElementGenerator(final Definition classTypeDefinition) { + this.classTypeDefinition = classTypeDefinition; } @Override public FieldSpec generateField() { - return builder(definitionToTypeNameConverter.getTypeName(classDefinition), classDefinition.getFieldName(), PRIVATE, FINAL).build(); + return builder(definitionToTypeNameConverter.getTypeName(classTypeDefinition), classTypeDefinition.getFieldName(), PRIVATE, FINAL).build(); } @Override public Stream generateMethods() { return Stream.of(methodBuilder(toGetterMethodName()) .addModifiers(PUBLIC) - .returns(definitionToTypeNameConverter.getTypeName(classDefinition)) - .addCode(CodeBlock.builder().addStatement("return $L", classDefinition.getFieldName()).build()) + .returns(definitionToTypeNameConverter.getTypeName(classTypeDefinition)) + .addCode(CodeBlock.builder().addStatement("return $L", classTypeDefinition.getFieldName()).build()) .build()); } private String toGetterMethodName() { - return "get" + classDefinition.getClassName().getSimpleName(); + return "get" + classTypeDefinition.getClassName().getSimpleName(); } } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java new file mode 100644 index 0000000..16bb8a0 --- /dev/null +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java @@ -0,0 +1,59 @@ +package uk.gov.justice.generation.pojo.generators; + +import static com.squareup.javapoet.MethodSpec.constructorBuilder; +import static com.squareup.javapoet.MethodSpec.methodBuilder; +import static com.squareup.javapoet.TypeSpec.anonymousClassBuilder; +import static com.squareup.javapoet.TypeSpec.enumBuilder; +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.ClassName; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; + +import com.squareup.javapoet.TypeSpec; + +public class EnumGenerator implements ClassGeneratable { + + private static final String VALUE_VARIABLE_NAME = "value"; + private static final String BLANK_ENUM_NAME = "BLANK"; + + private final EnumDefinition enumDefinition; + + public EnumGenerator(EnumDefinition enumDefinition) { + this.enumDefinition = enumDefinition; + } + + @Override + public TypeSpec generate() { + final String className = enumDefinition.getClassName().getSimpleName(); + + TypeSpec.Builder enumBuilder = enumBuilder(className).addModifiers(PUBLIC); + + enumDefinition.getEnumValues().forEach(enumValue -> { + final String enumName = enumValue.isEmpty() ? BLANK_ENUM_NAME : enumValue.toUpperCase(); + + enumBuilder.addEnumConstant(enumName, anonymousClassBuilder("$S", enumValue) + .build()); + }); + + return enumBuilder + .addField(String.class, VALUE_VARIABLE_NAME, PRIVATE, FINAL) + .addMethod(constructorBuilder() + .addParameter(String.class, VALUE_VARIABLE_NAME) + .addStatement("this.$L = $L", VALUE_VARIABLE_NAME, VALUE_VARIABLE_NAME) + .build()) + .addMethod(methodBuilder("toString") + .addAnnotation(Override.class) + .addModifiers(PUBLIC) + .returns(String.class) + .addStatement("return $L", VALUE_VARIABLE_NAME) + .build()) + .build(); + } + + @Override + public ClassName getClassName() { + return enumDefinition.getClassName(); + } +} diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/FieldGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/FieldGenerator.java index 938aa80..433e0c7 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/FieldGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/FieldGenerator.java @@ -5,7 +5,7 @@ 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 static org.apache.commons.lang.StringUtils.capitalize; +import static org.apache.commons.lang3.StringUtils.capitalize; import uk.gov.justice.generation.pojo.dom.FieldDefinition; 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 e409316..74a8c2a 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 @@ -1,21 +1,39 @@ package uk.gov.justice.generation.pojo.generators; +import static java.util.stream.Collectors.toList; + import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.Definition; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; +import java.util.List; + public class JavaGeneratorFactory { public ElementGeneratable createGeneratorFor(final Definition definition) { - if (definition.getClass() == FieldDefinition.class) { - return new FieldGenerator((FieldDefinition) definition); + if (definition.getClass() == ClassDefinition.class) { + return new ElementGenerator(definition); } - return new ElementGenerator((ClassDefinition) definition); + if (definition.getClass() == EnumDefinition.class) { + return new StringElementGenerator(definition); + } + + return new FieldGenerator((FieldDefinition) definition); } - public ClassGeneratable createClassGeneratorFor(final ClassDefinition classDefinition) { - return new ClassGenerator(classDefinition, this); + public List createClassGeneratorsFor(final List definitions) { + return definitions.stream() + .filter(definition -> EnumDefinition.class.isInstance(definition) || ClassDefinition.class.isInstance(definition)) + .map(definition -> { + if (definition.getClass() == EnumDefinition.class) { + return new EnumGenerator((EnumDefinition) definition); + } + + return new ClassGenerator((ClassDefinition) definition, this); + }) + .collect(toList()); } } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java new file mode 100644 index 0000000..04063e6 --- /dev/null +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java @@ -0,0 +1,43 @@ +package uk.gov.justice.generation.pojo.generators; + +import static com.squareup.javapoet.FieldSpec.builder; +import static com.squareup.javapoet.MethodSpec.methodBuilder; +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.Definition; + +import java.util.stream.Stream; + +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.MethodSpec; + +public class StringElementGenerator implements ElementGeneratable { + + private final Definition classTypeDefinition; + private final DefinitionToTypeNameConverter definitionToTypeNameConverter = new DefinitionToTypeNameConverter(); + + StringElementGenerator(final Definition classTypeDefinition) { + this.classTypeDefinition = classTypeDefinition; + } + + @Override + public FieldSpec generateField() { + return builder(definitionToTypeNameConverter.getTypeName(classTypeDefinition), classTypeDefinition.getFieldName(), PRIVATE, FINAL).build(); + } + + @Override + public Stream generateMethods() { + return Stream.of(methodBuilder(toGetterMethodName()) + .addModifiers(PUBLIC) + .returns(String.class) + .addCode(CodeBlock.builder().addStatement("return $L.toString()", classTypeDefinition.getFieldName()).build()) + .build()); + } + + private String toGetterMethodName() { + return "get" + classTypeDefinition.getClassName().getSimpleName(); + } +} \ No newline at end of file diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitorTest.java index d0ca8ea..e7e468b 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/DefinitionBuilderVisitorTest.java @@ -1,14 +1,18 @@ package uk.gov.justice.generation.pojo.core; +import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import uk.gov.justice.generation.pojo.dom.ClassDefinition; +import uk.gov.justice.generation.pojo.dom.Definition; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; import java.util.List; import java.util.UUID; import org.everit.json.schema.BooleanSchema; +import org.everit.json.schema.EnumSchema; import org.everit.json.schema.NumberSchema; import org.everit.json.schema.ObjectSchema; import org.everit.json.schema.StringSchema; @@ -46,19 +50,21 @@ public void shouldGenerateClassDefinitionsWithStringSchemaProperties() throws Ex definitionBuilderVisitor.visit("outerProperty", outerProperty); definitionBuilderVisitor.leave(objectSchema_1); - final List definitions = definitionBuilderVisitor.getDefinitions(); + final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(2)); - - assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName)); - assertThat(definitions.get(0).getClassName().getSimpleName(), is(innerClass)); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("innerProperty")); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.String")); - - assertThat(definitions.get(1).getClassName().getPackageName(), is(packageName)); - assertThat(definitions.get(1).getClassName().getSimpleName(), is(outerClass)); - assertThat(definitions.get(1).getFieldDefinitions().get(1).getFieldName(), is("outerProperty")); - assertThat(definitions.get(1).getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.String")); + final ClassDefinition classTypeDefinition1 = (ClassDefinition) definitions.get(0); + final ClassDefinition classTypeDefinition2 = (ClassDefinition) definitions.get(1); + + assertThat(classTypeDefinition1.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition1.getClassName().getSimpleName(), is(innerClass)); + assertThat(classTypeDefinition1.getFieldDefinitions().get(0).getFieldName(), is("innerProperty")); + assertThat(classTypeDefinition1.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.String")); + + assertThat(classTypeDefinition2.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition2.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition2.getFieldDefinitions().get(1).getFieldName(), is("outerProperty")); + assertThat(classTypeDefinition2.getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.String")); } @Test @@ -74,14 +80,43 @@ public void shouldGenerateClassDefinitionWithBooleanSchemaProperty() throws Exce definitionBuilderVisitor.visit("outerProperty", outerProperty); definitionBuilderVisitor.leave(objectSchema); - final List definitions = definitionBuilderVisitor.getDefinitions(); + final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(1)); + final ClassDefinition classTypeDefinition1 = (ClassDefinition) definitions.get(0); + + assertThat(classTypeDefinition1.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition1.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition1.getFieldDefinitions().get(0).getFieldName(), is("outerProperty")); + assertThat(classTypeDefinition1.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.Boolean")); + } + + @Test + public void shouldGenerateClassDefinitionWithEnumSchemaProperty() throws Exception { + final String packageName = "org.bloggs.fred"; + final String outerClass = "OuterClass"; + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + + final EnumSchema outerProperty = EnumSchema.builder().build(); + final ObjectSchema objectSchema = ObjectSchema.builder().addPropertySchema("outerProperty", outerProperty).id(outerClass).build(); + + definitionBuilderVisitor.enter("outerClass", objectSchema); + definitionBuilderVisitor.visit("outerProperty", outerProperty); + definitionBuilderVisitor.leave(objectSchema); + final List definitions = definitionBuilderVisitor.getDefinitions(); + + assertThat(definitions.size(), is(2)); + + assertThat(definitions.get(0), is(instanceOf(EnumDefinition.class))); assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName)); - assertThat(definitions.get(0).getClassName().getSimpleName(), is(outerClass)); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("outerProperty")); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.Boolean")); + assertThat(definitions.get(0).getClassName().getSimpleName(), is("OuterProperty")); + + final ClassDefinition classTypeDefinition = (ClassDefinition) definitions.get(1); + assertThat(classTypeDefinition.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is("outerProperty")); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("org.bloggs.fred.OuterProperty")); } @Test @@ -104,18 +139,19 @@ public void shouldGenerateClassDefinitionWithNumberSchemaProperty() throws Excep definitionBuilderVisitor.visit("integerProperty", integerProperty); definitionBuilderVisitor.leave(objectSchema); - final List definitions = definitionBuilderVisitor.getDefinitions(); + final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(1)); + final ClassDefinition classTypeDefinition = (ClassDefinition) definitions.get(0); - assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName)); - assertThat(definitions.get(0).getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition.getClassName().getSimpleName(), is(outerClass)); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("numberProperty")); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.math.BigDecimal")); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is("numberProperty")); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.math.BigDecimal")); - assertThat(definitions.get(0).getFieldDefinitions().get(1).getFieldName(), is("integerProperty")); - assertThat(definitions.get(0).getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.Integer")); + assertThat(classTypeDefinition.getFieldDefinitions().get(1).getFieldName(), is("integerProperty")); + assertThat(classTypeDefinition.getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.Integer")); } @Test @@ -135,11 +171,12 @@ public void shouldGenerateClassDefinitionsWithDescriptionOfTheClassName() throws definitionBuilderVisitor.visit(propertyName, uuidProperty); definitionBuilderVisitor.leave(objectSchema); - final List definitions = definitionBuilderVisitor.getDefinitions(); + final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(1)); + final ClassDefinition classTypeDefinition = (ClassDefinition) definitions.get(0); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is(propertyName)); - assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is(UUID.class.getName())); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is(propertyName)); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is(UUID.class.getName())); } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/EnumDefinitionTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/EnumDefinitionTest.java new file mode 100644 index 0000000..cc7a938 --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/EnumDefinitionTest.java @@ -0,0 +1,26 @@ +package uk.gov.justice.generation.pojo.dom; + +import static java.util.Collections.emptyList; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; + +import java.util.List; + +import org.junit.Test; + +public class EnumDefinitionTest { + + @Test + public void shouldConstructEnumDefinition() throws Exception { + final String fieldName = "fieldName"; + final ClassName className = mock(ClassName.class); + final List enumValues = emptyList(); + + final EnumDefinition enumDefinition = new EnumDefinition(fieldName, className, enumValues); + + assertThat(enumDefinition.getFieldName(), is(fieldName)); + assertThat(enumDefinition.getClassName(), is(className)); + assertThat(enumDefinition.getEnumValues(), is(enumValues)); + } +} \ No newline at end of file diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java index d3f5982..9912a43 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java @@ -1,11 +1,13 @@ package uk.gov.justice.generation.pojo.generators; +import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; import org.junit.Test; @@ -21,10 +23,18 @@ public void shouldCreateFieldGeneratorForFieldDefinition() throws Exception { } @Test - public void shouldCreatElementGeneratorForClassDefinition() throws Exception { + public void shouldCreateElementGeneratorForClassDefinition() throws Exception { final ClassDefinition classDefinition = new ClassDefinition("fieldName", new ClassName("", "")); final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(classDefinition); assertThat(elementGeneratable, is(instanceOf(ElementGenerator.class))); } + + @Test + public void shouldCreateElementGeneratorForEnumDefinition() throws Exception { + final EnumDefinition enumDefinition = new EnumDefinition("fieldName", new ClassName("", ""), emptyList()); + final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(enumDefinition); + + assertThat(elementGeneratable, is(instanceOf(StringElementGenerator.class))); + } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratorTest.java index 7be42fc..203efab 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratorTest.java @@ -35,7 +35,7 @@ public void shouldGenerateField() throws Exception { } @Test - public void shouldGenerateMethod() throws Exception { + public void shouldGenerateMethodFromClassDefintion() throws Exception { final ClassName className = new ClassName("org.something", "Address"); final ClassDefinition classDefinition = new ClassDefinition("address", className); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java new file mode 100644 index 0000000..0090824 --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java @@ -0,0 +1,58 @@ +package uk.gov.justice.generation.pojo.generators; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static javax.lang.model.element.Modifier.PUBLIC; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; + +import uk.gov.justice.generation.pojo.dom.ClassName; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; + +import com.squareup.javapoet.TypeSpec; +import org.junit.Test; + +public class EnumGeneratorTest { + + private final ClassName className = new ClassName("org.something", "Title"); + + @Test + public void shouldGenerateTypeSpec() { + final EnumDefinition enumDefinition = new EnumDefinition("title", className, singletonList("Mr")); + final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition); + + final TypeSpec typeSpec = enumGenerator.generate(); + + assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.enumConstants.keySet(), hasItem("MR")); + assertThat(typeSpec.modifiers.size(), is(1)); + assertThat(typeSpec.modifiers, hasItem(PUBLIC)); + assertThat(typeSpec.fieldSpecs.size(), is(1)); + assertThat(typeSpec.methodSpecs.size(), is(2)); + } + + @Test + public void shouldGenerateTypeSpecForBlankString() { + final EnumDefinition enumDefinition = new EnumDefinition("title", className, singletonList("")); + final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition); + + final TypeSpec typeSpec = enumGenerator.generate(); + + assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.enumConstants.keySet(), hasItem("BLANK")); + } + + @Test + public void shouldReturnClassName() { + final ClassName className = mock(ClassName.class); + final EnumDefinition enumDefinition = new EnumDefinition("title", className, emptyList()); + + final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition); + + assertThat(enumGenerator.getClassName(), is(className)); + + } + +} \ No newline at end of file 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 12fc483..ad775d2 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 @@ -1,5 +1,8 @@ package uk.gov.justice.generation.pojo.generators; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertThat; @@ -7,8 +10,12 @@ import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; +import uk.gov.justice.generation.pojo.dom.Definition; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.dom.FieldDefinition; +import java.util.List; + import org.junit.Test; public class JavaGeneratorFactoryTest { @@ -30,10 +37,47 @@ public void shouldReturnInstanceOfElementGeneratorForClassDefinition() throws Ex } @Test - public void shouldReturnInstanceOfClassGenerator() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition("test", mock(ClassName.class)); - final ClassGeneratable classGeneratable = new JavaGeneratorFactory().createClassGeneratorFor(classDefinition); + public void shouldReturnInstanceOfElementGeneratorForEnumDefinition() throws Exception { + final EnumDefinition enumDefinition = new EnumDefinition("test", mock(ClassName.class), emptyList()); + final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(enumDefinition); + + assertThat(elementGeneratable, is(instanceOf(StringElementGenerator.class))); + } + + @Test + @SuppressWarnings("unchecked") + public void shouldReturnListOfClassGeneratorAndEnumGeneratorForClassDefintionAndEnumDefintion() throws Exception { + final List classDefinitions = asList( + new ClassDefinition("test1", mock(ClassName.class)), + new EnumDefinition("test2", mock(ClassName.class), emptyList())); + + final List classGeneratables = new JavaGeneratorFactory().createClassGeneratorsFor(classDefinitions); + + assertThat(classGeneratables.size(), is(2)); + assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class))); + } + + @Test + public void shouldReturnEmptyListForEmptyListOfDefinitions() throws Exception { + final List classGeneratables = new JavaGeneratorFactory().createClassGeneratorsFor(emptyList()); + + assertThat(classGeneratables.isEmpty(), is(true)); + } + + @Test + @SuppressWarnings("unchecked") + public void shouldIgnoreDefinitionsThatAreNotClassDefinitionOrEnumDefinition() throws Exception { + final List classDefinitions = asList( + new ClassDefinition("class", mock(ClassName.class)), + new FieldDefinition("field1", mock(ClassName.class)), + new EnumDefinition("enum", mock(ClassName.class), emptyList()), + new FieldDefinition("field2", mock(ClassName.class)) + ); + + final List classGeneratables = new JavaGeneratorFactory().createClassGeneratorsFor(classDefinitions); + + assertThat(classGeneratables.size(), is(2)); + assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class))); - assertThat(classGeneratable, is(instanceOf(ClassGenerator.class))); } } \ No newline at end of file diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java new file mode 100644 index 0000000..688feeb --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java @@ -0,0 +1,31 @@ +package uk.gov.justice.generation.pojo.generators; + +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.MethodSpec; +import org.junit.Test; +import uk.gov.justice.generation.pojo.dom.ClassDefinition; +import uk.gov.justice.generation.pojo.dom.ClassName; + +import java.util.stream.Stream; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +public class StringElementGeneratorTest { + final ClassName className = new ClassName("org.something", "Address"); + final ClassDefinition classDefinition = new ClassDefinition("addressLine1", className); + final StringElementGenerator stringElementGenerator = new StringElementGenerator(classDefinition); + + @Test + public void shouldGenerateField() { + final FieldSpec fieldSpec = stringElementGenerator.generateField(); + assertThat(fieldSpec.name, is("addressLine1")); + } + + @Test + public void shouldGenerateMethods() { + final Stream methods = stringElementGenerator.generateMethods(); + assertThat(methods.findFirst().get().name, is("getAddress")); + } + +} \ No newline at end of file diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java index d029b03..4d3112c 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java @@ -1,5 +1,6 @@ package uk.gov.justice.generation.pojo.write; +import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -8,7 +9,6 @@ import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; import uk.gov.justice.generation.pojo.dom.FieldDefinition; -import uk.gov.justice.generation.pojo.generators.ClassGeneratable; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; import java.io.File; @@ -37,8 +37,9 @@ public void shouldWriteASingleSourceFile() throws Exception { sourceOutputDirectory.delete(); - final ClassGeneratable addressGenerator = new JavaGeneratorFactory().createClassGeneratorFor(addressDefinition); - sourceWriter.write(addressGenerator, generationContext); + new JavaGeneratorFactory() + .createClassGeneratorsFor(singletonList(addressDefinition)) + .forEach(classGeneratable -> sourceWriter.write(classGeneratable, generationContext)); assertThat(Paths.get(sourceOutputDirectory.toPath().toString(), "org/bloggs/fred/Address.java").toFile().exists(), is(true)); } diff --git a/pojo-plugin-it/pom.xml b/pojo-plugin-it/pom.xml index be94809..0b893d2 100644 --- a/pojo-plugin-it/pom.xml +++ b/pojo-plugin-it/pom.xml @@ -12,13 +12,23 @@ pojo-plugin-it + - uk.gov.justice.generators - pojo-generation-core - ${project.version} + org.glassfish + javax.json + test + + + uk.gov.justice.utils + utilities-core + ${utilities.version} + test + + + com.jayway.jsonpath + json-path-assert + test - - junit junit @@ -28,45 +38,6 @@ - - - maven-enforcer-plugin - - - enforce-rules - none - - - enforce-rules-local - - enforce - - - - - - ${enforcer.java.version.range} - - - ${enforcer.maven.version.range} - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - generator-plugin uk.gov.justice.maven.generator diff --git a/pojo-plugin-it/src/main/resources/events/json/schema/person-schema.json b/pojo-plugin-it/src/main/resources/events/json/schema/person-schema.json index b598b51..16bc9ed 100644 --- a/pojo-plugin-it/src/main/resources/events/json/schema/person-schema.json +++ b/pojo-plugin-it/src/main/resources/events/json/schema/person-schema.json @@ -3,6 +3,15 @@ "type": "object", "id": "person", "properties": { + "title": { + "type": "string", + "enum": [ + "", + "Mr", + "Mrs", + "Ms" + ] + }, "firstName": { "type": "string" }, diff --git a/pojo-plugin-it/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorPluginTest.java b/pojo-plugin-it/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorPluginTest.java index 47e8ad4..a6eebdf 100644 --- a/pojo-plugin-it/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorPluginTest.java +++ b/pojo-plugin-it/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorPluginTest.java @@ -1,30 +1,41 @@ package uk.gov.justice.generation; +import static com.jayway.jsonassert.JsonAssert.with; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; import uk.gov.justice.events.pojo.PersonSchema; +import uk.gov.justice.events.pojo.Title; +import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; import java.math.BigDecimal; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; public class SchemaToJavaGeneratorPluginTest { + private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); + @Test public void shouldCreateJavaPojosFromSchema() throws Exception { + final Title title = Title.BLANK; final String firstName = "firstName"; final String lastName = "lastName"; final boolean required = true; final int signedInCount = 10; final BigDecimal ratio = BigDecimal.valueOf(1.55); - final PersonSchema personSchema = new PersonSchema(firstName, lastName, required, signedInCount, ratio); + final PersonSchema person = new PersonSchema(firstName, lastName, title, required, signedInCount, ratio); + + final String personJson = objectMapper.writeValueAsString(person); - assertThat(personSchema.getFirstName(), is(firstName)); - assertThat(personSchema.getLastName(), is(lastName)); - assertThat(personSchema.getRequired(), is(required)); - assertThat(personSchema.getSignedInCount(), is(signedInCount)); - assertThat(personSchema.getRatio(), is(ratio)); + with(personJson) + .assertThat("$.firstName", is(firstName)) + .assertThat("$.lastName", is(lastName)) + .assertThat("$.title", is("")) + .assertThat("$.required", is(required)) + .assertThat("$.signedInCount", is(signedInCount)) + .assertThat("$.ratio", is(ratio.doubleValue())) + ; } } \ No newline at end of file