Selection bug fix
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/5128e66e Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/5128e66e Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/5128e66e Branch: refs/heads/master Commit: 5128e66e36433839ec288296b8cb22d80cb90845 Parents: c19f235 Author: Arseni Bulatski <ancars...@gmail.com> Authored: Wed Nov 14 16:07:07 2018 +0300 Committer: Arseni Bulatski <ancars...@gmail.com> Committed: Wed Nov 14 16:07:07 2018 +0300 ---------------------------------------------------------------------- .../apache/cayenne/gen/CgenConfiguration.java | 34 +++++--- .../dialog/db/load/ModelerDbImportAction.java | 3 + .../editor/cgen/CodeGeneratorController.java | 75 ++++++++++++++-- .../cgen/CodeGeneratorControllerBase.java | 91 ++++++++++++-------- 4 files changed, 150 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java index 1277baa..e03598e 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java @@ -30,9 +30,7 @@ import org.apache.cayenne.util.XMLSerializable; import java.io.Serializable; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import java.util.*; import java.util.stream.Collectors; /** @@ -45,9 +43,9 @@ import java.util.stream.Collectors; public class CgenConfiguration implements Serializable, XMLSerializable { private Collection<Artifact> artifacts; - private Collection<String> entityArtifacts; + private Set<String> entityArtifacts; private Collection<String> excludeEntityArtifacts; - private Collection<String> embeddableArtifacts; + private Set<String> embeddableArtifacts; private Collection<String> excludeEmbeddableArtifacts; private String superPkg; @@ -87,9 +85,9 @@ public class CgenConfiguration implements Serializable, XMLSerializable { setArtifactsGenerationMode("entity"); this.artifacts = new ArrayList<>(); - this.entityArtifacts = new ArrayList<>(); + this.entityArtifacts = new HashSet<>(); this.excludeEntityArtifacts = new ArrayList<>(); - this.embeddableArtifacts = new ArrayList<>(); + this.embeddableArtifacts = new HashSet<>(); this.excludeEmbeddableArtifacts = new ArrayList<>(); this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY; @@ -286,11 +284,11 @@ public class CgenConfiguration implements Serializable, XMLSerializable { return artifacts; } - public Collection<String> getEntities() { + public Set<String> getEntities() { return entityArtifacts; } - public Collection<String> getEmbeddables() { + public Set<String> getEmbeddables() { return embeddableArtifacts; } @@ -310,8 +308,10 @@ public class CgenConfiguration implements Serializable, XMLSerializable { return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : relPath; } - public void loadEntity(String name) { - entityArtifacts.add(name); + public void loadEntity(ObjEntity entity) { + if(!entity.isGeneric()) { + entityArtifacts.add(entity.getName()); + } } public void loadEmbeddable(String name) { @@ -349,7 +349,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable { .stream() .filter(entity -> !excludeEntityArtifacts.contains(entity.getName())) .map(ObjEntity::getName) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } public void resolveExcludeEmbeddables() { @@ -357,9 +357,17 @@ public class CgenConfiguration implements Serializable, XMLSerializable { .stream() .filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName())) .map(Embeddable::getClassName) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } + public Collection<String> getExcludeEntityArtifacts() { + return excludeEntityArtifacts; + } + + public Collection<String> getExcludeEmbeddableArtifacts() { + return excludeEmbeddableArtifacts; + } + @Override public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { encoder.start("cgen") http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java index 0c5c729..e0f01e3 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java @@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.dialog.db.load; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.configuration.DataChannelDescriptorLoader; import org.apache.cayenne.configuration.DataMapLoader; +import org.apache.cayenne.configuration.event.DataMapEvent; import org.apache.cayenne.configuration.server.DataSourceFactory; import org.apache.cayenne.configuration.server.DbAdapterFactory; import org.apache.cayenne.configuration.xml.DataChannelMetaData; @@ -29,6 +30,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider; import org.apache.cayenne.dbsync.merge.token.MergerToken; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.modeler.Application; import org.apache.cayenne.project.ProjectSaver; import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration; import org.apache.cayenne.dbsync.reverse.dbimport.DefaultDbImportAction; @@ -73,6 +75,7 @@ public class ModelerDbImportAction extends DefaultDbImportAction { public void commit() throws Exception { commit(config, sourceDataMap); + Application.getInstance().getFrameController().getProjectController().fireDataMapEvent(new DataMapEvent(this, targetMap)); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java index 0785820..9db6135 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java @@ -19,20 +19,27 @@ package org.apache.cayenne.modeler.editor.cgen; +import org.apache.cayenne.configuration.event.DataMapEvent; +import org.apache.cayenne.configuration.event.DataMapListener; import org.apache.cayenne.gen.CgenConfiguration; import org.apache.cayenne.gen.ClassGenerationAction; import org.apache.cayenne.gen.ClientClassGenerationAction; import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.map.event.EmbeddableEvent; +import org.apache.cayenne.map.event.EmbeddableListener; +import org.apache.cayenne.map.event.EntityEvent; +import org.apache.cayenne.map.event.ObjEntityListener; import org.apache.cayenne.modeler.ProjectController; import org.apache.cayenne.modeler.dialog.ErrorDebugDialog; +import org.apache.cayenne.modeler.dialog.db.load.ModelerDbImportAction; import org.apache.cayenne.modeler.util.CayenneController; import org.apache.cayenne.swing.BindingBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.JOptionPane; -import java.awt.Component; -import java.util.Collections; +import javax.swing.*; +import java.awt.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Predicate; @@ -41,7 +48,7 @@ import java.util.function.Predicate; * @since 4.1 * A controller for the class generator dialog. */ -public class CodeGeneratorController extends CodeGeneratorControllerBase { +public class CodeGeneratorController extends CodeGeneratorControllerBase implements ObjEntityListener, EmbeddableListener, DataMapListener { /** * Logger to print stack traces */ @@ -86,8 +93,9 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase { } private void initListeners(){ - projectController.addObjEntityDisplayListener(e -> super.addToSelectedEntities(e.getEntity().getDataMap(), Collections.singleton(e.getEntity().getName()))); - projectController.addEmbeddableDisplayListener(e -> super.addToSelectedEmbeddables(e.getEmbeddable().getDataMap(), Collections.singleton(e.getEmbeddable().getClassName()))); + projectController.addObjEntityListener(this); + projectController.addEmbeddableListener(this); + projectController.addDataMapListener(this); } @Override @@ -189,4 +197,59 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase { public void enableGenerateButton(boolean enable) { ((GeneratorTabPanel)generatorSelector.getView()).getGenerateButton().setEnabled(enable); } + + @Override + public void objEntityChanged(EntityEvent e) {} + + @Override + public void objEntityAdded(EntityEvent e) { + super.addEntity(e.getEntity().getDataMap(), (ObjEntity) e.getEntity()); + } + + @Override + public void objEntityRemoved(EntityEvent e) { + super.removeFromSelectedEntities((ObjEntity) e.getEntity()); + DataMap map = e.getEntity().getDataMap(); + CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); + if(cgenConfiguration != null) { + cgenConfiguration.getEntities().remove(e.getEntity().getName()); + } + } + + @Override + public void embeddableChanged(EmbeddableEvent e, DataMap map) {} + + @Override + public void embeddableAdded(EmbeddableEvent e, DataMap map) { + super.addEmbeddable(e.getEmbeddable().getDataMap(), e.getEmbeddable()); + } + + @Override + public void embeddableRemoved(EmbeddableEvent e, DataMap map) { + super.removeFromSelectedEmbeddables(e.getEmbeddable()); + CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); + if(cgenConfiguration != null) { + cgenConfiguration.getEmbeddables().remove(e.getEmbeddable().getClassName()); + } + } + + @Override + public void dataMapChanged(DataMapEvent e) { + if(e.getSource() instanceof ModelerDbImportAction) { + CgenConfiguration cgenConfiguration = getCurrentConfiguration(); + if(cgenConfiguration != null) { + for(ObjEntity objEntity : dataMap.getObjEntities()) { + if(!cgenConfiguration.getExcludeEntityArtifacts().contains(objEntity.getName())) { + addEntity(cgenConfiguration.getDataMap(), objEntity); + } + } + } + } + } + + @Override + public void dataMapAdded(DataMapEvent e) {} + + @Override + public void dataMapRemoved(DataMapEvent e) {} } http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java index 21a3736..1c41cb8 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java @@ -32,20 +32,13 @@ import org.apache.cayenne.modeler.util.ModelerUtil; import org.apache.cayenne.validation.ValidationFailure; import org.apache.cayenne.validation.ValidationResult; -import javax.swing.Icon; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import java.awt.Component; +import javax.swing.*; +import java.awt.*; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.List; import java.util.function.Predicate; import java.util.prefs.Preferences; @@ -114,8 +107,8 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { DataMap map = projectController.getCurrentDataMap(); CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); if(cgenConfiguration != null){ - addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities()); - addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables()); + addToSelectedEntities(cgenConfiguration.getEntities()); + addToSelectedEmbeddables(cgenConfiguration.getEmbeddables()); cgenConfiguration.setForce(true); return cgenConfiguration; } @@ -149,11 +142,11 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { if (preferences != null) { cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null)); } - addToSelectedEntities(map, map.getObjEntities() + addToSelectedEntities(map.getObjEntities() .stream() .map(Entity::getName) .collect(Collectors.toList())); - addToSelectedEmbeddables(map, map.getEmbeddables() + addToSelectedEmbeddables(map.getEmbeddables() .stream() .map(Embeddable::getClassName) .collect(Collectors.toList())); @@ -247,25 +240,28 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { return modified; } - public List<Embeddable> getSelectedEmbeddables() { + private List<Embeddable> getSelectedEmbeddables() { List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size()); for (Object classObj : classes) { - if (classObj instanceof Embeddable - && selectedEmbeddables.contains(((Embeddable) classObj) - .getClassName())) { - selected.add((Embeddable) classObj); + if(classObj instanceof Embeddable) { + String name = ((Embeddable) classObj).getClassName(); + if(selectedEmbeddables.contains(name)) { + selected.add((Embeddable) classObj); + } } } return selected; } - public List<ObjEntity> getSelectedEntities() { + private List<ObjEntity> getSelectedEntities() { List<ObjEntity> selected = new ArrayList<>(selectedEntities.size()); for (Object classObj : classes) { - if (classObj instanceof ObjEntity - && selectedEntities.contains(((ObjEntity) classObj).getName())) { - selected.add(((ObjEntity) classObj)); + if(classObj instanceof ObjEntity) { + String name = ((ObjEntity) classObj).getName(); + if(selectedEntities.contains(name)) { + selected.add(((ObjEntity) classObj)); + } } } @@ -392,22 +388,23 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { updateEmbeddables(); } - public void updateEntities() { + CgenConfiguration getCurrentConfiguration() { DataMap map = getProjectController().getCurrentDataMap(); - CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); + return projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); + } + + private void updateEntities() { + CgenConfiguration cgenConfiguration = getCurrentConfiguration(); if(cgenConfiguration != null) { cgenConfiguration.getEntities().clear(); for(ObjEntity entity: getSelectedEntities()) { - if(!entity.isGeneric()) { - cgenConfiguration.loadEntity(entity.getName()); - } + cgenConfiguration.loadEntity(entity); } } } - public void updateEmbeddables() { - DataMap map = getProjectController().getCurrentDataMap(); - CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class); + private void updateEmbeddables() { + CgenConfiguration cgenConfiguration = getCurrentConfiguration(); if(cgenConfiguration != null) { cgenConfiguration.getEmbeddables().clear(); for(Embeddable embeddable : getSelectedEmbeddables()) { @@ -416,18 +413,34 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { } } - void addToSelectedEntities(DataMap dataMap, Collection<String> entities) { - prepareClasses(dataMap); + private void addToSelectedEntities(Collection<String> entities) { selectedEntities.addAll(entities); updateEntities(); } - void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) { + void addEntity(DataMap dataMap, ObjEntity objEntity) { prepareClasses(dataMap); + selectedEntities.add(objEntity.getName()); + CgenConfiguration cgenConfiguration = getCurrentConfiguration(); + if(cgenConfiguration != null) { + cgenConfiguration.loadEntity(objEntity); + } + } + + private void addToSelectedEmbeddables(Collection<String> embeddables) { selectedEmbeddables.addAll(embeddables); updateEmbeddables(); } + void addEmbeddable(DataMap dataMap, Embeddable embeddable) { + prepareClasses(dataMap); + selectedEmbeddables.add(embeddable.getClassName()); + CgenConfiguration cgenConfiguration = getCurrentConfiguration(); + if(cgenConfiguration != null) { + cgenConfiguration.loadEmbeddable(embeddable.getClassName()); + } + } + public int getSelectedEntitiesSize() { return selectedEntities != null ? selectedEntities.size() : 0; } @@ -466,4 +479,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { public abstract void enableGenerateButton(boolean enabled); + + void removeFromSelectedEntities(ObjEntity objEntity) { + initCollectionsForSelection(objEntity.getDataMap()); + selectedEntities.remove(objEntity.getName()); + } + + void removeFromSelectedEmbeddables(Embeddable embeddable) { + initCollectionsForSelection(embeddable.getDataMap()); + selectedEmbeddables.remove(embeddable.getClassName()); + } }