Skip to content

Commit

Permalink
Add translator decorators to CodeGeneratorComponenet
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Forslund committed Jan 29, 2016
1 parent d41c2f5 commit 653c69a
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 18 deletions.
6 changes: 2 additions & 4 deletions src/main/java/com/speedment/code/TranslatorConstructor.java
Expand Up @@ -31,7 +31,5 @@
@Api(version = "2.3")
@FunctionalInterface
public interface TranslatorConstructor<T extends HasMainInterface> {

Translator<T, File> apply(Speedment speedment, Generator cg, T document);

}
Translator<T, File> apply(Speedment speedment, Generator gen, T document);
}
12 changes: 8 additions & 4 deletions src/main/java/com/speedment/code/TranslatorDecorator.java
Expand Up @@ -17,13 +17,17 @@
package com.speedment.code;

import com.speedment.annotation.Api;
import com.speedment.config.db.trait.HasMainInterface;
import com.speedment.internal.codegen.lang.models.File;

/**
*
* @author Emil Forslund
* @since 2.3
* @author Emil Forslund
* @param <T> the document type
* @since 2.3
*/
@Api(version = "2.3")
public interface TranslatorDecorator {

@FunctionalInterface
public interface TranslatorDecorator<T extends HasMainInterface> {
void apply(Translator<T, File> translator);
}
3 changes: 3 additions & 0 deletions src/main/java/com/speedment/code/TranslatorKey.java
Expand Up @@ -16,13 +16,16 @@
*/
package com.speedment.code;

import com.speedment.annotation.Api;
import com.speedment.config.db.trait.HasMainInterface;

/**
*
* @author Per Minborg
* @param <T> Document type
* @since 2.3
*/
@Api(version = "2.3")
public interface TranslatorKey<T extends HasMainInterface> {

String getKey();
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/speedment/component/CodeGenerationComponent.java
Expand Up @@ -19,6 +19,7 @@
import com.speedment.annotation.Api;
import com.speedment.code.TranslatorConstructor;
import com.speedment.code.Translator;
import com.speedment.code.TranslatorDecorator;
import com.speedment.code.TranslatorKey;
import com.speedment.config.db.trait.HasMainInterface;
import com.speedment.exception.SpeedmentException;
Expand Down Expand Up @@ -84,6 +85,28 @@ default <T extends HasMainInterface> void put(Class<T> clazz, TranslatorKey<T> t
* type
*/
<T extends HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor);

/**
* Adds a new {@code TranslatorDecorator} for the given class/key pair.
*
* @param <T> Type of Document
* @param clazz Class of the Document
* @param tKey translatorKey to use
* @param decorator the new decorator
*/
default <T extends HasMainInterface> void add(Class<T> clazz, TranslatorKey<T> tKey, TranslatorDecorator<T> decorator) {
add(clazz, tKey.getKey(), decorator);
}

/**
* Adds a new {@code TranslatorDecorator} for the given class/key pair.
*
* @param <T> Type of Document
* @param clazz Class of the Document
* @param key key to use
* @param decorator the new decorator
*/
<T extends HasMainInterface> void add(Class<T> clazz, String key, TranslatorDecorator<T> decorator);

/**
* Removes the {@code TranslatorConstructor} for the given class/key pair.
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/com/speedment/encoder/JsonEncoder.java
Expand Up @@ -43,6 +43,42 @@
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static com.speedment.util.NullUtil.requireNonNulls;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;

/**
*
Expand Down
Expand Up @@ -56,6 +56,12 @@
import java.util.stream.Stream;
import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull;

/**
*
Expand Down
Expand Up @@ -54,6 +54,30 @@
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentDbUtil.traverseOver;
import static java.util.Objects.requireNonNull;

/**
*
Expand Down
Expand Up @@ -20,7 +20,9 @@
import static com.speedment.code.StandardTranslatorKey.*;
import com.speedment.code.Translator;
import com.speedment.code.TranslatorConstructor;
import com.speedment.code.TranslatorDecorator;
import com.speedment.component.CodeGenerationComponent;
import com.speedment.config.Document;
import com.speedment.config.db.Project;
import com.speedment.config.db.Table;
import com.speedment.config.db.trait.HasMainInterface;
Expand All @@ -40,13 +42,50 @@
import java.util.function.Predicate;
import java.util.stream.Stream;
import com.speedment.internal.util.JavaLanguageNamer;
import java.util.List;
import static java.util.Objects.requireNonNull;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Supplier;

public final class CodeGenerationComponentImpl extends Apache2AbstractComponent implements CodeGenerationComponent {

private Generator generator;
private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorConstructor<HasMainInterface>>> map;
private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorSettings>> map;
private Supplier<? extends JavaLanguageNamer> javaLanguageSupplier;

private final static class TranslatorSettings<T extends HasMainInterface> {

private final String key;
private final List<TranslatorDecorator<T>> decorators;
private TranslatorConstructor<T> constructor;

public TranslatorSettings(String key) {
this.key = requireNonNull(key);
this.decorators = new CopyOnWriteArrayList<>();
}

public String key() {
return key;
}

public TranslatorConstructor<T> getConstructor() {
return constructor;
}

public void setConstructor(TranslatorConstructor<T> constructor) {
this.constructor = constructor;
}

public List<TranslatorDecorator<T>> decorators() {
return decorators;
}

public Translator<T, File> createDecorated(Speedment speedment, Generator generator, T document) {
final Translator<T, File> translator = getConstructor().apply(speedment, generator, document);
decorators.stream().forEachOrdered(dec -> dec.apply(translator));
return translator;
}
}

public CodeGenerationComponentImpl(Speedment speedment) {
super(speedment);
Expand All @@ -73,16 +112,21 @@ public void setGenerator(Generator generator) {
@SuppressWarnings("unchecked")
@Override
public <T extends HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor) {
aquireMap(clazz).put(key, (TranslatorConstructor<HasMainInterface>) constructor);
aquireTranslatorSettings(clazz, key).setConstructor(constructor);
}

@Override
public <T extends HasMainInterface> void remove(Class<T> clazz, String key) {
aquireMap(clazz).remove(key);
public <T extends HasMainInterface> void add(Class<T> clazz, String key, TranslatorDecorator<T> decorator) {
aquireTranslatorSettings(clazz, key).decorators().add(decorator);
}

private <T extends HasMainInterface> Map<String, TranslatorConstructor<HasMainInterface>> aquireMap(Class<T> clazz) {
return map.computeIfAbsent(clazz, s -> new ConcurrentHashMap<>());
@Override
public <T extends HasMainInterface> void remove(Class<T> clazz, String key) {
aquireTranslatorSettings(clazz, key).setConstructor(null);
}

private <T extends HasMainInterface> TranslatorSettings<T> aquireTranslatorSettings(Class<T> clazz, String key) {
return map.computeIfAbsent(clazz, s -> new ConcurrentHashMap<>()).computeIfAbsent(key, TranslatorSettings::new);
}

@Override
Expand All @@ -100,11 +144,12 @@ public <T extends HasMainInterface> Translator<T, File> findTranslator(T documen
@SuppressWarnings("unchecked")
private <T extends HasMainInterface> Stream<? extends Translator<T, File>>
translators(T document, Predicate<String> nameFilter) {

return MapStream.of(map)
.filterKey(c -> c.isInstance(document))
.values()
.flatMap(m -> MapStream.of(m).filterKey(nameFilter).values())
.map(constructor -> ((TranslatorConstructor<T>) constructor).apply(getSpeedment(), generator, document));
.filterKey(c -> c.isInstance(document))
.values()
.flatMap(m -> MapStream.of(m).filterKey(nameFilter).values())
.map(settings -> settings.createDecorated(getSpeedment(), generator, document));
}

@Override
Expand Down
Expand Up @@ -53,6 +53,9 @@
import static javafx.application.Platform.runLater;
import javafx.beans.value.ChangeListener;
import org.w3c.dom.Element;
import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;

/**
*
Expand Down

0 comments on commit 653c69a

Please sign in to comment.