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
commit 68352c2b62fd61c2f2dda5f34df5307c9fb4dc51 Author: Nikita Timofeev <stari...@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 | 87 ++++++++++++++++------ .../modeler/editor/cgen/SelectionModel.java | 9 ++- 5 files changed, 100 insertions(+), 34 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 7458cf8dd..ee8f8b6f1 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -26,3 +26,5 @@ CAY-2754 Add SELF property to the cgen templates Bug Fixes: +CAY-2755 Modeler: Entities are not sorted by name in the class generation view + 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 75102271c..59dca0c12 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); - } 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); + 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 624eb6e55..46b837915 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,15 +24,19 @@ 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; @@ -67,7 +71,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; @@ -85,7 +89,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(); @@ -138,22 +145,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(); } @@ -250,14 +244,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); @@ -440,4 +434,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) {