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

Commit

Permalink
Merge pull request #8 from CJSCommonPlatform/enum-generator
Browse files Browse the repository at this point in the history
Add Enum generator
  • Loading branch information
mapingo committed Aug 18, 2017
2 parents 79eebb1 + e82cff7 commit 12d681e
Show file tree
Hide file tree
Showing 27 changed files with 599 additions and 201 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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<ClassGeneratable> 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<? extends Class<?>> classes = classGenerators.stream().map(classGenerator -> {
sourceWriter.write(classGenerator, generationContext);
return classCompiler.compile(classGenerator, sourceOutputDirectory, classesOutputDirectory);
}).collect(toList());
final List<? extends Class<?>> 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()));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,59 +1,66 @@
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 {

final File jsonSchemaFile = new File("src/test/resources/schemas/context.command.complex-data.json");
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<ClassGeneratable> 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);
});
}
}
Original file line number Diff line number Diff line change
@@ -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;

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

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

Expand All @@ -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)
Expand All @@ -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)));
Expand Down
39 changes: 39 additions & 0 deletions integration-test/src/test/resources/schemas/person-enum-schema
Original file line number Diff line number Diff line change
@@ -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"
]
}
4 changes: 4 additions & 0 deletions pojo-generator-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
<groupId>com.squareup</groupId>
<artifactId>javapoet</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>uk.gov.justice.services</groupId>
<artifactId>generators-commons</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}
Loading

0 comments on commit 12d681e

Please sign in to comment.