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 #13 from CJSCommonPlatform/implement-combined-schemas
Browse files Browse the repository at this point in the history
implement combined schemas
  • Loading branch information
mapingo committed Aug 23, 2017
2 parents 1ff1110 + 89e6da4 commit 28b77ca
Show file tree
Hide file tree
Showing 20 changed files with 619 additions and 203 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class ClassGeneratorIT {
@Before
@SuppressWarnings("ResultOfMethodCallIgnored")
public void setup() throws Exception {
sourceOutputDirectory = new File("./target/test-generation");
sourceOutputDirectory = new File("./target/test-generation/class-generator");
classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.mkdirs();
Expand All @@ -57,7 +57,7 @@ public void setup() throws Exception {
@Test
public void shouldGenerateJavaClassSourceCode() throws Exception {

final String packageName = "uk.gov.justice.pojo";
final String packageName = "uk.gov.justice.pojo.classgenerator";

final ClassDefinition addressDefinition = addressDefinition(packageName);
final ClassDefinition employeeDefinition = employeeDefinition(packageName, addressDefinition);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package uk.gov.justice.generation.pojo.integration.test;

import static com.jayway.jsonassert.JsonAssert.with;
import static org.apache.commons.io.FileUtils.cleanDirectory;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

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.generators.JavaGeneratorFactory;
import uk.gov.justice.generation.pojo.integration.utils.ClassCompiler;
import uk.gov.justice.generation.pojo.write.SourceWriter;
import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer;

import java.io.File;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.everit.json.schema.Schema;
import org.junit.Before;
import org.junit.Test;

public class CombinedSchemaIT {

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 SchemaLoader schemaLoader = new SchemaLoader();
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/combined-schema");
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/address.json");
final Schema schema = schemaLoader.loadFrom(jsonSchemaFile);
final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.combined.schema");
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);

jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor);

final List<Class<?>> newClasses = new ArrayList<>();

javaGeneratorFactory
.createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions())
.forEach(classGeneratable -> {
sourceWriter.write(classGeneratable, sourceOutputDirectory.toPath());
final Class<?> newClass = classCompiler.compile(classGeneratable, sourceOutputDirectory, classesOutputDirectory);
newClasses.add(newClass);
});

assertThat(newClasses.size(), is(1));
assertThat(newClasses.get(0).getSimpleName(), is("Address"));

final Constructor<?> constructor = newClasses.get(0).getConstructor(
String.class,
String.class,
String.class,
String.class,
String.class,
String.class,
String.class);

assertThat(constructor, is(notNullValue()));

final String zipCode = "zipCode";
final String city = "city";
final String county = "county";
final String addressLine1 = "addressLine1";
final String addressLine2 = "addressLine2";
final String postCode = "postCode";
final String state = "state";

final Object addressObject = constructor.newInstance(
zipCode,
city,
county,
addressLine1,
addressLine2,
postCode,
state
);

final String json = objectMapper.writeValueAsString(addressObject);

with(json)
.assertThat("$.addressLine1", is("addressLine1"))
.assertThat("$.addressLine2", is("addressLine2"))
.assertThat("$.city", is("city"))
.assertThat("$.county", is("county"))
.assertThat("$.postCode", is("postCode"))
.assertThat("$.state", is("state"))
.assertThat("$.zipCode", is("zipCode"))
;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static org.apache.commons.io.FileUtils.cleanDirectory;

import uk.gov.justice.generation.io.files.loader.ObjectSchemaLoader;
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;
Expand All @@ -12,7 +12,7 @@

import java.io.File;

import org.everit.json.schema.ObjectSchema;
import org.everit.json.schema.Schema;
import org.junit.Before;
import org.junit.Test;

Expand All @@ -23,15 +23,15 @@ public class ComplexSchemaIT {

private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory();
private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator();
private final ObjectSchemaLoader objectSchemaLoader = new ObjectSchemaLoader();
private final SchemaLoader schemaLoader = new SchemaLoader();

private File sourceOutputDirectory;
private File classesOutputDirectory;

@Before
@SuppressWarnings("ResultOfMethodCallIgnored")
public void setup() throws Exception {
sourceOutputDirectory = new File("./target/test-generation");
sourceOutputDirectory = new File("./target/test-generation/complex-schema");
classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.mkdirs();
Expand All @@ -46,10 +46,10 @@ public void setup() throws Exception {
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 Schema schema = schemaLoader.loadFrom(jsonSchemaFile);
final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo");
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.complex.schema");
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);

jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import uk.gov.justice.generation.io.files.loader.ObjectSchemaLoader;
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;
Expand All @@ -22,7 +22,7 @@
import java.math.BigDecimal;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.everit.json.schema.ObjectSchema;
import org.everit.json.schema.Schema;
import org.junit.Before;
import org.junit.Test;

Expand All @@ -32,15 +32,15 @@ public class DefinitionBuilderIT {
private final ClassCompiler classCompiler = new ClassCompiler();
private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper();
private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator();
private final ObjectSchemaLoader objectSchemaLoader = new ObjectSchemaLoader();
private final SchemaLoader schemaLoader = new SchemaLoader();

private File sourceOutputDirectory;
private File classesOutputDirectory;

@Before
@SuppressWarnings("ResultOfMethodCallIgnored")
public void setup() throws Exception {
sourceOutputDirectory = new File("./target/test-generation");
sourceOutputDirectory = new File("./target/test-generation/definition-builder");
classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.mkdirs();
Expand All @@ -54,10 +54,10 @@ public void setup() throws Exception {
@Test
public void shouldBuildTypeSpecFromSchema() throws Exception {
final File schemaFile = new File("src/test/resources/schemas/person-schema.json");
final ObjectSchema schema = objectSchemaLoader.loadFrom(schemaFile);
final Schema schema = schemaLoader.loadFrom(schemaFile);
final String fieldName = rootFieldNameGenerator.generateNameFrom(schemaFile);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo");
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo.definition.builder");

final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);
jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@

import static com.jayway.jsonassert.JsonAssert.with;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.reducing;
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;

import uk.gov.justice.generation.bootstrap.GenerationContextFactory;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.dom.ClassName;
import uk.gov.justice.generation.pojo.dom.EnumDefinition;
Expand Down Expand Up @@ -41,7 +38,7 @@ public class EnumGeneratorIT {
@Before
@SuppressWarnings("ResultOfMethodCallIgnored")
public void setup() throws Exception {
sourceOutputDirectory = new File("./target/test-generation");
sourceOutputDirectory = new File("./target/test-generation/enum-generator");
classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.mkdirs();
Expand All @@ -56,7 +53,7 @@ public void setup() throws Exception {
@Test
public void shouldGenerateJavaClassSourceCode() throws Exception {

final String packageName = "uk.gov.justice.pojo";
final String packageName = "uk.gov.justice.pojo.enumgenerator";

final ClassDefinition studentDefinition = studentDefinition(packageName);
final EnumDefinition colourDefinition = colourDefinition(packageName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class SourceWriterIT {
@Before
@SuppressWarnings("ResultOfMethodCallIgnored")
public void setup() throws Exception {
sourceOutputDirectory = new File("./target/test-generation");
sourceOutputDirectory = new File("./target/test-generation/source-writer");
classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.mkdirs();
Expand Down
54 changes: 54 additions & 0 deletions integration-test/src/test/resources/schemas/address.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"title": "Address",
"additionalProperties": true,
"properties": {
"addressLine1": {
"type": "string"
},
"addressLine2": {
"type": "string"
},
"city": {
"type": "string"
}
},
"required": [
"addressLine1",
"addressLine2",
"city"
],
"oneOf": [
{
"type": "object",
"properties": {
"state": {
"type": "string"
},
"zipCode": {
"type": "string"
}
},
"required": [
"state",
"zipCode"
]
},
{
"type": "object",
"properties": {
"county": {
"type": "string"
},
"postCode": {
"type": "string"
}
},
"required": [
"county",
"postCode"
]
}
]
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package uk.gov.justice.generation;

import uk.gov.justice.generation.io.files.loader.ObjectSchemaLoader;
import uk.gov.justice.generation.io.files.loader.SchemaLoader;
import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper;
Expand All @@ -14,21 +14,21 @@

import java.io.File;

import org.everit.json.schema.ObjectSchema;
import org.everit.json.schema.Schema;

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 ObjectSchemaLoader objectSchemaLoader = new ObjectSchemaLoader();
private final SchemaLoader schemaLoader = new SchemaLoader();

@Override
public void run(final File source, final GeneratorConfig generatorConfig) {
final NonDuplicatingSourceWriter writer = new NonDuplicatingSourceWriter(new JavaSourceFileProvider(), sourceWriter);
final GenerationContext generationContext = new GenerationContext(generatorConfig.getOutputDirectory());

final ObjectSchema schema = objectSchemaLoader.loadFrom(source);
final Schema schema = schemaLoader.loadFrom(source);
final String fieldName = rootFieldNameGenerator.generateNameFrom(source);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(generatorConfig.getBasePackageName());
Expand All @@ -39,4 +39,4 @@ public void run(final File source, final GeneratorConfig generatorConfig) {
.createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions())
.forEach(classGeneratable -> writer.write(classGeneratable, generationContext));
}
}
}
Loading

0 comments on commit 28b77ca

Please sign in to comment.