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) {