Skip to content

Commit

Permalink
generator-translator: Introduce functional interfaces to make transla…
Browse files Browse the repository at this point in the history
…tor creation more typesafe
  • Loading branch information
Emil Forslund committed Jun 11, 2018
1 parent c5a7650 commit 140044c
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 24 deletions.
Expand Up @@ -17,13 +17,14 @@
package com.speedment.generator.translator.component; package com.speedment.generator.translator.component;


import com.speedment.common.codegen.model.ClassOrInterface; import com.speedment.common.codegen.model.ClassOrInterface;
import com.speedment.common.codegen.model.Enum;
import com.speedment.common.codegen.model.Interface;
import com.speedment.common.injector.annotation.InjectKey; import com.speedment.common.injector.annotation.InjectKey;
import com.speedment.generator.translator.Translator; import com.speedment.generator.translator.Translator;
import com.speedment.generator.translator.TranslatorConstructor; import com.speedment.generator.translator.TranslatorConstructor;
import com.speedment.generator.translator.TranslatorDecorator; import com.speedment.generator.translator.TranslatorDecorator;
import com.speedment.generator.translator.TranslatorKey; import com.speedment.generator.translator.TranslatorKey;
import com.speedment.generator.translator.component.function.GenerateClass;
import com.speedment.generator.translator.component.function.GenerateEnum;
import com.speedment.generator.translator.component.function.GenerateInterface;
import com.speedment.generator.translator.exception.SpeedmentTranslatorException; import com.speedment.generator.translator.exception.SpeedmentTranslatorException;
import com.speedment.runtime.config.Dbms; import com.speedment.runtime.config.Dbms;
import com.speedment.runtime.config.Project; import com.speedment.runtime.config.Project;
Expand All @@ -32,7 +33,6 @@
import com.speedment.runtime.config.trait.HasMainInterface; import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;


import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;


/** /**
Expand All @@ -53,7 +53,7 @@ public interface CodeGenerationComponent {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newClass(Function<Project, com.speedment.common.codegen.model.Class> creator); CodeGenerationComponent newClass(GenerateClass<Project> creator);


/** /**
* Creates a new dynamic code translator and adds it to this component. The * Creates a new dynamic code translator and adds it to this component. The
Expand All @@ -63,7 +63,7 @@ public interface CodeGenerationComponent {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newEnum(Function<Project, Enum> creator); CodeGenerationComponent newEnum(GenerateEnum<Project> creator);


/** /**
* Creates a new dynamic code translator and adds it to this component. The * Creates a new dynamic code translator and adds it to this component. The
Expand All @@ -73,7 +73,7 @@ public interface CodeGenerationComponent {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newInterface(Function<Project, Interface> creator); CodeGenerationComponent newInterface(GenerateInterface<Project> creator);


/** /**
* Creates a new dynamic code translator by first creating a * Creates a new dynamic code translator by first creating a
Expand Down
@@ -1,14 +1,15 @@
package com.speedment.generator.translator.component; package com.speedment.generator.translator.component;


import com.speedment.common.codegen.model.Class; import com.speedment.generator.translator.component.function.GenerateClass;
import com.speedment.common.codegen.model.Enum; import com.speedment.generator.translator.component.function.GenerateEnum;
import com.speedment.common.codegen.model.Interface; import com.speedment.generator.translator.component.function.GenerateInterface;
import com.speedment.runtime.config.trait.HasMainInterface; import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;


import java.util.function.Function;

/** /**
* Appender to the {@link CodeGenerationComponent} used to configure new
* translators.
*
* @author Emil Forslund * @author Emil Forslund
* @since 3.1.4 * @since 3.1.4
*/ */
Expand All @@ -22,7 +23,7 @@ public interface TranslatorAppender<DOC extends HasName & HasMainInterface> {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newClass(Function<DOC, Class> creator); CodeGenerationComponent newClass(GenerateClass<DOC> creator);


/** /**
* Creates a new dynamic code translator and adds it to this component. The * Creates a new dynamic code translator and adds it to this component. The
Expand All @@ -32,7 +33,7 @@ public interface TranslatorAppender<DOC extends HasName & HasMainInterface> {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newEnum(Function<DOC, Enum> creator); CodeGenerationComponent newEnum(GenerateEnum<DOC> creator);


/** /**
* Creates a new dynamic code translator and adds it to this component. The * Creates a new dynamic code translator and adds it to this component. The
Expand All @@ -42,6 +43,6 @@ public interface TranslatorAppender<DOC extends HasName & HasMainInterface> {
* @return this component * @return this component
* @since 3.1.4 * @since 3.1.4
*/ */
CodeGenerationComponent newInterface(Function<DOC, Interface> creator); CodeGenerationComponent newInterface(GenerateInterface<DOC> creator);


} }
@@ -0,0 +1,16 @@
package com.speedment.generator.translator.component.function;

import com.speedment.common.codegen.model.Class;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName;

/**
* Specialization of {@link GeneratorFunction} that produces a CodeGen
* {@code Class}.
*
* @author Emil Forslund
* @since 3.1.4
*/
@FunctionalInterface
public interface GenerateClass<DOC extends HasName & HasMainInterface>
extends GeneratorFunction<DOC, Class> {}
@@ -0,0 +1,16 @@
package com.speedment.generator.translator.component.function;

import com.speedment.common.codegen.model.Enum;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName;

/**
* Specialization of {@link GeneratorFunction} that produces a CodeGen
* {@code Enum}.
*
* @author Emil Forslund
* @since 3.1.4
*/
@FunctionalInterface
public interface GenerateEnum<DOC extends HasName & HasMainInterface>
extends GeneratorFunction<DOC, Enum> {}
@@ -0,0 +1,16 @@
package com.speedment.generator.translator.component.function;

import com.speedment.common.codegen.model.Interface;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName;

/**
* Specialization of {@link GeneratorFunction} that produces a CodeGen
* {@code Interface}.
*
* @author Emil Forslund
* @since 3.1.4
*/
@FunctionalInterface
public interface GenerateInterface<DOC extends HasName & HasMainInterface>
extends GeneratorFunction<DOC, Interface> {}
@@ -0,0 +1,43 @@
package com.speedment.generator.translator.component.function;

import com.speedment.common.codegen.model.Class;
import com.speedment.common.codegen.model.ClassOrInterface;
import com.speedment.common.codegen.model.Enum;
import com.speedment.common.codegen.model.Interface;
import com.speedment.runtime.config.Project;
import com.speedment.runtime.config.Table;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName;

/**
* Specialized function that takes a Speedment configuration document (like
* {@link Project}, {@link Table}, etc) and returns a CodeGen model (like
* {@link Class}, {@link Interface} or {@link Enum}).
*
* @author Emil Forslund
* @since 3.1.4
*/
@FunctionalInterface
public interface GeneratorFunction<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> {

/**
* Generates a CodeGen model from the specified document.
*
* @param document the document to generate from
* @return the created codegen model
*/
T generate(DOC document);

/**
* Returns {@code true} if classes created by this generator should be
* placed in the {@code .generated}-folder that is regenerated each time
* Speedment is invoked.
* <p>
* The default value of this method is {@code false}.
*
* @return {@code true} if results should be put in the generated package
*/
default boolean inGeneratedPackage() {
return false;
}
}
Expand Up @@ -7,6 +7,7 @@
import com.speedment.generator.translator.JavaClassTranslator; import com.speedment.generator.translator.JavaClassTranslator;
import com.speedment.generator.translator.Translator; import com.speedment.generator.translator.Translator;
import com.speedment.generator.translator.TranslatorSupport; import com.speedment.generator.translator.TranslatorSupport;
import com.speedment.generator.translator.component.function.GeneratorFunction;
import com.speedment.runtime.config.Document; import com.speedment.runtime.config.Document;
import com.speedment.runtime.config.trait.HasMainInterface; import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName; import com.speedment.runtime.config.trait.HasName;
Expand All @@ -30,14 +31,14 @@ public final class SimpleTranslator
implements JavaClassTranslator<DOC, T> { implements JavaClassTranslator<DOC, T> {


private final Injector injector; private final Injector injector;
private final Function<DOC, T> creator; private final GeneratorFunction<DOC, T> creator;
private final DOC document; private final DOC document;
private final boolean generated; private final boolean generated;


public SimpleTranslator( public SimpleTranslator(
Injector injector, Injector injector,
DOC document, DOC document,
Function<DOC, T> creator, GeneratorFunction<DOC, T> creator,
boolean generated) { boolean generated) {


this.creator = requireNonNull(creator); this.creator = requireNonNull(creator);
Expand All @@ -48,7 +49,7 @@ public SimpleTranslator(


@Override @Override
public File get() { public File get() {
final T generated = creator.apply(document); final T generated = creator.generate(document);
final File file = File.of(getSupport().baseDirectoryName() + "/" final File file = File.of(getSupport().baseDirectoryName() + "/"
+ (isInGeneratedPackage() ? "generated/" : "") + (isInGeneratedPackage() ? "generated/" : "")
+ generated.getName() + ".java" + generated.getName() + ".java"
Expand Down
Expand Up @@ -30,6 +30,9 @@
import com.speedment.generator.translator.component.CodeGenerationComponent; import com.speedment.generator.translator.component.CodeGenerationComponent;
import com.speedment.generator.translator.component.DecoratorBuilder; import com.speedment.generator.translator.component.DecoratorBuilder;
import com.speedment.generator.translator.component.TranslatorAppender; import com.speedment.generator.translator.component.TranslatorAppender;
import com.speedment.generator.translator.component.function.GenerateClass;
import com.speedment.generator.translator.component.function.GenerateEnum;
import com.speedment.generator.translator.component.function.GenerateInterface;
import com.speedment.generator.translator.exception.SpeedmentTranslatorException; import com.speedment.generator.translator.exception.SpeedmentTranslatorException;
import com.speedment.generator.translator.internal.SimpleTranslator; import com.speedment.generator.translator.internal.SimpleTranslator;
import com.speedment.runtime.config.Dbms; import com.speedment.runtime.config.Dbms;
Expand All @@ -44,7 +47,6 @@
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
Expand All @@ -62,7 +64,7 @@ public CodeGenerationComponentImpl() {
} }


@Override @Override
public CodeGenerationComponent newClass(Function<Project, com.speedment.common.codegen.model.Class> creator) { public CodeGenerationComponent newClass(GenerateClass<Project> creator) {
put(Project.class, put(Project.class,
com.speedment.common.codegen.model.Class.class, com.speedment.common.codegen.model.Class.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand All @@ -71,7 +73,7 @@ public CodeGenerationComponent newClass(Function<Project, com.speedment.common.c
} }


@Override @Override
public CodeGenerationComponent newEnum(Function<Project, Enum> creator) { public CodeGenerationComponent newEnum(GenerateEnum<Project> creator) {
put(Project.class, put(Project.class,
Enum.class, Enum.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand All @@ -80,7 +82,7 @@ public CodeGenerationComponent newEnum(Function<Project, Enum> creator) {
} }


@Override @Override
public CodeGenerationComponent newInterface(Function<Project, Interface> creator) { public CodeGenerationComponent newInterface(GenerateInterface<Project> creator) {
put(Project.class, put(Project.class,
Interface.class, Interface.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand Down Expand Up @@ -312,7 +314,7 @@ public TranslatorAppenderImpl(Class<DOC> docClass) {
} }


@Override @Override
public CodeGenerationComponent newClass(Function<DOC, com.speedment.common.codegen.model.Class> creator) { public CodeGenerationComponent newClass(GenerateClass<DOC> creator) {
put(docClass, put(docClass,
com.speedment.common.codegen.model.Class.class, com.speedment.common.codegen.model.Class.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand All @@ -321,7 +323,7 @@ public CodeGenerationComponent newClass(Function<DOC, com.speedment.common.codeg
} }


@Override @Override
public CodeGenerationComponent newEnum(Function<DOC, Enum> creator) { public CodeGenerationComponent newEnum(GenerateEnum<DOC> creator) {
put(docClass, put(docClass,
Enum.class, Enum.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand All @@ -330,7 +332,7 @@ public CodeGenerationComponent newEnum(Function<DOC, Enum> creator) {
} }


@Override @Override
public CodeGenerationComponent newInterface(Function<DOC, Interface> creator) { public CodeGenerationComponent newInterface(GenerateInterface<DOC> creator) {
put(docClass, put(docClass,
Interface.class, Interface.class,
creator.getClass().getName(), creator.getClass().getName(),
Expand Down

0 comments on commit 140044c

Please sign in to comment.