You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/11/14 14:28:00 UTC

[29/32] cayenne git commit: Selection bug fix

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 <an...@gmail.com>
Authored: Wed Nov 14 16:07:07 2018 +0300
Committer: Arseni Bulatski <an...@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());
+    }
 }