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 2021/12/07 10:13:35 UTC

[cayenne] 01/03: change relationship preservetion function

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 f65bf950b8e1f1d66a1710c04b8aba7cbf03d988
Author: Oleg Khodokevich <ol...@mail.ru>
AuthorDate: Mon Dec 6 19:06:15 2021 +0300

    change relationship preservetion function
---
 .../dialog/objentity/ObjRelationshipInfo.java      | 15 ++++------
 .../apache/cayenne/modeler/util/ProjectUtil.java   | 34 ++++++++++++----------
 2 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
index e173c21..e2d670d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
@@ -52,11 +52,7 @@ import org.apache.cayenne.modeler.dialog.DbRelationshipDialog;
 import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
 import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
-import org.apache.cayenne.modeler.util.EntityTreeRelationshipFilter;
-import org.apache.cayenne.modeler.util.MultiColumnBrowser;
+import org.apache.cayenne.modeler.util.*;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.Util;
@@ -280,10 +276,9 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
                 this.savedDbRelationships = new ArrayList<>(dbRelationships);
             }
         }
-
-        savePath();
-        relationship.getSourceEntity().addRelationship(relationship);
+        configureRelationship();
         if(isCreate) {
+            relationship.getSourceEntity().addRelationship(relationship);
             fireObjRelationshipEvent(this);
             Application.getInstance().getUndoManager().addEdit(
                     new CreateRelationshipUndoableEdit(relationship.getSourceEntity(), new ObjRelationship[]{relationship}));
@@ -541,7 +536,7 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
     /**
      * Stores current state of the model in the internal ObjRelationship.
      */
-    public boolean savePath() {
+    public boolean configureRelationship() {
         boolean hasChanges = false;
 
         boolean oldToMany = relationship.isToMany();
@@ -549,8 +544,8 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
 
         String relationshipName = getRelationshipName();
         if (!Util.nullSafeEquals(relationship.getName(), relationshipName)) {
+            ProjectUtil.setRelationshipName(relationship.getSourceEntity(), relationship, relationshipName);
             hasChanges = true;
-            relationship.setName(relationshipName);
         }
 
         if (savedDbRelationships.size() > 0) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
index 23b20e4..d774415 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
@@ -208,16 +208,19 @@ public class ProjectUtil {
         }
     }
 
-    /** Changes the name of the attribute in all places in DataMap. */
+    /**
+     * Adds or changes the name of the attribute in all places in DataMap.
+     */
     public static void setRelationshipName(Entity entity, Relationship rel, String newName) {
-
-        if (rel == null || rel != entity.getRelationship(rel.getName())) {
-            return;
+        Relationship existingRelationship = entity.getRelationship(newName);
+        if (existingRelationship != null && existingRelationship != rel) {
+            throw new IllegalArgumentException("An attempt to override relationship '" + rel.getName() + "'");
+        }
+        if (rel != null) {
+            entity.removeRelationship(rel.getName());
+            rel.setName(newName);
+            entity.addRelationship(rel);
         }
-
-        entity.removeRelationship(rel.getName());
-        rel.setName(newName);
-        entity.addRelationship(rel);
     }
 
     /**
@@ -253,8 +256,7 @@ public class ProjectUtil {
                             att.setDbAttributePath(null);
                         }
                     }
-                }
-                else {
+                } else {
                     DbAttribute dbAtt = att.getDbAttribute();
                     if (dbAtt != null) {
                         if (dbEnt.getAttribute(dbAtt.getName()) != dbAtt) {
@@ -286,7 +288,7 @@ public class ProjectUtil {
      * objects, each <code>DbRelationship</code> object have  following <code>DbRelationship</code>
      * object as a target, last component is <code>DbAttribute</code>
      *
-     * @param currentEnt current db entity
+     * @param currentEnt      current db entity
      * @param dbAttributePath path to check
      * @return if path is correct return true
      */
@@ -433,7 +435,7 @@ public class ProjectUtil {
 
     public static Collection<ObjEntity> getCollectionOfChildren(ObjEntity objEntity) {
         Collection<ObjEntity> objEntities = new ArrayList<>();
-        for (ObjEntity child: objEntity.getDataMap().getObjEntities()) {
+        for (ObjEntity child : objEntity.getDataMap().getObjEntities()) {
             if (child.isSubentityOf(objEntity)) {
                 objEntities.add(child);
             }
@@ -460,17 +462,17 @@ public class ProjectUtil {
     }
 
     public static Collection<ObjAttribute> findObjAttributesForDbRelationship(ProjectController mediator,
-                                                                               DbRelationship relationship) {
+                                                                              DbRelationship relationship) {
         DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
         List<ObjAttribute> attributes = new ArrayList<>();
         if (domain != null) {
             for (DataMap map : domain.getDataMaps()) {
                 for (ObjEntity entity : map.getObjEntities()) {
                     for (ObjAttribute objAttribute : entity.getAttributes()) {
-                        if(objAttribute.isFlattened()) {
+                        if (objAttribute.isFlattened()) {
                             objAttribute.getDbPathIterator().forEachRemaining(entry -> {
-                                if(entry instanceof DbRelationship) {
-                                    if(entry.equals(relationship)) {
+                                if (entry instanceof DbRelationship) {
+                                    if (entry.equals(relationship)) {
                                         attributes.add(objAttribute);
                                     }
                                 }