Skip to content

Commit

Permalink
Fix bug with duplicated schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Forslund committed Feb 1, 2016
1 parent 31f7bcd commit 69bcb29
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 29 deletions.
7 changes: 4 additions & 3 deletions src/main/java/com/speedment/code/TranslatorDecorator.java
Expand Up @@ -18,7 +18,8 @@


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


/** /**
* *
Expand All @@ -28,6 +29,6 @@
*/ */
@Api(version = "2.3") @Api(version = "2.3")
@FunctionalInterface @FunctionalInterface
public interface TranslatorDecorator<T extends HasMainInterface> { public interface TranslatorDecorator<T extends HasName & HasMainInterface> {
void apply(Translator<T, File> translator); void apply(JavaClassTranslator<T> translator);
} }
19 changes: 10 additions & 9 deletions src/main/java/com/speedment/component/CodeGenerationComponent.java
Expand Up @@ -22,6 +22,7 @@
import com.speedment.code.TranslatorDecorator; import com.speedment.code.TranslatorDecorator;
import com.speedment.code.TranslatorKey; import com.speedment.code.TranslatorKey;
import com.speedment.config.db.trait.HasMainInterface; import com.speedment.config.db.trait.HasMainInterface;
import com.speedment.config.db.trait.HasName;
import com.speedment.exception.SpeedmentException; import com.speedment.exception.SpeedmentException;
import com.speedment.internal.codegen.base.Generator; import com.speedment.internal.codegen.base.Generator;
import com.speedment.internal.codegen.lang.models.File; import com.speedment.internal.codegen.lang.models.File;
Expand Down Expand Up @@ -71,7 +72,7 @@ default Class<CodeGenerationComponent> getComponentClass() {
* @param constructor to use when producing Translators of the specified * @param constructor to use when producing Translators of the specified
* type * type
*/ */
default <T extends HasMainInterface> void put(Class<T> clazz, TranslatorKey<T> tKey, TranslatorConstructor<T> constructor) { default <T extends HasName & HasMainInterface> void put(Class<T> clazz, TranslatorKey<T> tKey, TranslatorConstructor<T> constructor) {
put(clazz, tKey.getKey(), constructor); put(clazz, tKey.getKey(), constructor);
} }


Expand All @@ -86,7 +87,7 @@ default <T extends HasMainInterface> void put(Class<T> clazz, TranslatorKey<T> t
* @param constructor to use when producing Translators of the specified * @param constructor to use when producing Translators of the specified
* type * type
*/ */
<T extends HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor); <T extends HasName & HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor);


/** /**
* Adds a new {@code TranslatorDecorator} for the given class/key pair. * Adds a new {@code TranslatorDecorator} for the given class/key pair.
Expand All @@ -96,7 +97,7 @@ default <T extends HasMainInterface> void put(Class<T> clazz, TranslatorKey<T> t
* @param tKey translatorKey to use * @param tKey translatorKey to use
* @param decorator the new decorator * @param decorator the new decorator
*/ */
default <T extends HasMainInterface> void add(Class<T> clazz, TranslatorKey<T> tKey, TranslatorDecorator<T> decorator) { default <T extends HasName & HasMainInterface> void add(Class<T> clazz, TranslatorKey<T> tKey, TranslatorDecorator<T> decorator) {
add(clazz, tKey.getKey(), decorator); add(clazz, tKey.getKey(), decorator);
} }


Expand All @@ -108,7 +109,7 @@ default <T extends HasMainInterface> void add(Class<T> clazz, TranslatorKey<T> t
* @param key key to use * @param key key to use
* @param decorator the new decorator * @param decorator the new decorator
*/ */
<T extends HasMainInterface> void add(Class<T> clazz, String key, TranslatorDecorator<T> decorator); <T extends HasName & HasMainInterface> void add(Class<T> clazz, String key, TranslatorDecorator<T> decorator);


/** /**
* Removes the {@code TranslatorConstructor} for the given class/key pair. * Removes the {@code TranslatorConstructor} for the given class/key pair.
Expand All @@ -117,7 +118,7 @@ default <T extends HasMainInterface> void add(Class<T> clazz, TranslatorKey<T> t
* @param clazz CLass of the Document * @param clazz CLass of the Document
* @param tKey translatorKey to use * @param tKey translatorKey to use
*/ */
default <T extends HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T> tKey) { default <T extends HasName & HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T> tKey) {
remove(clazz, tKey.getKey()); remove(clazz, tKey.getKey());
} }


Expand All @@ -128,7 +129,7 @@ default <T extends HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T
* @param clazz CLass of the Document * @param clazz CLass of the Document
* @param key key to use * @param key key to use
*/ */
<T extends HasMainInterface> void remove(Class<T> clazz, String key); <T extends HasName & HasMainInterface> void remove(Class<T> clazz, String key);


/** /**
* Returns a Stream of newly created {@code Translator Translators} for the * Returns a Stream of newly created {@code Translator Translators} for the
Expand All @@ -140,7 +141,7 @@ default <T extends HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T
* @return a Stream of newly created {@code Translator Translators} for the * @return a Stream of newly created {@code Translator Translators} for the
* given Document * given Document
*/ */
<T extends HasMainInterface> Stream<? extends Translator<T, File>> translators(T document); <T extends HasName & HasMainInterface> Stream<? extends Translator<T, File>> translators(T document);


/** /**
* Returns a Stream of newly created {@code Translator Translators} for the * Returns a Stream of newly created {@code Translator Translators} for the
Expand All @@ -154,7 +155,7 @@ default <T extends HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T
* given Document * given Document
* @throws SpeedmentException if the specified translator did not exist * @throws SpeedmentException if the specified translator did not exist
*/ */
default <T extends HasMainInterface> Translator<T, File> default <T extends HasName & HasMainInterface> Translator<T, File>
findTranslator(T document, TranslatorKey<T> hasKey) throws SpeedmentException { findTranslator(T document, TranslatorKey<T> hasKey) throws SpeedmentException {
return CodeGenerationComponent.this.findTranslator(document, hasKey.getKey()); return CodeGenerationComponent.this.findTranslator(document, hasKey.getKey());
} }
Expand All @@ -171,7 +172,7 @@ default <T extends HasMainInterface> void remove(Class<T> clazz, TranslatorKey<T
* Document * Document
* @throws SpeedmentException if the specified translator did not exist * @throws SpeedmentException if the specified translator did not exist
*/ */
<T extends HasMainInterface> Translator<T, File> findTranslator(T document, String key) throws SpeedmentException; <T extends HasName & HasMainInterface> Translator<T, File> findTranslator(T document, String key) throws SpeedmentException;


/** /**
* Returns the current {@link JavaLanguageNamer} used by Speedment. * Returns the current {@link JavaLanguageNamer} used by Speedment.
Expand Down
Expand Up @@ -27,7 +27,6 @@
import com.speedment.config.db.Table; import com.speedment.config.db.Table;
import java.util.Optional; import java.util.Optional;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;


/** /**
* *
Expand Down
Expand Up @@ -25,8 +25,6 @@
import com.speedment.internal.util.JavaLanguageNamer; import com.speedment.internal.util.JavaLanguageNamer;
import static com.speedment.internal.util.document.DocumentUtil.relativeName; import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static com.speedment.internal.util.document.DocumentUtil.relativeName;
import static java.util.Objects.requireNonNull;


/** /**
* A more specific {@link Translator} that results in a CodeGen {@link File}. * A more specific {@link Translator} that results in a CodeGen {@link File}.
Expand Down
Expand Up @@ -25,10 +25,12 @@
import com.speedment.config.db.Project; import com.speedment.config.db.Project;
import com.speedment.config.db.Table; import com.speedment.config.db.Table;
import com.speedment.config.db.trait.HasMainInterface; import com.speedment.config.db.trait.HasMainInterface;
import com.speedment.config.db.trait.HasName;
import com.speedment.exception.SpeedmentException; import com.speedment.exception.SpeedmentException;
import com.speedment.internal.codegen.base.Generator; import com.speedment.internal.codegen.base.Generator;
import com.speedment.internal.codegen.java.JavaGenerator; import com.speedment.internal.codegen.java.JavaGenerator;
import com.speedment.internal.codegen.lang.models.File; import com.speedment.internal.codegen.lang.models.File;
import com.speedment.internal.core.code.JavaClassTranslator;
import com.speedment.internal.core.code.entity.EntityImplTranslator; import com.speedment.internal.core.code.entity.EntityImplTranslator;
import com.speedment.internal.core.code.entity.EntityTranslator; import com.speedment.internal.core.code.entity.EntityTranslator;
import com.speedment.internal.core.code.lifecycle.SpeedmentApplicationMetadataTranslator; import com.speedment.internal.core.code.lifecycle.SpeedmentApplicationMetadataTranslator;
Expand All @@ -53,7 +55,7 @@ public final class CodeGenerationComponentImpl extends Apache2AbstractComponent
private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorSettings<?>>> map; private final Map<Class<? extends HasMainInterface>, Map<String, TranslatorSettings<?>>> map;
private Supplier<? extends JavaLanguageNamer> javaLanguageSupplier; private Supplier<? extends JavaLanguageNamer> javaLanguageSupplier;


private final static class TranslatorSettings<T extends HasMainInterface> { private final static class TranslatorSettings<T extends HasName & HasMainInterface> {


private final String key; private final String key;
private final List<TranslatorDecorator<T>> decorators; private final List<TranslatorDecorator<T>> decorators;
Expand All @@ -80,8 +82,11 @@ public List<TranslatorDecorator<T>> decorators() {
return decorators; return decorators;
} }


public Translator<T, File> createDecorated(Speedment speedment, Generator generator, T document) { public JavaClassTranslator<T> createDecorated(Speedment speedment, Generator generator, T document) {
final Translator<T, File> translator = getConstructor().apply(speedment, generator, document); @SuppressWarnings("unchecked")
final JavaClassTranslator<T> translator = (JavaClassTranslator<T>)
getConstructor().apply(speedment, generator, document);

decorators.stream().forEachOrdered(dec -> dec.apply(translator)); decorators.stream().forEachOrdered(dec -> dec.apply(translator));
return translator; return translator;
} }
Expand Down Expand Up @@ -111,38 +116,38 @@ public void setGenerator(Generator generator) {


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public <T extends HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor) { public <T extends HasName & HasMainInterface> void put(Class<T> clazz, String key, TranslatorConstructor<T> constructor) {
aquireTranslatorSettings(clazz, key).setConstructor(constructor); aquireTranslatorSettings(clazz, key).setConstructor(constructor);
} }


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


@Override @Override
public <T extends HasMainInterface> void remove(Class<T> clazz, String key) { public <T extends HasName & HasMainInterface> void remove(Class<T> clazz, String key) {
aquireTranslatorSettings(clazz, key).setConstructor(null); aquireTranslatorSettings(clazz, key).setConstructor(null);
} }


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


@Override @Override
public <T extends HasMainInterface> Stream<? extends Translator<T, File>> translators(T document) { public <T extends HasName & HasMainInterface> Stream<? extends Translator<T, File>> translators(T document) {
return translators(document, s -> true); return translators(document, s -> true);
} }


@Override @Override
public <T extends HasMainInterface> Translator<T, File> findTranslator(T document, String key) { public <T extends HasName & HasMainInterface> Translator<T, File> findTranslator(T document, String key) {
return translators(document, key::equals) return translators(document, key::equals)
.findAny() .findAny()
.orElseThrow(noTranslatorFound(document, key)); .orElseThrow(noTranslatorFound(document, key));
} }


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T extends HasMainInterface> Stream<? extends Translator<T, File>> private <T extends HasName & HasMainInterface> Stream<? extends Translator<T, File>>
translators(T document, Predicate<String> nameFilter) { translators(T document, Predicate<String> nameFilter) {


return MapStream.of(map) return MapStream.of(map)
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/speedment/internal/ui/UISession.java
Expand Up @@ -74,6 +74,7 @@
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.control.SplitPane; import javafx.scene.control.SplitPane;
import static com.speedment.internal.util.TextUtil.alignRight; import static com.speedment.internal.util.TextUtil.alignRight;
import com.speedment.internal.util.document.DocumentUtil;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;


/** /**
Expand Down Expand Up @@ -484,9 +485,9 @@ private void showPasswordDialog(DbmsProperty dbms) {
public <DOC extends DocumentProperty> boolean loadFromDatabase(DbmsProperty dbms, String schemaName) { public <DOC extends DocumentProperty> boolean loadFromDatabase(DbmsProperty dbms, String schemaName) {
try { try {
dbms.schemasProperty().clear(); dbms.schemasProperty().clear();

final Project newProject = new ProjectImpl(dbms.getParent().get().getData()); final Project newProject = DocumentUtil.deepCopy(project, ProjectImpl::new);
final Dbms newDbms = newProject.dbmses().filter(d -> d.getName().equals(dbms.getName())).findAny().get(); final Dbms newDbms = newProject.dbmses().findAny().get();


final DbmsHandler dh = speedment.getDbmsHandlerComponent().make(newDbms); final DbmsHandler dh = speedment.getDbmsHandlerComponent().make(newDbms);
dh.readSchemaMetadata(schemaName::equalsIgnoreCase); dh.readSchemaMetadata(schemaName::equalsIgnoreCase);
Expand Down
Expand Up @@ -43,7 +43,6 @@
import static com.speedment.internal.ui.controller.ToolbarController.ICON_SIZE; import static com.speedment.internal.ui.controller.ToolbarController.ICON_SIZE;
import static javafx.beans.binding.Bindings.createBooleanBinding; import static javafx.beans.binding.Bindings.createBooleanBinding;
import static com.speedment.internal.ui.UISession.ReuseStage.USE_EXISTING_STAGE; import static com.speedment.internal.ui.UISession.ReuseStage.USE_EXISTING_STAGE;
import com.speedment.internal.ui.config.ProjectProperty;
import de.jensd.fx.glyphs.GlyphsDude; import de.jensd.fx.glyphs.GlyphsDude;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon; import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
Expand Down
Expand Up @@ -190,7 +190,48 @@ public static Supplier<NoSuchElementException> newNoSuchElementExceptionFor(Docu
+ ")" + ")"
); );
} }

public static <DOC extends Document> DOC deepCopy(Document document, Function<Map<String, Object>, DOC> constructor) {
return constructor.apply(deepCopyMap(document.getData()));
}

private static <K, V> Map<K, V> deepCopyMap(Map<K, V> original) {
final Map<K, V> copy = new ConcurrentHashMap<>();

MapStream.of(original)
.mapValue(DocumentUtil::deepCopyObject)
.forEachOrdered(copy::put);

return copy;
}

private static <V> List<V> deepCopyList(List<V> original) {
final List<V> copy = new CopyOnWriteArrayList<>();

original.stream()
.map(DocumentUtil::deepCopyObject)
.forEachOrdered(copy::add);

return copy;
}


private static <V> V deepCopyObject(V original) {
if (String.class.isAssignableFrom(original.getClass())
|| Number.class.isAssignableFrom(original.getClass())
|| Boolean.class.isAssignableFrom(original.getClass())
|| Enum.class.isAssignableFrom(original.getClass())) {
return original;
} else if (List.class.isAssignableFrom(original.getClass())) {
return (V) deepCopyList((List<?>) original);
} else if (Map.class.isAssignableFrom(original.getClass())) {
return (V) deepCopyMap((Map<?, ?>) original);
} else {
throw new UnsupportedOperationException(
"Can't deep copy unknown type '" + original.getClass() + "'."
);
}
}

private static final Function<Object, Object> VALUE_MAPPER = o -> { private static final Function<Object, Object> VALUE_MAPPER = o -> {
if (o instanceof List) { if (o instanceof List) {
return "[" + ((List) o).size() + "]"; return "[" + ((List) o).size() + "]";
Expand Down

0 comments on commit 69bcb29

Please sign in to comment.