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 2022/08/19 11:12:39 UTC

[cayenne] branch STABLE-4.2 updated: CAY-2755 Modeler: Entities are not sorted by name in the class generation view

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

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


The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
     new ecf05ef71 CAY-2755 Modeler: Entities are not sorted by name in the class generation view
ecf05ef71 is described below

commit ecf05ef7150382b07797f3e834d7341d5ff7b789
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Fri Aug 19 14:12:26 2022 +0300

    CAY-2755 Modeler: Entities are not sorted by name in the class generation view
---
 RELEASE-NOTES.txt                                  |  2 +
 .../editor/cgen/ClassGenerationValidator.java      | 32 ++++++--
 .../modeler/editor/cgen/ClassesTabController.java  |  4 +-
 .../editor/cgen/CodeGeneratorController.java       | 90 ++++++++++++++++------
 .../modeler/editor/cgen/SelectionModel.java        |  9 ++-
 5 files changed, 100 insertions(+), 37 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 169093b3e..e81cf900f 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -20,6 +20,8 @@ CAY-2750 Deprecate web module
 
 Bug Fixes:
 
+CAY-2755 Modeler: Entities are not sorted by name in the class generation view
+
 
 ----------------------------------
 Release: 4.2.RC1
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
index 05b2c15f0..1658899c2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
@@ -18,8 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.editor.cgen;
 
-import java.util.List;
+import java.util.Collection;
 
+import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.EmbeddedAttribute;
@@ -39,14 +42,27 @@ import org.apache.cayenne.validation.ValidationResult;
  */
 class ClassGenerationValidator {
 
-    ValidationResult getValidationResult(List<Object> classes) {
+    ValidationResult getValidationResult(Collection<? extends ConfigurationNode> classes) {
         ValidationResult validationResult = new ValidationResult();
-        for (Object classObj : classes) {
-            if (classObj instanceof ObjEntity) {
-                validateEntity(validationResult, (ObjEntity) classObj, false);
-            } else if (classObj instanceof Embeddable) {
-                validateEmbeddable(validationResult, (Embeddable) classObj);
-            }
+        for (ConfigurationNode configurationNode : classes) {
+            configurationNode.acceptVisitor(new BaseConfigurationNodeVisitor<Void>() {
+                @Override
+                public Void visitObjEntity(ObjEntity entity) {
+                    validateEntity(validationResult, entity, false);
+                    return null;
+                }
+
+                @Override
+                public Void visitEmbeddable(Embeddable embeddable) {
+                    validateEmbeddable(validationResult, embeddable);
+                    return null;
+                }
+
+                @Override
+                public Void visitDataMap(DataMap dataMap) {
+                    return null;
+                }
+            });
         }
         return validationResult;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
index 6141a7aac..d29a9b697 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
@@ -36,6 +37,7 @@ import javax.swing.Icon;
 import javax.swing.JLabel;
 import javax.swing.table.TableColumnModel;
 import java.awt.Component;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -143,7 +145,7 @@ public class ClassesTabController extends CayenneController {
         }
     }
 
-    public void validate(List<Object> classes) {
+    public void validate(Collection<? extends ConfigurationNode> classes) {
         ClassGenerationValidator validator = new ClassGenerationValidator();
         this.lastValidationResult = validator.getValidationResult(classes);
     }
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 8b85e067c..6ff525915 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
@@ -24,21 +24,22 @@ 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.List;
+import java.util.Comparator;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 import java.util.stream.Collectors;
 
+import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.configuration.event.DataMapListener;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.spi.ModuleLoader;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClassGenerationActionFactory;
@@ -69,7 +70,7 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     private static final Logger LOGGER = LoggerFactory.getLogger(ErrorDebugDialog.class);
 
     protected final ProjectController projectController;
-    protected final List<Object> classes;
+    protected final Set<ConfigurationNode> classes;
     protected final SelectionModel selectionModel;
     protected final CodeGeneratorPane view;
     protected final ClassesTabController classesSelector;
@@ -87,7 +88,10 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         this.view = new CodeGeneratorPane(generatorSelector.getView(), classesSelector.getView());
         this.prevGeneratorController = new ConcurrentHashMap<>();
         this.projectController = projectController;
-        this.classes = new ArrayList<>();
+        this.classes = new TreeSet<>(
+                Comparator.comparing((ConfigurationNode o) -> o.acceptVisitor(TYPE_GETTER))
+                        .thenComparing(o -> o.acceptVisitor(NAME_GETTER))
+        );
         this.selectionModel = new SelectionModel();
         initBindings();
         initListeners();
@@ -142,22 +146,9 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     public void generatorSelectedAction() {
         GeneratorController controller = generatorSelector.getGeneratorController();
         classesSelector.validate(classes);
-
-        Predicate<Object> defaultPredicate = object -> {
-            if (object instanceof ObjEntity) {
-                return classesSelector.getProblem(((ObjEntity) object).getName()) == null;
-            }
-
-            if (object instanceof Embeddable) {
-                return classesSelector.getProblem(((Embeddable) object).getClassName()) == null;
-            }
-            return false;
-        };
-
-        Predicate<Object> predicate = controller != null
+        Predicate<ConfigurationNode> predicate = controller != null
                 ? defaultPredicate
                 : o -> false;
-
         updateSelection(predicate);
         classesSelector.classSelectedAction();
     }
@@ -254,14 +245,14 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
                 .collect(Collectors.toList()));
     }
 
-    public List<Object> getClasses() {
+    public Set<?> getClasses() {
         return classes;
     }
 
-    public boolean updateSelection(Predicate<Object> predicate) {
+    public boolean updateSelection(Predicate<ConfigurationNode> predicate) {
         boolean modified = selectionModel.updateSelection(predicate, classes);
 
-        for (Object classObj : classes) {
+        for (ConfigurationNode classObj : classes) {
             if (classObj instanceof DataMap) {
                 boolean selected = predicate.test(classObj);
                 updateArtifactGenerationMode(selected);
@@ -444,4 +435,55 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
     public CgenConfiguration getCgenConfiguration() {
         return cgenConfiguration;
     }
+
+    private final Predicate<ConfigurationNode> defaultPredicate = o -> o.acceptVisitor(new BaseConfigurationNodeVisitor<Boolean>() {
+        @Override
+        public Boolean visitDataMap(DataMap dataMap) {
+            return false;
+        }
+
+        @Override
+        public Boolean visitObjEntity(ObjEntity entity) {
+            return classesSelector.getProblem(entity.getName()) == null;
+        }
+
+        @Override
+        public Boolean visitEmbeddable(Embeddable embeddable) {
+            return classesSelector.getProblem(embeddable.getClassName()) == null;
+        }
+    });
+
+    private static final ConfigurationNodeVisitor<Integer> TYPE_GETTER = new BaseConfigurationNodeVisitor<Integer>() {
+        @Override
+        public Integer visitDataMap(DataMap dataMap) {
+            return 10;
+        }
+
+        @Override
+        public Integer visitObjEntity(ObjEntity entity) {
+            return 20;
+        }
+
+        @Override
+        public Integer visitEmbeddable(Embeddable embeddable) {
+            return 30;
+        }
+    };
+
+    private static final ConfigurationNodeVisitor<String> NAME_GETTER = new BaseConfigurationNodeVisitor<String>() {
+        @Override
+        public String visitDataMap(DataMap dataMap) {
+            return dataMap.getName();
+        }
+
+        @Override
+        public String visitEmbeddable(Embeddable embeddable) {
+            return embeddable.getClassName();
+        }
+
+        @Override
+        public String visitObjEntity(ObjEntity entity) {
+            return entity.getName();
+        }
+    };
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/SelectionModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/SelectionModel.java
index 3ef4a1e3a..2e561695d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/SelectionModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/SelectionModel.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Predicate;
 
+import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
@@ -59,9 +60,9 @@ class SelectionModel {
         selectedDataMaps = selectedDataMapsForDataMap.computeIfAbsent(dataMap, dm -> new HashSet<>());
     }
 
-    boolean updateSelection(Predicate<Object> predicate, List<Object> classes) {
+    boolean updateSelection(Predicate<ConfigurationNode> predicate, Collection<ConfigurationNode> classes) {
         boolean modified = false;
-        for (Object classObj : classes) {
+        for (ConfigurationNode classObj : classes) {
             boolean select = predicate.test(classObj);
             if (classObj instanceof ObjEntity) {
                 if (select) {
@@ -98,7 +99,7 @@ class SelectionModel {
         return modified;
     }
 
-    List<Embeddable> getSelectedEmbeddables(List<Object> classes) {
+    List<Embeddable> getSelectedEmbeddables(Collection<ConfigurationNode> classes) {
         List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
         for (Object classObj : classes) {
             if (classObj instanceof Embeddable) {
@@ -112,7 +113,7 @@ class SelectionModel {
         return selected;
     }
 
-    List<ObjEntity> getSelectedEntities(List<Object> classes) {
+    List<ObjEntity> getSelectedEntities(Collection<ConfigurationNode> classes) {
         List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
         for (Object classObj : classes) {
             if (classObj instanceof ObjEntity) {