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

Commit

Permalink
Add event annotation for event schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
mapingo committed Aug 23, 2017
1 parent 28b77ca commit 44ece7c
Show file tree
Hide file tree
Showing 19 changed files with 284 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();

Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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");

Expand Down
5 changes: 5 additions & 0 deletions pojo-generator-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@
<artifactId>parser-common</artifactId>
<version>${generator-maven-plugin.version}</version>
</dependency>
<dependency>
<groupId>uk.gov.justice.services</groupId>
<artifactId>framework-api-domain</artifactId>
<version>${framework-version}</version>
</dependency>
<dependency>
<groupId>org.everit.json</groupId>
<artifactId>org.everit.json.schema</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,7 +21,8 @@ public class SchemaToJavaGenerator implements Generator<File> {

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
Expand All @@ -29,14 +31,24 @@ 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);

javaGeneratorFactory
.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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -31,14 +32,28 @@ public class DefinitionBuilderVisitor implements Visitor {
private final List<Definition> classDefinitions = new ArrayList<>();
private final ClassNameProvider classNameProvider = new ClassNameProvider();
private final String packageName;
private final Optional<String> 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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,22 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class ClassDefinition extends FieldDefinition {

private final List<Definition> fieldDefinitions = new ArrayList<>();

private final Optional<String> 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) {
Expand All @@ -21,4 +30,8 @@ public ClassDefinition addFieldDefinition(final Definition fieldDefinition) {
public List<Definition> getFieldDefinitions() {
return unmodifiableList(fieldDefinitions);
}

public Optional<String> getEventName() {
return eventName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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\\.(.+)");
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;


Expand All @@ -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);
}
}
}
Loading

0 comments on commit 44ece7c

Please sign in to comment.