You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/11/10 22:13:50 UTC

svn commit: r1407886 - /cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/

Author: aadamchik
Date: Sat Nov 10 21:13:49 2012
New Revision: 1407886

URL: http://svn.apache.org/viewvc?rev=1407886&view=rev
Log:
CAY-1757 ROP: Faulting entity relationship resets uncommitted modifications made to its reverse relationship

fix

(cherry picked from commit 42dae0c92f721cae3e7cdb428766649f7f2171e0)

Modified:
    cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
    cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
    cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
    cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
    cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java

Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java?rev=1407886&r1=1407885&r2=1407886&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java Sat Nov 10 21:13:49 2012
@@ -162,4 +162,9 @@ public class PersistentObjectHolder exte
 
         fault = false;
     }
+    
+    @Override
+    protected void mergeLocalChanges(List resolved) {
+        // noop
+    }
 }

Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java?rev=1407886&r1=1407885&r2=1407886&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java Sat Nov 10 21:13:49 2012
@@ -298,10 +298,7 @@ public class PersistentObjectList extend
                 // now that we obtained the lock, check
                 // if another thread just resolved the list
                 if (isFault()) {
-                    List localList = resolveFromDB();
-
-                    mergeLocalChanges(localList);
-                    this.objectList = localList;
+                    this.objectList = resolveFromDB();
                 }
             }
         }

Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java?rev=1407886&r1=1407885&r2=1407886&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java Sat Nov 10 21:13:49 2012
@@ -67,6 +67,11 @@ public class PersistentObjectMap extends
     public void invalidate() {
         setObjectMap(null);
     }
+    
+    @Override
+    protected void mergeLocalChanges(List resolved) {
+        // TODO implement
+    }
 
     public boolean isFault() {
 

Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java?rev=1407886&r1=1407885&r2=1407886&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java Sat Nov 10 21:13:49 2012
@@ -235,8 +235,6 @@ public class PersistentObjectSet extends
                 // if another thread just resolved the list
                 if (isFault()) {
                     List localList = resolveFromDB();
-
-                    mergeLocalChanges(localList);
                     this.objectSet = new HashSet(localList);
                 }
             }
@@ -249,8 +247,9 @@ public class PersistentObjectSet extends
         addedToUnresolved = null;
         removedFromUnresolved = null;
     }
-
-    void mergeLocalChanges(List fetchedList) {
+    
+    @Override
+    protected void mergeLocalChanges(List resolved) {
 
         // only merge if an object is in an uncommitted state
         // any other state means that our local tracking
@@ -258,7 +257,7 @@ public class PersistentObjectSet extends
         if (isUncommittedParent()) {
 
             if (removedFromUnresolved != null) {
-                fetchedList.removeAll(removedFromUnresolved);
+                resolved.removeAll(removedFromUnresolved);
             }
 
             // add only those that are not already on the list
@@ -275,8 +274,8 @@ public class PersistentObjectSet extends
                         }
                     }
 
-                    if (!fetchedList.contains(next)) {
-                        fetchedList.add(next);
+                    if (!resolved.contains(next)) {
+                        resolved.add(next);
                     }
                 }
             }

Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java?rev=1407886&r1=1407885&r2=1407886&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java Sat Nov 10 21:13:49 2012
@@ -75,6 +75,8 @@ public abstract class RelationshipFault 
         int state = relationshipOwner.getPersistenceState();
         return state == PersistenceState.MODIFIED || state == PersistenceState.DELETED;
     }
+    
+    protected abstract void mergeLocalChanges(List resolved);
 
     /**
      * Executes a query that returns related objects. Subclasses would invoke this method
@@ -87,24 +89,26 @@ public abstract class RelationshipFault 
         }
 
         List resolved = relationshipOwner.getObjectContext().performQuery(
-                new RelationshipQuery(
-                        relationshipOwner.getObjectId(),
-                        relationshipName,
-                        false));
-        
+                new RelationshipQuery(relationshipOwner.getObjectId(), relationshipName, false));
+
         /**
-         * Duplicating the list (see CAY-1194). Doing that only for RelationshipFault
-         * query results, so only for nested DataContexts
+         * Duplicating the list (see CAY-1194). Doing that only for
+         * RelationshipFault query results, so only for nested DataContexts
          */
         if (resolved instanceof RelationshipFault) {
             resolved = new ArrayList(resolved);
         }
+        
+        // merge local before updating reverse to ensure we update reverse rels
+        // of the right objects (see CAY-1757)
+        mergeLocalChanges(resolved);
 
         if (resolved.isEmpty()) {
             return resolved;
         }
 
         updateReverse(resolved);
+
         return resolved;
     }