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 2020/05/19 11:46:20 UTC

[cayenne] branch master updated: CAY-2591 Modeler: project becomes dirty after click on dbImport or cgen tab

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new b1b7113  CAY-2591 Modeler: project becomes dirty after click on dbImport or cgen tab
b1b7113 is described below

commit b1b7113ed6eb053c49a0f6bd9fc456528c423049
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Tue May 19 14:45:13 2020 +0300

    CAY-2591 Modeler: project becomes dirty after click on dbImport or cgen tab
---
 RELEASE-NOTES.txt                                  |   1 +
 .../org/apache/cayenne/gen/CgenConfiguration.java  |  26 ++--
 .../editor/cgen/CodeGeneratorController.java       | 152 +++++++++------------
 .../modeler/editor/cgen/CustomModeController.java  |  25 +---
 .../editor/cgen/GeneratorTabController.java        |   2 +-
 .../editor/cgen/StandardModeController.java        |   6 -
 6 files changed, 84 insertions(+), 128 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 0f019d0..932d086 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -18,6 +18,7 @@ CAY-2656 Modeler: option to download required jars directly from maven central
 
 Bug Fixes:
 
+CAY-2591 Modeler: project becomes dirty after click on dbImport or cgen tab
 
 ----------------------------------
 Release: 4.2.M1
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 aa0b44c..1912b95 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
@@ -430,18 +430,18 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
     public boolean isDefault() {
         // this must be is sync with actual default values
         return isMakePairs()
-                && isUsePkgPath()
-                && !isOverwrite()
-                && !isCreatePKProperties()
-                && !isCreatePropertyNames()
-                && getOutputPattern().equals("*.java")
-                && (getTemplate().equals(ClassGenerationAction.SUBCLASS_TEMPLATE)
-                    || getTemplate().equals(ClientClassGenerationAction.SUBCLASS_TEMPLATE))
-                && (getSuperTemplate().equals(ClassGenerationAction.SUPERCLASS_TEMPLATE)
-                    || getSuperTemplate().equals(ClientClassGenerationAction.SUPERCLASS_TEMPLATE))
-                && (getSuperPkg() == null
-                    || getSuperPkg().isEmpty())
-                && (getExternalToolConfig() == null
-                    || getExternalToolConfig().isEmpty());
+                && usePkgPath
+                && !overwrite
+                && !createPKProperties
+                && !createPropertyNames
+                && "*.java".equals(outputPattern)
+                && (template.equals(ClassGenerationAction.SUBCLASS_TEMPLATE)
+                    || template.equals(ClientClassGenerationAction.SUBCLASS_TEMPLATE))
+                && (superTemplate.equals(ClassGenerationAction.SUPERCLASS_TEMPLATE)
+                    || superTemplate.equals(ClientClassGenerationAction.SUPERCLASS_TEMPLATE))
+                && (superPkg == null
+                    || superPkg.isEmpty())
+                && (externalToolConfig == null
+                    || externalToolConfig.isEmpty());
     }
 }
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 5af12dc..db214db 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
@@ -68,21 +68,17 @@ import org.slf4j.LoggerFactory;
 public class CodeGeneratorController extends CayenneController implements ObjEntityListener, EmbeddableListener, DataMapListener {
     private static final Logger LOGGER = LoggerFactory.getLogger(ErrorDebugDialog.class);
 
-    public static final String SELECTED_PROPERTY = "selected";
-
-    protected ProjectController projectController;
-
-    protected List<Object> classes;
-    protected SelectionModel selectionModel;
-    protected Object currentClass;
-
-    protected boolean initFromModel;
-
-    protected CodeGeneratorPane view;
-
-    protected ClassesTabController classesSelector;
-    protected GeneratorTabController generatorSelector;
-    private ConcurrentMap<DataMap, GeneratorController> prevGeneratorController;
+    protected final ProjectController projectController;
+    protected final List<Object> classes;
+    protected final SelectionModel selectionModel;
+    protected final CodeGeneratorPane view;
+    protected final ClassesTabController classesSelector;
+    protected final GeneratorTabController generatorSelector;
+    protected final ConcurrentMap<DataMap, GeneratorController> prevGeneratorController;
+
+    private Object currentClass;
+    private CgenConfiguration cgenConfiguration;
+    private boolean initFromModel;
 
     public CodeGeneratorController(ProjectController projectController) {
         super(projectController);
@@ -99,17 +95,21 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
 
     public void initFromModel() {
         initFromModel = true;
-        prepareClasses(projectController.getCurrentDataMap());
         DataMap dataMap = projectController.getCurrentDataMap();
-        classesSelectedAction();
-        CgenConfiguration cgenConfiguration = createConfiguration();
-        GeneratorController modeController = prevGeneratorController.get(dataMap) != null
-                        ? prevGeneratorController.get(dataMap)
-                        : isDefaultConfig(cgenConfiguration)
-                            ? cgenConfiguration != null && cgenConfiguration.isClient()
-                                ? generatorSelector.getClientGeneratorController()
-                                : generatorSelector.getStandartController()
-                            : generatorSelector.getCustomModeController();
+
+        prepareClasses(dataMap);
+        createConfiguration(dataMap);
+
+        GeneratorController modeController = prevGeneratorController.get(dataMap);
+        if(modeController == null) {
+            if(cgenConfiguration.isDefault()) {
+                modeController = cgenConfiguration.isClient()
+                        ? generatorSelector.getClientGeneratorController()
+                        : generatorSelector.getStandartController();
+            } else {
+                modeController = generatorSelector.getCustomModeController();
+            }
+        }
 
         prevGeneratorController.put(dataMap, modeController);
         generatorSelector.setSelectedController(modeController);
@@ -118,10 +118,6 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         classesSelector.validate(classes);
     }
 
-    private boolean isDefaultConfig(CgenConfiguration cgenConfiguration) {
-        return cgenConfiguration == null || cgenConfiguration.isDefault();
-    }
-
     private void initListeners(){
         projectController.addObjEntityListener(this);
         projectController.addEmbeddableListener(this);
@@ -137,7 +133,6 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
 
         builder.bindToAction(view.getGenerateButton(), "generateAction()");
-        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
         builder.bindToAction(generatorSelector, "generatorSelectedAction()",
                 GeneratorTabController.GENERATOR_PROPERTY);
 
@@ -167,14 +162,8 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         classesSelector.classSelectedAction();
     }
 
-    public void classesSelectedAction() {
-        if(!isInitFromModel()) {
-            getProjectController().setDirty(true);
-        }
-    }
-
+    @SuppressWarnings("unused")
     public void generateAction() {
-        CgenConfiguration cgenConfiguration = createConfiguration();
         List<Module> modules = new ModuleLoader()
                 .load(CayenneToolsModuleProvider.class);
         modules.add(binder -> binder.bind(DataChannelMetaData.class)
@@ -217,16 +206,15 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     /**
      * Creates a class generator for provided selections.
      */
-    public CgenConfiguration createConfiguration() {
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
+    public void createConfiguration(DataMap map) {
+        cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
         if(cgenConfiguration != null){
             addToSelectedEntities(cgenConfiguration.getEntities());
             addToSelectedEmbeddables(cgenConfiguration.getEmbeddables());
             cgenConfiguration.setForce(true);
-            return cgenConfiguration;
+            return;
         }
 
-        DataMap map = projectController.getCurrentDataMap();
         cgenConfiguration = new CgenConfiguration(false);
         cgenConfiguration.setForce(true);
         cgenConfiguration.setDataMap(map);
@@ -240,13 +228,13 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
                 Files.createDirectories(basePath);
             } catch (IOException e) {
                 JOptionPane.showMessageDialog(getView(), "Can't create directory. Select a different one.");
-                return null;
+                return;
             }
         }
         // not a directory
         if (!Files.isDirectory(basePath)) {
             JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
-            return null;
+            return;
         }
 
         cgenConfiguration.setRootPath(basePath);
@@ -263,11 +251,6 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
                 .stream()
                 .map(Embeddable::getClassName)
                 .collect(Collectors.toList()));
-
-        getApplication().getMetaData().add(map, cgenConfiguration);
-        projectController.setDirty(true);
-
-        return cgenConfiguration;
     }
 
     public List<Object> getClasses() {
@@ -284,20 +267,16 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
             }
         }
 
-        if (modified) {
-            firePropertyChange(SELECTED_PROPERTY, null, null);
-        }
-
         return modified;
     }
 
     private void updateArtifactGenerationMode(boolean selected) {
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
         if(selected) {
             cgenConfiguration.setArtifactsGenerationMode("all");
         } else {
             cgenConfiguration.setArtifactsGenerationMode("entity");
         }
+        checkCgenConfigDirty();
     }
 
     public boolean isSelected() {
@@ -308,13 +287,7 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         if (currentClass instanceof DataMap) {
             updateArtifactGenerationMode(selectedFlag);
         }
-        if (selectionModel.setSelected(currentClass, selectedFlag)) {
-            firePropertyChange(SELECTED_PROPERTY, null, null);
-        }
-    }
-
-    public Object getCurrentClass() {
-        return currentClass;
+        selectionModel.setSelected(currentClass, selectedFlag);
     }
 
     public void setCurrentClass(Object currentClass) {
@@ -326,29 +299,38 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         updateEmbeddables();
     }
 
-    CgenConfiguration getCurrentConfiguration() {
-        DataMap map = getProjectController().getCurrentDataMap();
-        return projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+    public void checkCgenConfigDirty() {
+        if(initFromModel || cgenConfiguration == null) {
+            return;
+        }
+
+        DataMap map = projectController.getCurrentDataMap();
+        CgenConfiguration existingConfig = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(existingConfig == null) {
+            getApplication().getMetaData().add(map, cgenConfiguration);
+        }
+
+        projectController.setDirty(true);
     }
 
     private void updateEntities() {
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
         if(cgenConfiguration != null) {
             cgenConfiguration.getEntities().clear();
             for(ObjEntity entity: selectionModel.getSelectedEntities(classes)) {
                 cgenConfiguration.loadEntity(entity);
             }
         }
+        checkCgenConfigDirty();
     }
 
     private void updateEmbeddables() {
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
         if(cgenConfiguration != null) {
             cgenConfiguration.getEmbeddables().clear();
             for(Embeddable embeddable : selectionModel.getSelectedEmbeddables(classes)) {
                 cgenConfiguration.loadEmbeddable(embeddable.getClassName());
             }
         }
+        checkCgenConfigDirty();
     }
 
     private void addToSelectedEntities(Collection<String> entities) {
@@ -359,10 +341,8 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     void addEntity(DataMap dataMap, ObjEntity objEntity) {
         prepareClasses(dataMap);
         selectionModel.addSelectedEntity(objEntity.getName());
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
-        if(cgenConfiguration != null) {
-            cgenConfiguration.loadEntity(objEntity);
-        }
+        cgenConfiguration.loadEntity(objEntity);
+        checkCgenConfigDirty();
     }
 
     private void addToSelectedEmbeddables(Collection<String> embeddables) {
@@ -370,7 +350,6 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         updateEmbeddables();
     }
 
-
     public int getSelectedEntitiesSize() {
         return selectionModel.getSelectedEntitiesCount();
     }
@@ -406,11 +385,8 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     @Override
     public void objEntityRemoved(EntityEvent e) {
         selectionModel.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());
-        }
+        cgenConfiguration.getEntities().remove(e.getEntity().getName());
+        checkCgenConfigDirty();
     }
 
     @Override
@@ -421,32 +397,26 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         prepareClasses(map);
         String embeddableClassName = e.getEmbeddable().getClassName();
         selectionModel.addSelectedEmbeddable(embeddableClassName);
-        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
-        if(cgenConfiguration != null) {
-            cgenConfiguration.loadEmbeddable(embeddableClassName);
-        }
+        cgenConfiguration.loadEmbeddable(embeddableClassName);
+        checkCgenConfigDirty();
     }
 
     @Override
     public void embeddableRemoved(EmbeddableEvent e, DataMap map) {
         selectionModel.removeFromSelectedEmbeddables(e.getEmbeddable());
-        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
-        if(cgenConfiguration != null) {
-            cgenConfiguration.getEmbeddables().remove(e.getEmbeddable().getClassName());
-        }
+        cgenConfiguration.getEmbeddables().remove(e.getEmbeddable().getClassName());
+        checkCgenConfigDirty();
     }
 
     @Override
     public void dataMapChanged(DataMapEvent e) {
         if(e.getSource() instanceof DbImportController) {
-            CgenConfiguration cgenConfiguration = getCurrentConfiguration();
-            if(cgenConfiguration != null) {
-                for(ObjEntity objEntity : e.getDataMap().getObjEntities()) {
-                    if(!cgenConfiguration.getExcludeEntityArtifacts().contains(objEntity.getName())) {
-                        addEntity(cgenConfiguration.getDataMap(), objEntity);
-                    }
+            for(ObjEntity objEntity : e.getDataMap().getObjEntities()) {
+                if(!cgenConfiguration.getExcludeEntityArtifacts().contains(objEntity.getName())) {
+                    addEntity(cgenConfiguration.getDataMap(), objEntity);
                 }
             }
+            checkCgenConfigDirty();
         }
     }
 
@@ -455,4 +425,8 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
 
     @Override
     public void dataMapRemoved(DataMapEvent e) {}
+
+    public CgenConfiguration getCgenConfiguration() {
+        return cgenConfiguration;
+    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
index 6d5be73..d051015 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
@@ -139,37 +139,27 @@ public class CustomModeController extends GeneratorController {
                 cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
             }
             initForm(cgenConfiguration);
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
 
         view.getOverwrite().addActionListener(val -> {
             cgenConfiguration.setOverwrite(view.getOverwrite().isSelected());
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
 
         view.getCreatePropertyNames().addActionListener(val -> {
             cgenConfiguration.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
 
         view.getUsePackagePath().addActionListener(val -> {
             cgenConfiguration.setUsePkgPath(view.getUsePackagePath().isSelected());
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
 
         view.getPkProperties().addActionListener(val -> {
             cgenConfiguration.setCreatePKProperties(view.getPkProperties().isSelected());
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
 
         view.getClientMode().addActionListener(val -> {
@@ -195,9 +185,7 @@ public class CustomModeController extends GeneratorController {
                     cgenConfiguration.getRootPath());
             view.getSubclassTemplate().setItem(templateName);
             view.getSuperclassTemplate().setItem(superTemplateName);
-            if(!getParentController().isInitFromModel()) {
-                getParentController().getProjectController().setDirty(true);
-            }
+            getParentController().checkCgenConfigDirty();
         });
     }
 
@@ -213,7 +201,6 @@ public class CustomModeController extends GeneratorController {
         view.getPkProperties().setSelected(cgenConfiguration.isCreatePKProperties());
         view.getSuperPkg().setText(cgenConfiguration.getSuperPkg());
         updateComboBoxes();
-        getParentController().setInitFromModel(false);
     }
 
     @Override
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
index d7a6121..259cb2c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
@@ -78,7 +78,7 @@ public class GeneratorTabController extends CayenneController {
         view.getGenerationMode().addActionListener(action -> {
             String name = (String)view.getGenerationMode().getSelectedItem();
             GeneratorController modeController = getGeneratorController();
-            CgenConfiguration cgenConfiguration = getParentController().createConfiguration();
+            CgenConfiguration cgenConfiguration = getParentController().getCgenConfiguration();
             modeController.updateConfiguration(cgenConfiguration);
             controllers.get(name).initForm(cgenConfiguration);
             getParentController().getPrevGeneratorController().put(cgenConfiguration.getDataMap(), modeController);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
index 90368ab..b3156ed 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -44,12 +44,6 @@ public class StandardModeController extends GeneratorController {
     }
 
     @Override
-    protected void initForm(CgenConfiguration cgenConfiguration) {
-        super.initForm(cgenConfiguration);
-        getParentController().setInitFromModel(false);
-    }
-
-    @Override
     public void updateConfiguration(CgenConfiguration cgenConfiguration) {
         cgenConfiguration.setClient(false);
         cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE);