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;
}