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 #48 from CJSCommonPlatform/add-plugin-context
Browse files Browse the repository at this point in the history
Add PluginContext for generator plugins
  • Loading branch information
allanmckenzie committed Sep 11, 2017
2 parents f3fbbec + 5dbc528 commit 0a6342e
Show file tree
Hide file tree
Showing 18 changed files with 167 additions and 138 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;
import uk.gov.justice.generation.pojo.generators.TypeNameProvider;
import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor;

public class GeneratorFactoryBuilder {

private GenerationContext generationContext;
private PluginProvider pluginProvider;
private ClassNameFactory classNameFactory;

public GeneratorFactoryBuilder withGenerationContext(final GenerationContext generationContext) {
this.generationContext = generationContext;
Expand All @@ -22,6 +21,11 @@ public GeneratorFactoryBuilder withPluginProvider(final PluginProvider pluginPro
return this;
}

public GeneratorFactoryBuilder withClassNameFactory(final ClassNameFactory classNameFactory) {
this.classNameFactory = classNameFactory;
return this;
}

public JavaGeneratorFactory build() {

if (generationContext == null) {
Expand All @@ -32,10 +36,9 @@ public JavaGeneratorFactory build() {
throw new RuntimeException("Please set the PluginProvider before calling build()");
}


final TypeNameProvider typeNameProvider = new TypeNameProvider(generationContext);
final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider);
final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor);
if (classNameFactory == null) {
throw new RuntimeException("Please set the ClassNameFactory before calling build()");
}

return new JavaGeneratorFactory(classNameFactory);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
import uk.gov.justice.generation.io.files.loader.SchemaLoader;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.core.NameGenerator;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;
import uk.gov.justice.generation.pojo.generators.TypeNameProvider;
import uk.gov.justice.generation.pojo.generators.plugin.DefaultPluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext;
import uk.gov.justice.generation.pojo.visitable.Visitable;
import uk.gov.justice.generation.pojo.visitable.VisitableFactory;
import uk.gov.justice.generation.pojo.visitable.acceptor.AcceptorService;
Expand Down Expand Up @@ -47,7 +51,7 @@ public List<Class<?>> generateAndCompileJavaSource(final File jsonSchemaFile,
final String packageName,
final OutputDirectories outputDirectories,
final List<String> ignoredClassNames) {

final GenerationContext generationContext = new GenerationContext(
outputDirectories.getSourceOutputDirectory(),
packageName,
Expand All @@ -68,13 +72,20 @@ public List<Class<?>> generateAndCompileJavaSource(final File jsonSchemaFile,
final GeneratorFactoryBuilder generatorFactoryBuilder = new GeneratorFactoryBuilder();
final PluginProvider pluginProvider = new DefaultPluginProvider();

final TypeNameProvider typeNameProvider = new TypeNameProvider(generationContext);
final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider);
final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor);

final JavaGeneratorFactory javaGeneratorFactory = generatorFactoryBuilder
.withGenerationContext(generationContext)
.withPluginProvider(pluginProvider)
.withClassNameFactory(classNameFactory)
.build();

final PluginContext pluginContext = new PluginContext(javaGeneratorFactory, classNameFactory, generationContext.getSourceFilename());

return javaGeneratorFactory
.createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions(), pluginProvider, generationContext)
.createClassGeneratorsFor(definitionBuilderVisitor.getDefinitions(), pluginProvider, pluginContext, generationContext)
.stream()
.map(classGeneratable -> {
sourceWriter.write(classGeneratable, generationContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.PluginProviderFactory;
import uk.gov.justice.generation.pojo.generators.plugin.TypeNamePluginProcessor;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext;
import uk.gov.justice.generation.pojo.visitable.VisitableFactory;
import uk.gov.justice.generation.pojo.visitable.acceptor.DefaultAcceptorService;
import uk.gov.justice.generation.pojo.visitor.DefaultDefinitionFactory;
Expand Down Expand Up @@ -86,10 +87,10 @@ private List<ClassGeneratable> getClassGeneratorsFrom(
final TypeNamePluginProcessor typeNamePluginProcessor = new TypeNamePluginProcessor(pluginProvider);

final ClassNameFactory classNameFactory = new ClassNameFactory(typeNameProvider, typeNamePluginProcessor);

final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(classNameFactory);
final PluginContext pluginContext = new PluginContext(javaGeneratorFactory, classNameFactory, generationContext.getSourceFilename());

return javaGeneratorFactory.createClassGeneratorsFor(definitions, pluginProvider, generationContext);
return javaGeneratorFactory.createClassGeneratorsFor(definitions, pluginProvider, pluginContext, generationContext);
}

private void writeJavaClassesToFile(final GenerationContext generationContext, final List<ClassGeneratable> classGenerators) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import static com.squareup.javapoet.TypeSpec.classBuilder;
import static javax.lang.model.element.Modifier.PUBLIC;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.TypeSpec;
Expand All @@ -15,20 +15,17 @@ public class ClassGenerator implements ClassGeneratable {

private final ClassDefinition classDefinition;
private final ClassNameFactory classNameFactory;
private final JavaGeneratorFactory javaGeneratorFactory;
private final PluginProvider pluginProvider;
private final GenerationContext generationContext;
private final PluginContext pluginContext;

public ClassGenerator(final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final PluginProvider pluginProvider,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext) {
final PluginProvider pluginProvider,
final PluginContext pluginContext) {
this.classDefinition = classDefinition;
this.classNameFactory = classNameFactory;
this.javaGeneratorFactory = javaGeneratorFactory;
this.pluginProvider = pluginProvider;
this.generationContext = generationContext;
this.pluginContext = pluginContext;
}

@Override
Expand All @@ -38,7 +35,7 @@ public TypeSpec generate() {
.addModifiers(PUBLIC);

pluginProvider.pluginClassGenerators().forEach(plugin ->
plugin.generateWith(typeSpecBuilder, classDefinition, javaGeneratorFactory, classNameFactory, generationContext));
plugin.generateWith(typeSpecBuilder, classDefinition, pluginContext));

return typeSpecBuilder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import uk.gov.justice.generation.pojo.dom.EnumDefinition;
import uk.gov.justice.generation.pojo.dom.FieldDefinition;
import uk.gov.justice.generation.pojo.generators.plugin.PluginProvider;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext;

import java.util.List;

Expand All @@ -31,11 +32,12 @@ public ElementGeneratable createGeneratorFor(final Definition definition) {

public List<ClassGeneratable> createClassGeneratorsFor(final List<Definition> definitions,
final PluginProvider pluginProvider,
final PluginContext pluginContext,
final GenerationContext generationContext) {
return definitions.stream()
.filter(this::isClassOrEnum)
.filter(definition -> isNotHardCoded(definition, generationContext.getIgnoredClassNames()))
.map(definition -> getClassGeneratable(pluginProvider, generationContext, definition))
.map(definition -> getClassGeneratable(pluginProvider, pluginContext, definition))
.collect(toList());
}

Expand All @@ -45,22 +47,21 @@ private boolean isClassOrEnum(final Definition definition) {

private boolean isNotHardCoded(final Definition definition, final List<String> hardCodedClassNames) {
final String className = capitalize(definition.getFieldName());
return ! hardCodedClassNames.contains(className);
return !hardCodedClassNames.contains(className);
}

private ClassGeneratable getClassGeneratable(
final PluginProvider pluginProvider,
final GenerationContext generationContext,
final PluginContext pluginContext,
final Definition definition) {

if (definition.getClass() == EnumDefinition.class) {
return new EnumGenerator((EnumDefinition) definition);
}

return new ClassGenerator((ClassDefinition) definition,
this,
pluginProvider,
classNameFactory,
generationContext);
pluginProvider,
pluginContext);
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
package uk.gov.justice.generation.pojo.generators.plugin.classgenerator;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;

import com.squareup.javapoet.TypeSpec;

public interface ClassGeneratorPlugin {

TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder,
final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext);
final PluginContext pluginContext);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import static uk.gov.justice.generation.pojo.dom.DefinitionType.ROOT;

import uk.gov.justice.domain.annotation.Event;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;

import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.TypeSpec;
Expand All @@ -19,13 +16,11 @@ public class EventAnnotationPlugin implements ClassGeneratorPlugin {
@Override
public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder,
final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext) {
final PluginContext pluginContext) {

if (ROOT.equals(classDefinition.type())) {

final String eventName = removeFileExtensionFrom(generationContext.getSourceFilename());
final String eventName = removeFileExtensionFrom(pluginContext.getSourceFilename());

typeSpecBuilder.addAnnotation(AnnotationSpec.builder(Event.class)
.addMember("value", "$S", eventName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@
import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.PUBLIC;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.dom.Definition;
import uk.gov.justice.generation.pojo.generators.AdditionalPropertiesGenerator;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.ElementGeneratable;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;

import java.util.List;

Expand All @@ -28,15 +26,13 @@ public class FieldAndMethodPlugin implements ClassGeneratorPlugin {
@Override
public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder,
final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext) {
final PluginContext pluginContext) {

final List<Definition> fieldDefinitions = classDefinition.getFieldDefinitions();

final List<ElementGeneratable> fieldGenerators = fieldDefinitions
.stream()
.map(javaGeneratorFactory::createGeneratorFor)
.map(pluginContext.getJavaGeneratorFactory()::createGeneratorFor)
.collect(toList());

final List<FieldSpec> fields = fieldGenerators
Expand All @@ -49,7 +45,7 @@ public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder,
.flatMap(ElementGeneratable::generateMethods)
.collect(toList());

typeSpecBuilder.addMethod(buildConstructor(fieldDefinitions, classNameFactory))
typeSpecBuilder.addMethod(buildConstructor(fieldDefinitions, pluginContext.getClassNameFactory()))
.addFields(fields)
.addMethods(methods);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package uk.gov.justice.generation.pojo.generators.plugin.classgenerator;

import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;

public class PluginContext {
private final JavaGeneratorFactory generatorFactory;
private final ClassNameFactory classNameFactory;
private final String sourceFilename;

public PluginContext(final JavaGeneratorFactory generatorFactory,
final ClassNameFactory classNameFactory,
final String sourceFilename) {
this.generatorFactory = generatorFactory;
this.classNameFactory = classNameFactory;
this.sourceFilename = sourceFilename;
}

public JavaGeneratorFactory getJavaGeneratorFactory() {
return generatorFactory;
}

public ClassNameFactory getClassNameFactory() {
return classNameFactory;
}

public String getSourceFilename() {
return sourceFilename;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import static javax.lang.model.element.Modifier.PRIVATE;
import static javax.lang.model.element.Modifier.STATIC;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;

import java.io.Serializable;

Expand All @@ -23,9 +20,7 @@ public class SerializablePlugin implements ClassGeneratorPlugin {
@Override
public TypeSpec.Builder generateWith(final TypeSpec.Builder typeSpecBuilder,
final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext) {
final PluginContext pluginContext) {

typeSpecBuilder.addSuperinterface(Serializable.class)
.addField(FieldSpec
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package uk.gov.justice.generation.pojo.generators.plugin.classgenerator.builder;

import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.ClassNameFactory;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.ClassGeneratorPlugin;
import uk.gov.justice.generation.pojo.generators.plugin.classgenerator.PluginContext;

import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
Expand All @@ -21,13 +19,11 @@ public BuilderPlugin(final BuilderGeneratorFactory builderGeneratorFactory) {
public TypeSpec.Builder generateWith(
final TypeSpec.Builder outerClassBuilder,
final ClassDefinition classDefinition,
final JavaGeneratorFactory javaGeneratorFactory,
final ClassNameFactory classNameFactory,
final GenerationContext generationContext) {
final PluginContext pluginContext) {

final BuilderGenerator builderGenerator = builderGeneratorFactory.create(
classDefinition,
classNameFactory);
pluginContext.getClassNameFactory());

final TypeSpec innerClassBuilder = builderGenerator.generate();
final MethodSpec staticGetBuilderMethod = builderGenerator.generateStaticGetBuilderMethod();
Expand Down
Loading

0 comments on commit 0a6342e

Please sign in to comment.