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 2006/05/26 00:30:58 UTC

svn commit: r409492 - in /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access: DataDomainQueryAction.java DataRowStore.java ObjectStore.java ObjectTreeResolver.java

Author: aadamchik
Date: Thu May 25 15:30:57 2006
New Revision: 409492

URL: http://svn.apache.org/viewvc?rev=409492&view=rev
Log:
fixing select synchronization

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomainQueryAction.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomainQueryAction.java?rev=409492&r1=409491&r2=409492&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomainQueryAction.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomainQueryAction.java Thu May 25 15:30:57 2006
@@ -379,7 +379,7 @@
                     ObjectTreeResolver resolver = new ObjectTreeResolver(
                             context,
                             metadata);
-                    objects = resolver.resolveObjectTree(
+                    objects = resolver.synchronizedObjectsFromDataRows(
                             prefetchTree,
                             mainRows,
                             prefetchResultsByPath);

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java?rev=409492&r1=409491&r2=409492&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowStore.java Thu May 25 15:30:57 2006
@@ -254,8 +254,10 @@
      */
     void snapshotsUpdatedForObjects(List objects, List snapshots, boolean refresh) {
 
+        int size = objects.size();
+
         // sanity check
-        if (objects.size() != snapshots.size()) {
+        if (size != snapshots.size()) {
             throw new IllegalArgumentException(
                     "Counts of objects and corresponding snapshots do not match. "
                             + "Objects count: "
@@ -267,57 +269,53 @@
         Map modified = null;
         Object eventPostedBy = null;
 
-        synchronized (this) {
-            int size = objects.size();
-
-            for (int i = 0; i < size; i++) {
-                Persistent object = (Persistent) objects.get(i);
+        for (int i = 0; i < size; i++) {
+            Persistent object = (Persistent) objects.get(i);
 
-                // skip HOLLOW objects as they likely were created from partial snapshots
-                if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-                    continue;
-                }
+            // skip HOLLOW objects as they likely were created from partial snapshots
+            if (object.getPersistenceState() == PersistenceState.HOLLOW) {
+                continue;
+            }
 
-                ObjectId oid = object.getObjectId();
+            ObjectId oid = object.getObjectId();
 
-                // add snapshots if refresh is forced, or if a snapshot is
-                // missing
+            // add snapshots if refresh is forced, or if a snapshot is
+            // missing
 
-                DataRow cachedSnapshot = (DataRow) this.snapshots.get(oid);
-                if (refresh || cachedSnapshot == null) {
+            DataRow cachedSnapshot = (DataRow) this.snapshots.get(oid);
+            if (refresh || cachedSnapshot == null) {
 
-                    DataRow newSnapshot = (DataRow) snapshots.get(i);
-
-                    if (cachedSnapshot != null) {
-                        // use old snapshot if no changes occurred
-                        if (object instanceof DataObject
-                                && cachedSnapshot.equals(newSnapshot)) {
-                            ((DataObject) object).setSnapshotVersion(cachedSnapshot
-                                    .getVersion());
-                            continue;
-                        }
-                        else {
-                            newSnapshot.setReplacesVersion(cachedSnapshot.getVersion());
-                        }
+                DataRow newSnapshot = (DataRow) snapshots.get(i);
+
+                if (cachedSnapshot != null) {
+                    // use old snapshot if no changes occurred
+                    if (object instanceof DataObject
+                            && cachedSnapshot.equals(newSnapshot)) {
+                        ((DataObject) object).setSnapshotVersion(cachedSnapshot
+                                .getVersion());
+                        continue;
                     }
-
-                    if (modified == null) {
-                        modified = new HashMap();
-                        eventPostedBy = object.getObjectContext().getGraphManager();
+                    else {
+                        newSnapshot.setReplacesVersion(cachedSnapshot.getVersion());
                     }
+                }
 
-                    modified.put(oid, newSnapshot);
+                if (modified == null) {
+                    modified = new HashMap();
+                    eventPostedBy = object.getObjectContext().getGraphManager();
                 }
-            }
 
-            if (modified != null) {
-                processSnapshotChanges(
-                        eventPostedBy,
-                        modified,
-                        Collections.EMPTY_LIST,
-                        Collections.EMPTY_LIST,
-                        Collections.EMPTY_LIST);
+                modified.put(oid, newSnapshot);
             }
+        }
+
+        if (modified != null) {
+            processSnapshotChanges(
+                    eventPostedBy,
+                    modified,
+                    Collections.EMPTY_LIST,
+                    Collections.EMPTY_LIST,
+                    Collections.EMPTY_LIST);
         }
     }
 

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java?rev=409492&r1=409491&r2=409492&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java Thu May 25 15:30:57 2006
@@ -506,7 +506,9 @@
     public void snapshotsUpdatedForObjects(List objects, List snapshots, boolean refresh) {
         DataRowStore cache = getDataRowCache();
         if (cache != null) {
-            cache.snapshotsUpdatedForObjects(objects, snapshots, refresh);
+            synchronized (this) {
+                cache.snapshotsUpdatedForObjects(objects, snapshots, refresh);
+            }
         }
     }
 

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java?rev=409492&r1=409491&r2=409492&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectTreeResolver.java Thu May 25 15:30:57 2006
@@ -92,6 +92,21 @@
         this.cache = context.getObjectStore().getDataRowCache();
     }
 
+    /**
+     * Properly synchronized version of 'resolveObjectTree'.
+     */
+    List synchronizedObjectsFromDataRows(
+            PrefetchTreeNode tree,
+            List mainResultRows,
+            Map extraResultsByPath) {
+
+        synchronized (context.getObjectStore()) {
+            synchronized (cache) {
+                return resolveObjectTree(tree, mainResultRows, extraResultsByPath);
+            }
+        }
+    }
+
     List resolveObjectTree(
             PrefetchTreeNode tree,
             List mainResultRows,