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 #3 from CJSCommonPlatform/create-source-writer
Browse files Browse the repository at this point in the history
Add a non duplicating source writer
  • Loading branch information
mapingo committed Aug 14, 2017
2 parents 4ae5121 + d810879 commit 4fc69e2
Show file tree
Hide file tree
Showing 32 changed files with 916 additions and 89 deletions.
10 changes: 10 additions & 0 deletions integration-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<groupId>uk.gov.justice.generators</groupId>
<artifactId>pojo-generation-core</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.everit.json</groupId>
Expand Down Expand Up @@ -63,4 +64,13 @@
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import uk.gov.justice.generation.pojo.core.SourceWriter;
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.FieldDefinition;
import uk.gov.justice.generation.pojo.generators.ClassGenerator;
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 uk.gov.justice.services.common.converter.ZonedDateTimes;
import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer;

Expand All @@ -27,7 +30,7 @@
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class ClassGeneratorTest {
public class ClassGeneratorIT {

private final SourceWriter sourceWriter = new SourceWriter();
private final ClassCompiler classCompiler = new ClassCompiler();
Expand All @@ -42,19 +45,25 @@ public void shouldGenerateJavaClassSourceCode() throws Exception {

final ClassDefinition addressDefinition = addressDefinition(packageName);
final ClassDefinition employeeDefinition = employeeDefinition(packageName, addressDefinition);
final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory();

final List<ClassGenerator> classGenerators = asList(
new ClassGenerator(addressDefinition),
new ClassGenerator(employeeDefinition)
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, sourceOutputDirectory);
sourceWriter.write(classGenerator, generationContext);
return classCompiler.compile(classGenerator, sourceOutputDirectory, classesOutputDirectory);
}).collect(toList());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import static org.junit.Assert.assertThat;

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

import java.io.File;
Expand All @@ -21,7 +23,7 @@
import org.everit.json.schema.ObjectSchema;
import org.junit.Test;

public class DefintionBuilderIntegrationTest {
public class DefinitionBuilderIT {

private final SourceWriter sourceWriter = new SourceWriter();
private final ClassCompiler classCompiler = new ClassCompiler();
Expand All @@ -38,15 +40,15 @@ public void shouldBuildTypeSpecFromSchema() throws Exception {
jsonSchemaWrapper.accept(definitionBuilderVisitor);

final ClassDefinition personClassDefinition = definitionBuilderVisitor.getDefinitions().get(0);
final ClassGenerator personClassGenerator = new ClassGenerator(personClassDefinition);
final ClassGeneratable personClassGenerator = new JavaGeneratorFactory().createClassGeneratorFor(personClassDefinition);


final File sourceOutputDirectory = new File("./target/test-generation");
final File classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.delete();

sourceWriter.write(personClassGenerator, sourceOutputDirectory);
sourceWriter.write(personClassGenerator, new GenerationContext(sourceOutputDirectory));
final Class<?> personClass = classCompiler.compile(personClassGenerator, sourceOutputDirectory, classesOutputDirectory);

assertThat(personClass.getName(), is(personClassDefinition.getClassName().getFullyQualifiedName()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package uk.gov.justice.generation.pojo.integration.test;

import static com.jayway.jsonassert.JsonAssert.with;
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.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;
import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer;

import java.io.File;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.time.ZonedDateTime;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

public class SourceWriterIT {

private final SourceWriter sourceWriter = new SourceWriter();
private final ClassCompiler classCompiler = new ClassCompiler();

private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper();

@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().createClassGeneratorFor(addressDefinition);
sourceWriter.write(addressGenerator, generationContext);
final Class<?> addressClass = classCompiler.compile(addressGenerator, sourceOutputDirectory, classesOutputDirectory);

assertThat(addressClass.getName(), is(addressDefinition.getClassName().getFullyQualifiedName()));

final String firstLine = "firstLine";
final String postCode = "postCode";

final Constructor<?> addressConstructor = addressClass.getConstructor(String.class, String.class);
final Object address = addressConstructor.newInstance(firstLine, postCode);


final String addressJson = objectMapper.writeValueAsString(address);

with(addressJson)
.assertThat("$.firstLine", is(firstLine))
.assertThat("$.postCode", is(postCode))
;
}


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)));
addressDefinition.addFieldDefinition(new FieldDefinition("postCode", new ClassName(String.class)));

return addressDefinition;
}

private ClassDefinition employeeDefinition(final String packageName, final ClassDefinition addressDefinition) {
final ClassDefinition employeeDefinition = new ClassDefinition("employee", new ClassName(packageName, "Employee"));
employeeDefinition.addFieldDefinition(new FieldDefinition("firstName", new ClassName(String.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("lastName", new ClassName(String.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("poundsPerHour", new ClassName(BigDecimal.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("startDate", new ClassName(ZonedDateTime.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("favouriteColours", new ClassName(List.class), new ClassName(String.class)));
employeeDefinition.addFieldDefinition(addressDefinition);

return employeeDefinition;
}


}
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package uk.gov.justice.generation.pojo.integration.utils;

import uk.gov.justice.generation.pojo.dom.ClassName;
import uk.gov.justice.generation.pojo.generators.ClassGenerator;
import uk.gov.justice.generation.pojo.generators.ClassGeneratable;
import uk.gov.justice.services.generators.test.utils.compiler.JavaCompilerUtil;

import java.io.File;

public class ClassCompiler {

public Class<?> compile(
final ClassGenerator classGenerator,
final ClassGeneratable classGenerator,
final File sourceDirectory,
final File classesOutputDirectory) {

final ClassName className = classGenerator.getClassDefinition().getClassName();
final ClassName className = classGenerator.getClassName();

final JavaCompilerUtil compiler = new JavaCompilerUtil(sourceDirectory, classesOutputDirectory);
return compiler.compiledClassOf(className.getPackageName(), className.getSimpleName());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package uk.gov.justice.generation.bootstrap;

import static java.lang.String.format;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.write.SourceCodeWriteException;

import java.io.File;

public class GenerationContextFactory {

public GenerationContext create(final File sourceRootDirectory) {

if (! sourceRootDirectory.exists()) {
throw new SourceCodeWriteException(format("Source code root directory '%s' does not exist", sourceRootDirectory.getAbsolutePath()));
}

if (! sourceRootDirectory.isDirectory()) {
throw new SourceCodeWriteException(format("Source code root directory '%s' is not a directory", sourceRootDirectory.getAbsolutePath()));
}

if (! sourceRootDirectory.canWrite()) {
throw new SourceCodeWriteException(format("Source code root directory '%s' is not writable", sourceRootDirectory.getAbsolutePath()));
}

return new GenerationContext(sourceRootDirectory);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package uk.gov.justice.generation.pojo.core;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GenerationContext {

private final File sourceRootDirectory;

public GenerationContext(final File sourceRootDirectory) {
this.sourceRootDirectory = sourceRootDirectory;
}

public File getSourceRootDirectory() {
return sourceRootDirectory;
}

public Logger getLoggerFor(final Class<?> clazz) {
return LoggerFactory.getLogger(clazz);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package uk.gov.justice.generation.pojo.dom;

import static java.util.Collections.unmodifiableList;
import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package uk.gov.justice.generation.pojo.dom;

import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;

import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package uk.gov.justice.generation.pojo.generators;

import uk.gov.justice.generation.pojo.dom.ClassName;

import com.squareup.javapoet.TypeSpec;

public interface ClassGeneratable {

TypeSpec generate();

ClassName getClassName();
}
Loading

0 comments on commit 4fc69e2

Please sign in to comment.