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 2011/05/15 13:21:29 UTC

svn commit: r1103317 - in /cayenne/main/branches/STABLE-3.0: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/

Author: aadamchik
Date: Sun May 15 11:21:28 2011
New Revision: 1103317

URL: http://svn.apache.org/viewvc?rev=1103317&view=rev
Log:
CAY-1567 BaseQueryMetadata.setPrefetches() causes a shared lock

Modified:
    cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java

Modified: cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1103317&r1=1103316&r2=1103317&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt Sun May 15 11:21:28 2011
@@ -33,6 +33,7 @@ CAY-1505 Callbacks: POST_UPDATE is calle
 CAY-1506 Reserverd words mapping in WHERE clause
 CAY-1518 cgen: duplicate callback methods
 CAY-1557 Vertical inheritance is broken for subclasses with more than one flattened attribute
+CAY-1567 BaseQueryMetadata.setPrefetches() causes a shared lock
 
 ----------------------------------
 Release: 3.0.1

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java?rev=1103317&r1=1103316&r2=1103317&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java Sun May 15 11:21:28 2011
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -34,7 +33,6 @@ import org.apache.cayenne.map.EntityReso
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
 import org.apache.cayenne.util.XMLSerializable;
 
@@ -326,22 +324,22 @@ class BaseQueryMetadata implements Query
     }
 
     void setPrefetchTree(PrefetchTreeNode prefetchTree) {
-        if (prefetchTree != null) {
-            // importnat: make a clone to allow modification independent from the
-            // caller...
-            try {
-                prefetchTree = (PrefetchTreeNode) Util
-                        .cloneViaSerialization(prefetchTree);
-            }
-            catch (CayenneRuntimeException e) {
-                throw e;
-            }
-            catch (Exception e) {
-                throw new CayenneRuntimeException("Error cloning prefetch tree", e);
-            }
+        this.prefetchTree = prefetchTree != null ? deepClone(prefetchTree, null) : null;
+    }
+
+    private PrefetchTreeNode deepClone(PrefetchTreeNode source, PrefetchTreeNode targetParent) {
+
+        PrefetchTreeNode target = new PrefetchTreeNode(targetParent, source.getName());
+        target.setEjbqlPathEntityId(source.getEjbqlPathEntityId());
+        target.setEntityName(source.getEntityName());
+        target.setPhantom(source.isPhantom());
+        target.setSemantics(source.getSemantics());
+
+        for (PrefetchTreeNode child : source.getChildren()) {
+            target.addChild(deepClone(child, target));
         }
 
-        this.prefetchTree = prefetchTree;
+        return target;
     }
 
     /**

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java?rev=1103317&r1=1103316&r2=1103317&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java Sun May 15 11:21:28 2011
@@ -69,9 +69,9 @@ public class PrefetchTreeNode implements
      * Creates a phantom PrefetchTreeNode, initializing it with parent node and a name of
      * a relationship segment connecting this node with the parent.
      */
-    protected PrefetchTreeNode(PrefetchTreeNode parent, String segmentPath) {
+    protected PrefetchTreeNode(PrefetchTreeNode parent, String name) {
         this.parent = parent;
-        this.name = segmentPath;
+        this.name = name;
         this.phantom = true;
         this.semantics = UNDEFINED_SEMANTICS;
     }