Author: aadamchik Date: Sun May 15 10:00:04 2011 New Revision: 1103307 URL: http://svn.apache.org/viewvc?rev=1103307&view=rev Log: stop using serialization for cloning inside Cayenne stack - it some class locks that kill runtime concurrency
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java?rev=1103307&r1=1103306&r2=1103307&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java Sun May 15 10:00:04 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; @@ -102,7 +100,7 @@ class BaseQueryMetadata implements Query if (root instanceof Class<?>) { entity = resolver.lookupObjEntity((Class<?>) root); if (entity == null) { // entity not found, try to resolve it with - // client resolver + // client resolver EntityResolver clientResolver = resolver .getClientEntityResolver(); if (clientResolver != resolver) { @@ -325,22 +323,22 @@ class BaseQueryMetadata implements Query } void setPrefetchTree(PrefetchTreeNode prefetchTree) { - if (prefetchTree != null) { - // important: 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/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java?rev=1103307&r1=1103306&r2=1103307&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/PrefetchTreeNode.java Sun May 15 10:00:04 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; }