From 44ece7ca993db39c91c2552153cc05ec1fbedee9 Mon Sep 17 00:00:00 2001 From: Shaun Francis Date: Tue, 22 Aug 2017 16:45:13 +0100 Subject: [PATCH] Add event annotation for event schemas --- .../integration/test/CombinedSchemaIT.java | 6 +- .../integration/test/ComplexSchemaIT.java | 6 +- .../integration/test/DefinitionBuilderIT.java | 6 +- pojo-generator-core/pom.xml | 5 ++ .../generation/SchemaToJavaGenerator.java | 20 +++++-- .../pojo/core/DefinitionBuilderVisitor.java | 17 +++++- ...dNameGenerator.java => NameGenerator.java} | 36 +++++++---- .../generation/pojo/dom/ClassDefinition.java | 13 ++++ .../pojo/generators/ClassGenerator.java | 14 ++++- .../pojo/validation/FileNameValidator.java | 12 ++++ .../generation/SchemaToJavaGeneratorTest.java | 47 ++++++++++++++- .../core/DefinitionBuilderVisitorTest.java | 59 +++++++++++-------- ...eratorTest.java => NameGeneratorTest.java} | 24 +++++--- .../pojo/generators/ClassGeneratorTest.java | 23 ++++++++ .../validation/FileNameValidatorTest.java | 34 +++++++++++ .../schemas/example.events.person-event.json | 17 ++++++ pojo-plugin-it/pom.xml | 6 ++ ...son => example.events.person-updated.json} | 0 .../SchemaToJavaGeneratorPluginTest.java | 4 +- 19 files changed, 284 insertions(+), 65 deletions(-) rename pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/{RootFieldNameGenerator.java => NameGenerator.java} (60%) create mode 100644 pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/validation/FileNameValidator.java rename pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/{RootFieldNameGeneratorTest.java => NameGeneratorTest.java} (72%) create mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/validation/FileNameValidatorTest.java create mode 100644 pojo-generator-core/src/test/resources/schemas/example.events.person-event.json rename pojo-plugin-it/src/main/resources/events/json/schema/{person-schema.json => example.events.person-updated.json} (100%) diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/CombinedSchemaIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/CombinedSchemaIT.java index c890c2c..c67020b 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/CombinedSchemaIT.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/CombinedSchemaIT.java @@ -9,7 +9,7 @@ import uk.gov.justice.generation.io.files.loader.SchemaLoader; import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor; import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper; -import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator; +import uk.gov.justice.generation.pojo.core.NameGenerator; 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; @@ -31,7 +31,7 @@ public class CombinedSchemaIT { private final ClassCompiler classCompiler = new ClassCompiler(); private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); - private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); + private final NameGenerator rootFieldNameGenerator = new NameGenerator(); private final SchemaLoader schemaLoader = new SchemaLoader(); private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); @@ -57,7 +57,7 @@ public void shouldParseAVeryComplexSchemaDocument() throws Exception { final File jsonSchemaFile = new File("src/test/resources/schemas/address.json"); final Schema schema = schemaLoader.loadFrom(jsonSchemaFile); - final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile); + final String fieldName = rootFieldNameGenerator.rootFieldNameFrom(jsonSchemaFile); final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.combined.schema"); final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema); 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 f1a3852..4504284 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 @@ -5,7 +5,7 @@ import uk.gov.justice.generation.io.files.loader.SchemaLoader; import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor; import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper; -import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator; +import uk.gov.justice.generation.pojo.core.NameGenerator; 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; @@ -22,7 +22,7 @@ public class ComplexSchemaIT { private final ClassCompiler classCompiler = new ClassCompiler(); private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); - private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); + private final NameGenerator nameGenerator = new NameGenerator(); private final SchemaLoader schemaLoader = new SchemaLoader(); private File sourceOutputDirectory; @@ -47,7 +47,7 @@ public void shouldParseAVeryComplexSchemaDocument() throws Exception { final File jsonSchemaFile = new File("src/test/resources/schemas/context.command.complex-data.json"); final Schema schema = schemaLoader.loadFrom(jsonSchemaFile); - final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile); + final String fieldName = nameGenerator.rootFieldNameFrom(jsonSchemaFile); final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.complex.schema"); final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema); 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 b0d1207..bc2492a 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 @@ -9,7 +9,7 @@ import uk.gov.justice.generation.io.files.loader.SchemaLoader; import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor; import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper; -import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator; +import uk.gov.justice.generation.pojo.core.NameGenerator; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.generators.ClassGeneratable; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; @@ -31,7 +31,7 @@ public class DefinitionBuilderIT { private final SourceWriter sourceWriter = new SourceWriter(); private final ClassCompiler classCompiler = new ClassCompiler(); private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); - private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); + private final NameGenerator nameGenerator = new NameGenerator(); private final SchemaLoader schemaLoader = new SchemaLoader(); private File sourceOutputDirectory; @@ -55,7 +55,7 @@ public void setup() throws Exception { public void shouldBuildTypeSpecFromSchema() throws Exception { final File schemaFile = new File("src/test/resources/schemas/person-schema.json"); final Schema schema = schemaLoader.loadFrom(schemaFile); - final String fieldName = rootFieldNameGenerator.generateNameFrom(schemaFile); + final String fieldName = nameGenerator.rootFieldNameFrom(schemaFile); final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.definition.builder"); diff --git a/pojo-generator-core/pom.xml b/pojo-generator-core/pom.xml index 88ce10d..e07eef3 100644 --- a/pojo-generator-core/pom.xml +++ b/pojo-generator-core/pom.xml @@ -26,6 +26,11 @@ parser-common ${generator-maven-plugin.version} + + uk.gov.justice.services + framework-api-domain + ${framework-version} + org.everit.json org.everit.json.schema 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 6b5f758..ca96a44 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 @@ -4,8 +4,9 @@ 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.core.NameGenerator; import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; +import uk.gov.justice.generation.pojo.validation.FileNameValidator; import uk.gov.justice.generation.pojo.write.JavaSourceFileProvider; import uk.gov.justice.generation.pojo.write.NonDuplicatingSourceWriter; import uk.gov.justice.generation.pojo.write.SourceWriter; @@ -20,7 +21,8 @@ public class SchemaToJavaGenerator implements Generator { private final SourceWriter sourceWriter = new SourceWriter(); private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); - private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator(); + private final NameGenerator nameGenerator = new NameGenerator(); + private final FileNameValidator fileNameValidator = new FileNameValidator(); private final SchemaLoader schemaLoader = new SchemaLoader(); @Override @@ -29,9 +31,9 @@ public void run(final File source, final GeneratorConfig generatorConfig) { final GenerationContext generationContext = new GenerationContext(generatorConfig.getOutputDirectory()); final Schema schema = schemaLoader.loadFrom(source); - final String fieldName = rootFieldNameGenerator.generateNameFrom(source); + final String fieldName = nameGenerator.rootFieldNameFrom(source); - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(generatorConfig.getBasePackageName()); + final DefinitionBuilderVisitor definitionBuilderVisitor = constructDefinitionBuilderVisitor(source, generatorConfig.getBasePackageName()); new JsonSchemaWrapper(schema).accept(fieldName, definitionBuilderVisitor); @@ -39,4 +41,14 @@ public void run(final File source, final GeneratorConfig generatorConfig) { .createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions()) .forEach(classGeneratable -> writer.write(classGeneratable, generationContext)); } + + private DefinitionBuilderVisitor constructDefinitionBuilderVisitor(final File source, final String basePackageName) { + if (fileNameValidator.isEventSchema(source)) { + return new DefinitionBuilderVisitor( + basePackageName, + nameGenerator.eventNameFrom(source)); + } + + return new DefinitionBuilderVisitor(basePackageName); + } } 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 966b3a9..7edf3ad 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 @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.Optional; import java.util.Set; import org.everit.json.schema.ArraySchema; @@ -31,14 +32,28 @@ public class DefinitionBuilderVisitor implements Visitor { private final List classDefinitions = new ArrayList<>(); private final ClassNameProvider classNameProvider = new ClassNameProvider(); private final String packageName; + private final Optional eventName; public DefinitionBuilderVisitor(final String packageName) { this.packageName = packageName; + this.eventName = Optional.empty(); + } + + public DefinitionBuilderVisitor(final String packageName, final String eventName) { + this.packageName = packageName; + this.eventName = Optional.ofNullable(eventName); } @Override public void enter(final String fieldName, final Schema schema) { - final ClassDefinition definition = new ClassDefinition(fieldName, new ClassName(packageName, capitalize(fieldName))); + final ClassName className = new ClassName(packageName, capitalize(fieldName)); + + final ClassDefinition definition; + if (definitions.isEmpty() && eventName.isPresent()) { + definition = new ClassDefinition(fieldName, className, eventName.get()); + } else { + definition = new ClassDefinition(fieldName, className); + } definitions.push(new Entry(schema, definition)); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/RootFieldNameGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/NameGenerator.java similarity index 60% rename from pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/RootFieldNameGenerator.java rename to pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/NameGenerator.java index d2cd64a..83bc057 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/RootFieldNameGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/core/NameGenerator.java @@ -9,15 +9,11 @@ import org.apache.commons.lang3.StringUtils; -public class RootFieldNameGenerator { +public class NameGenerator { - public String generateNameFrom(final File jsonSchemaFile) { + public String rootFieldNameFrom(final File jsonSchemaFile) { - final String fileName = jsonSchemaFile.getName(); - - if (!fileName.endsWith(".json")) { - throw new JsonSchemaParseException(format("Failed to load json schema file '%s'. File does not have a '.json' extension", jsonSchemaFile.getAbsolutePath())); - } + final String fileName = getValidFileNameWithNoExtension(jsonSchemaFile); final String name = getNameFrom(fileName); @@ -30,14 +26,30 @@ public String generateNameFrom(final File jsonSchemaFile) { return uncapitalize(className); } - private String getNameFrom(final String fileName) { - final String name = fileName.substring(0, fileName.lastIndexOf('.')); + public String eventNameFrom(final File jsonSchemaFile) { + return getValidFileNameWithNoExtension(jsonSchemaFile); + } + + private String getValidFileNameWithNoExtension(final File jsonSchemaFile) { + final String fileName = jsonSchemaFile.getName(); - final int index = name.lastIndexOf('.'); + if (!fileName.endsWith(".json")) { + throw new JsonSchemaParseException(format("Failed to load json schema file '%s'. File does not have a '.json' extension", jsonSchemaFile.getAbsolutePath())); + } + + return removeFileExtensionFrom(fileName); + } + + private String removeFileExtensionFrom(final String fileName) { + return fileName.substring(0, fileName.lastIndexOf('.')); + } + + private String getNameFrom(final String fileName) { + final int index = fileName.lastIndexOf('.'); if (index > -1) { - return name.substring(index + 1); + return fileName.substring(index + 1); } - return name; + return fileName; } } 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 29330a6..1c06f3e 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 @@ -4,13 +4,22 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class ClassDefinition extends FieldDefinition { private final List fieldDefinitions = new ArrayList<>(); + private final Optional eventName; + public ClassDefinition(final String fieldName, final ClassName className) { super(fieldName, className); + this.eventName = Optional.empty(); + } + + public ClassDefinition(final String fieldName, final ClassName className, final String eventName) { + super(fieldName, className); + this.eventName = Optional.ofNullable(eventName); } public ClassDefinition addFieldDefinition(final Definition fieldDefinition) { @@ -21,4 +30,8 @@ public ClassDefinition addFieldDefinition(final Definition fieldDefinition) { public List getFieldDefinitions() { return unmodifiableList(fieldDefinitions); } + + public Optional getEventName() { + return eventName; + } } 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 d3c9004..75a0fd6 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 @@ -6,12 +6,14 @@ import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PUBLIC; +import uk.gov.justice.domain.annotation.Event; 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 java.util.List; +import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.CodeBlock; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.MethodSpec; @@ -50,9 +52,15 @@ public TypeSpec generate() { .flatMap(ElementGeneratable::generateMethods) .collect(toList()); - return classBuilder(className) - .addModifiers(PUBLIC) - .addMethod(buildConstructor(definitions)) + final TypeSpec.Builder builder = classBuilder(className) + .addModifiers(PUBLIC); + + classDefinition.getEventName().ifPresent(eventName -> + builder.addAnnotation(AnnotationSpec.builder(Event.class) + .addMember("value", "$S", eventName) + .build())); + + return builder.addMethod(buildConstructor(definitions)) .addFields(fields) .addMethods(methods) .build(); diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/validation/FileNameValidator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/validation/FileNameValidator.java new file mode 100644 index 0000000..07edf2e --- /dev/null +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/validation/FileNameValidator.java @@ -0,0 +1,12 @@ +package uk.gov.justice.generation.pojo.validation; + +import java.io.File; + +public class FileNameValidator { + + public boolean isEventSchema(final File jsonSchemaFile) { + final String filename = jsonSchemaFile.getName(); + + return filename.matches("(.+)\\.events\\.(.+)"); + } +} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorTest.java index fcd3dd2..eab6d07 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/SchemaToJavaGeneratorTest.java @@ -1,7 +1,9 @@ package uk.gov.justice.generation; import static java.nio.file.Paths.get; +import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; @@ -10,8 +12,12 @@ import uk.gov.justice.maven.generator.io.files.parser.core.GeneratorConfig; import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Path; import java.nio.file.Paths; +import org.apache.commons.io.IOUtils; import org.junit.Test; @@ -23,18 +29,53 @@ public void shouldConvertSchemaFileToJavaPojo() throws Exception { final GeneratorConfig generatorConfig = mock(GeneratorConfig.class); when(generatorConfig.getOutputDirectory()).thenReturn(Paths.get("target/test-generation")); - when(generatorConfig.getBasePackageName()).thenReturn("uk.gov.justice.generation"); + when(generatorConfig.getBasePackageName()).thenReturn("uk.gov.justice.generation.pojo"); final SchemaToJavaGenerator schemaToJavaGenerator = new SchemaToJavaGenerator(); schemaToJavaGenerator.run(schemaFile, generatorConfig); - final File directory = Paths.get("target/test-generation/uk/gov/justice/generation").toFile(); + final File directory = Paths.get("target/test-generation/uk/gov/justice/generation/pojo").toFile(); assertThat(directory.exists(), is(true)); final File[] files = directory.listFiles(); assertThat(files, notNullValue()); assertThat(files.length, is(1)); - assertThat(files[0].toPath().toString(), is("target/test-generation/uk/gov/justice/generation/PersonSchema.java")); + assertThat(files[0].toPath().toString(), is("target/test-generation/uk/gov/justice/generation/pojo/PersonSchema.java")); + + final String javaSource = loadFileAsString(files[0].toPath()); + + assertThat(javaSource, not(containsString("@Event(\"example.events.person-event\")"))); + } + + @Test + public void shouldConvertSchemaFileToJavaPojoWithEventAnnotation() throws Exception { + final File schemaFile = get("src/test/resources/schemas/example.events.person-event.json").toFile(); + final GeneratorConfig generatorConfig = mock(GeneratorConfig.class); + + when(generatorConfig.getOutputDirectory()).thenReturn(Paths.get("target/test-generation")); + when(generatorConfig.getBasePackageName()).thenReturn("uk.gov.justice.generation.event"); + + final SchemaToJavaGenerator schemaToJavaGenerator = new SchemaToJavaGenerator(); + + schemaToJavaGenerator.run(schemaFile, generatorConfig); + + final File directory = Paths.get("target/test-generation/uk/gov/justice/generation/event").toFile(); + assertThat(directory.exists(), is(true)); + + final File[] files = directory.listFiles(); + assertThat(files, notNullValue()); + assertThat(files.length, is(1)); + assertThat(files[0].toPath().toString(), is("target/test-generation/uk/gov/justice/generation/event/PersonEvent.java")); + + final String javaSource = loadFileAsString(files[0].toPath()); + + assertThat(javaSource, containsString("@Event(\"example.events.person-event\")")); + } + + private String loadFileAsString(final Path path) throws IOException { + try (final FileReader reader = new FileReader(path.toFile())) { + return IOUtils.toString(reader); + } } } \ 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 b2c0b4b..52e9cf7 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 @@ -9,6 +9,7 @@ import uk.gov.justice.generation.pojo.dom.EnumDefinition; import java.util.List; +import java.util.Optional; import java.util.UUID; import org.everit.json.schema.ArraySchema; @@ -37,10 +38,11 @@ public class DefinitionBuilderVisitorTest { @Test public void shouldGenerateClassDefinitionsWithStringSchemaProperties() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String outerClass = "OuterClass"; final String innerClass = "InnerClass"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final StringSchema innerProperty = StringSchema.builder().build(); final StringSchema outerProperty = StringSchema.builder().build(); @@ -58,25 +60,28 @@ public void shouldGenerateClassDefinitionsWithStringSchemaProperties() throws Ex final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(2)); - 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")); + final ClassDefinition classTypeDefinition_1 = (ClassDefinition) definitions.get(0); + final ClassDefinition classTypeDefinition_2 = (ClassDefinition) definitions.get(1); + + assertThat(classTypeDefinition_1.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition_1.getClassName().getSimpleName(), is(innerClass)); + assertThat(classTypeDefinition_1.getEventName(), is(Optional.empty())); + assertThat(classTypeDefinition_1.getFieldDefinitions().get(0).getFieldName(), is("innerProperty")); + assertThat(classTypeDefinition_1.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.String")); + + assertThat(classTypeDefinition_2.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition_2.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition_2.getEventName(), is(Optional.of(eventName))); + assertThat(classTypeDefinition_2.getFieldDefinitions().get(1).getFieldName(), is("outerProperty")); + assertThat(classTypeDefinition_2.getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.String")); } @Test public void shouldGenerateClassDefinitionWithBooleanSchemaProperty() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String outerClass = "OuterClass"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final BooleanSchema outerProperty = BooleanSchema.builder().build(); final ObjectSchema objectSchema = ObjectSchema.builder().addPropertySchema("outerProperty", outerProperty).id(outerClass).build(); @@ -88,19 +93,21 @@ public void shouldGenerateClassDefinitionWithBooleanSchemaProperty() throws Exce final List definitions = definitionBuilderVisitor.getDefinitions(); assertThat(definitions.size(), is(1)); - final ClassDefinition classTypeDefinition1 = (ClassDefinition) definitions.get(0); + final ClassDefinition classTypeDefinition = (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")); + assertThat(classTypeDefinition.getClassName().getPackageName(), is(packageName)); + assertThat(classTypeDefinition.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition.getEventName(), is(Optional.of(eventName))); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is("outerProperty")); + assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.Boolean")); } @Test public void shouldGenerateClassDefinitionWithEnumSchemaProperty() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String outerClass = "OuterClass"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final EnumSchema outerProperty = EnumSchema.builder().build(); final ObjectSchema objectSchema = ObjectSchema.builder().addPropertySchema("outerProperty", outerProperty).id(outerClass).build(); @@ -120,6 +127,7 @@ public void shouldGenerateClassDefinitionWithEnumSchemaProperty() throws Excepti final ClassDefinition classTypeDefinition = (ClassDefinition) definitions.get(1); assertThat(classTypeDefinition.getClassName().getPackageName(), is(packageName)); assertThat(classTypeDefinition.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition.getEventName(), is(Optional.of(eventName))); assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is("outerProperty")); assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("org.bloggs.fred.OuterProperty")); } @@ -127,8 +135,9 @@ public void shouldGenerateClassDefinitionWithEnumSchemaProperty() throws Excepti @Test public void shouldGenerateClassDefinitionWithNumberSchemaProperty() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String outerClass = "OuterClass"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final NumberSchema numberProperty = NumberSchema.builder().build(); final NumberSchema integerProperty = NumberSchema.builder().requiresInteger(true).id("integerProperty").build(); @@ -151,6 +160,7 @@ public void shouldGenerateClassDefinitionWithNumberSchemaProperty() throws Excep assertThat(classTypeDefinition.getClassName().getPackageName(), is(packageName)); assertThat(classTypeDefinition.getClassName().getSimpleName(), is(outerClass)); + assertThat(classTypeDefinition.getEventName(), is(Optional.of(eventName))); assertThat(classTypeDefinition.getFieldDefinitions().get(0).getFieldName(), is("numberProperty")); assertThat(classTypeDefinition.getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.math.BigDecimal")); @@ -162,9 +172,10 @@ public void shouldGenerateClassDefinitionWithNumberSchemaProperty() throws Excep @Test public void shouldGenerateClassDefinitionWithArraySchemaProperty() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String outerClass = "OuterClass"; final String arrayObject = "ArrayObject"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final ArraySchema arraySchema = ArraySchema.builder().build(); @@ -192,6 +203,7 @@ public void shouldGenerateClassDefinitionWithArraySchemaProperty() throws Except assertThat(outerClassDefinition.getClassName().getPackageName(), is(packageName)); assertThat(outerClassDefinition.getClassName().getSimpleName(), is(outerClass)); + assertThat(outerClassDefinition.getEventName(), is(Optional.of(eventName))); assertThat(arrayObjectDefinition.getClassName().getPackageName(), is(packageName)); assertThat(arrayObjectDefinition.getClassName().getSimpleName(), is(arrayObject)); @@ -203,9 +215,10 @@ public void shouldGenerateClassDefinitionWithArraySchemaProperty() throws Except @Test public void shouldGenerateClassDefinitionsWithDescriptionOfTheClassName() throws Exception { final String packageName = "org.bloggs.fred"; + final String eventName = "example.events"; final String propertyName = "uuidProperty"; - final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName); + final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName, eventName); final StringSchema uuidProperty = StringSchema.builder().description("UUID").build(); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/RootFieldNameGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/NameGeneratorTest.java similarity index 72% rename from pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/RootFieldNameGeneratorTest.java rename to pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/NameGeneratorTest.java index c351cf4..0f28fbc 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/RootFieldNameGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/core/NameGeneratorTest.java @@ -13,10 +13,10 @@ @RunWith(MockitoJUnitRunner.class) -public class RootFieldNameGeneratorTest { +public class NameGeneratorTest { @InjectMocks - private RootFieldNameGenerator rootFieldNameGenerator; + private NameGenerator nameGenerator; @Test public void shouldParseTheFileNameIntoAValidJavaClassName() throws Exception { @@ -25,17 +25,17 @@ public void shouldParseTheFileNameIntoAValidJavaClassName() throws Exception { assertThat(schemaFile.exists(), is(true)); - assertThat(rootFieldNameGenerator.generateNameFrom(schemaFile), is("objectPropertySchema")); + assertThat(nameGenerator.rootFieldNameFrom(schemaFile), is("objectPropertySchema")); } @Test - public void shouldRmoveAnyPrependingDotsFromTheFileName() throws Exception { + public void shouldRemoveAnyPrependingDotsFromTheFileName() throws Exception { final File schemaFile = new File("src/test/resources/schemas/context.command.do-something-or-other.json"); assertThat(schemaFile.exists(), is(true)); - assertThat(rootFieldNameGenerator.generateNameFrom(schemaFile), is("doSomethingOrOther")); + assertThat(nameGenerator.rootFieldNameFrom(schemaFile), is("doSomethingOrOther")); } @Test @@ -44,7 +44,7 @@ public void shouldFailIfTheFileNameDoesNotHaveTheExtensionJson() throws Exceptio final File schemaFile = new File("src/test/resources/schemas/object-property-schema"); assertThat(schemaFile.exists(), is(true)); try { - rootFieldNameGenerator.generateNameFrom(schemaFile); + nameGenerator.rootFieldNameFrom(schemaFile); fail(); } catch (final JsonSchemaParseException expected) { assertThat(expected.getMessage(), is("Failed to load json schema file '" + schemaFile.getAbsolutePath() + "'. File does not have a '.json' extension")); @@ -56,7 +56,7 @@ public void shouldFailIfTheFileNameIsOnlyTheExtendion() throws Exception { final File schemaFile = new File("src/test/resources/schemas/.json"); try { - rootFieldNameGenerator.generateNameFrom(schemaFile); + nameGenerator.rootFieldNameFrom(schemaFile); fail(); } catch (final JsonSchemaParseException expected) { assertThat(expected.getMessage(), is("Failed to load json schema file '" + schemaFile.getAbsolutePath() + "'. File name is invalid")); @@ -68,10 +68,18 @@ public void shouldFailIfTheFileNameIsOnlyADot() throws Exception { final File schemaFile = new File("src/test/resources/schemas/..json"); try { - rootFieldNameGenerator.generateNameFrom(schemaFile); + nameGenerator.rootFieldNameFrom(schemaFile); fail(); } catch (final JsonSchemaParseException expected) { assertThat(expected.getMessage(), is("Failed to load json schema file '" + schemaFile.getAbsolutePath() + "'. File name is invalid")); } } + + @Test + public void shouldParseFileNameIntoEventName() throws Exception { + + final File schemaFile = new File("src/test/resources/schemas/example.events.do-something-or-other.json"); + + assertThat(nameGenerator.eventNameFrom(schemaFile), is("example.events.do-something-or-other")); + } } 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 fb10c0f..39ac45f 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 @@ -1,5 +1,6 @@ package uk.gov.justice.generation.pojo.generators; +import static com.squareup.javapoet.AnnotationSpec.builder; import static com.squareup.javapoet.FieldSpec.builder; import static com.squareup.javapoet.MethodSpec.constructorBuilder; import static com.squareup.javapoet.MethodSpec.methodBuilder; @@ -12,6 +13,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import uk.gov.justice.domain.annotation.Event; import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.ClassName; import uk.gov.justice.generation.pojo.dom.FieldDefinition; @@ -41,6 +43,27 @@ public void shouldGenerateTypeSpecForClassDefinitionWithNoFields() throws Except final ClassGenerator classGenerator = new ClassGenerator(classDefinition, javaGeneratorFactory); final TypeSpec typeSpec = classGenerator.generate(); + assertThat(typeSpec.annotations.isEmpty(), is(true)); + assertThat(typeSpec.name, is("Address")); + assertThat(typeSpec.modifiers.size(), is(1)); + assertThat(typeSpec.modifiers, hasItem(PUBLIC)); + assertThat(typeSpec.fieldSpecs.size(), is(0)); + assertThat(typeSpec.methodSpecs.size(), is(1)); + assertThat(typeSpec.methodSpecs, hasItem(constructorBuilder().addModifiers(PUBLIC).build())); + } + + @Test + public void shouldGenerateTypeSpecForClassDefinitionWithEventAnnotation() throws Exception { + final ClassName className = new ClassName("org.something", "Address"); + final ClassDefinition classDefinition = new ClassDefinition("address", className, "example.events.address"); + + final ClassGenerator classGenerator = new ClassGenerator(classDefinition, javaGeneratorFactory); + final TypeSpec typeSpec = classGenerator.generate(); + + assertThat(typeSpec.annotations.size(), is(1)); + assertThat(typeSpec.annotations, hasItem(builder(Event.class) + .addMember("value", "$S", "example.events.address") + .build())); assertThat(typeSpec.name, is("Address")); assertThat(typeSpec.modifiers.size(), is(1)); assertThat(typeSpec.modifiers, hasItem(PUBLIC)); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/validation/FileNameValidatorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/validation/FileNameValidatorTest.java new file mode 100644 index 0000000..5490fad --- /dev/null +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/validation/FileNameValidatorTest.java @@ -0,0 +1,34 @@ +package uk.gov.justice.generation.pojo.validation; + +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 java.io.File; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class FileNameValidatorTest { + + @Test + public void shouldReturnTrueForEventSchemaFile() throws Exception { + final File file = mock(File.class); + + when(file.getName()).thenReturn("example.events.test-event.json"); + + assertThat(new FileNameValidator().isEventSchema(file), is(true)); + } + + @Test + public void shouldReturnFalseForNonEventSchemaFile() throws Exception { + final File file = mock(File.class); + + when(file.getName()).thenReturn("example.non.event.test-schema.json"); + + assertThat(new FileNameValidator().isEventSchema(file), is(false)); + } +} \ No newline at end of file diff --git a/pojo-generator-core/src/test/resources/schemas/example.events.person-event.json b/pojo-generator-core/src/test/resources/schemas/example.events.person-event.json new file mode 100644 index 0000000..0e6a254 --- /dev/null +++ b/pojo-generator-core/src/test/resources/schemas/example.events.person-event.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "firstName", + "lastName" + ] +} diff --git a/pojo-plugin-it/pom.xml b/pojo-plugin-it/pom.xml index 0b893d2..fcbc244 100644 --- a/pojo-plugin-it/pom.xml +++ b/pojo-plugin-it/pom.xml @@ -12,6 +12,12 @@ pojo-plugin-it + + uk.gov.justice.services + framework-api-domain + ${framework-version} + + org.glassfish 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/example.events.person-updated.json similarity index 100% rename from pojo-plugin-it/src/main/resources/events/json/schema/person-schema.json rename to pojo-plugin-it/src/main/resources/events/json/schema/example.events.person-updated.json 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 53bb385..4ad60cb 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 @@ -4,7 +4,7 @@ import static org.hamcrest.CoreMatchers.is; import uk.gov.justice.events.pojo.Alias; -import uk.gov.justice.events.pojo.PersonSchema; +import uk.gov.justice.events.pojo.PersonUpdated; import uk.gov.justice.events.pojo.Title; import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; @@ -31,7 +31,7 @@ public void shouldCreateJavaPojosFromSchema() throws Exception { new Alias("1", "forename_1", "surname_1"), new Alias("2", "forename_2", "surname_2")); - final PersonSchema person = new PersonSchema(firstName, lastName, aliases, title, required, signedInCount, ratio); + final PersonUpdated person = new PersonUpdated(firstName, lastName, aliases, title, required, signedInCount, ratio); final String personJson = objectMapper.writeValueAsString(person);