Author: aadamchik
Date: Sun Oct 21 10:50:15 2012
New Revision: 1400617

URL: http://svn.apache.org/viewvc?rev=1400617&view=rev
Log:
CAY-1749 NPE on simple nested context commit

Modified:
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java?rev=1400617&r1=1400616&r2=1400617&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
 Sun Oct 21 10:50:15 2012
@@ -110,9 +110,22 @@ class DataContextMergeHandler implements
     }
 
     public void graphFlushed(GraphEvent event) {
+
         // peer is committed
         if (shouldProcessEvent(event)) {
-            event.getDiff().apply(this);
+
+            // per CAY-1737 event dispatches from parent context to children 
are
+            // non-blocking, this causes issues like CAY-1749. so we must
+            // synchronize ObjectStore updates here.
+
+            // TODO: we can get here if a peer context is committed (ok) or
+            // if our context was committed (not ok, since parent changes are
+            // already applied in the commit thread) .. figure out an alt
+            // filtering mechanism to avoid the duplicate object processing
+
+            synchronized (context.getObjectStore()) {
+                event.getDiff().apply(this);
+            }
 
             // repost as change event for our own children
             context.fireDataChannelChanged(event.getPostedBy(), 
event.getDiff());


Reply via email to