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 2007/03/07 19:21:34 UTC

svn commit: r515679 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src: main/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/intercept/

Author: aadamchik
Date: Wed Mar  7 10:21:33 2007
New Revision: 515679

URL: http://svn.apache.org/viewvc?view=rev&rev=515679
Log:
CAY-766: localObject returning object with temporary id inside postPersist() method
fixed for "flat" DataContexts, nested DC will still have to use the workaround described in the previous comment

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?view=diff&rev=515679&r1=515678&r2=515679
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java Wed Mar  7 10:21:33 2007
@@ -1128,20 +1128,22 @@
         int syncType = cascade
                 ? DataChannel.FLUSH_CASCADE_SYNC
                 : DataChannel.FLUSH_NOCASCADE_SYNC;
+        
+        ObjectStore objectStore = getObjectStore();
 
         // prevent multiple commits occuring simulteneously
-        synchronized (getObjectStore()) {
+        synchronized (objectStore) {
 
             DataContextFlushEventHandler eventHandler = null;
 
-            ObjectStoreGraphDiff changes = getObjectStore().getChanges();
+            ObjectStoreGraphDiff changes = objectStore.getChanges();
             boolean noop = isValidatingObjectsOnCommit()
                     ? changes.validateAndCheckNoop()
                     : changes.isNoop();
 
             if (noop) {
                 // need to clear phantom changes
-                getObjectStore().postprocessAfterPhantomCommit();
+                objectStore.postprocessAfterPhantomCommit();
                 return new CompoundDiff();
             }
 
@@ -1153,7 +1155,16 @@
 
             try {
                 GraphDiff returnChanges = getChannel().onSync(this, changes, syncType);
-                getObjectStore().postprocessAfterCommit(returnChanges);
+
+                // note that this is a hack resulting from a fix to CAY-766... To support
+                // valid object state in PostPersist callback, 'postprocessAfterCommit' is
+                // invoked by DataDomain.onSync(..). Unless the parent is DataContext, and
+                // this method is not invoked!! As a result, PostPersist will contain temp
+                // ObjectIds in nested contexts and perm ones in flat contexts.
+                // Pending better callback design .....
+                if (objectStore.hasChanges()) {
+                    objectStore.postprocessAfterCommit(returnChanges);
+                }
 
                 // this is a legacy event ... will deprecate in 2.0
                 fireTransactionCommitted();
@@ -1388,8 +1399,8 @@
     /**
      * Sets default for posting transaction events by new DataContexts.
      * 
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     public static void setTransactionEventsEnabledDefault(boolean flag) {
         transactionEventsEnabledDefault = flag;
@@ -1398,16 +1409,16 @@
     /**
      * Enables or disables posting of transaction events by this DataContext.
      * 
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     public void setTransactionEventsEnabled(boolean flag) {
         this.transactionEventsEnabled = flag;
     }
 
     /**
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     public boolean isTransactionEventsEnabled() {
         return this.transactionEventsEnabled;
@@ -1444,8 +1455,8 @@
     }
 
     /**
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     void fireWillCommit() {
         // post event: WILL_COMMIT
@@ -1456,8 +1467,8 @@
     }
 
     /**
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     void fireTransactionRolledback() {
         // post event: DID_ROLLBACK
@@ -1468,8 +1479,8 @@
     }
 
     /**
-     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be
-     *             removed in later 3.0 milestones.
+     * @deprecated since 3.0M1 in favor of {@link LifecycleListener}. Will be removed in
+     *             later 3.0 milestones.
      */
     void fireTransactionCommitted() {
         // old-style event

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java?view=diff&rev=515679&r1=515678&r2=515679
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java Wed Mar  7 10:21:33 2007
@@ -253,5 +253,7 @@
                     Collections.EMPTY_LIST,
                     resultIndirectlyModifiedIds);
         }
+        
+        context.getObjectStore().postprocessAfterCommit(resultDiff);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTest.java?view=diff&rev=515679&r1=515678&r2=515679
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTest.java Wed Mar  7 10:21:33 2007
@@ -21,6 +21,7 @@
 import org.apache.art.Artist;
 import org.apache.cayenne.LifecycleListener;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.access.ObjectStore;
 import org.apache.cayenne.map.EntityResolver;
@@ -51,7 +52,10 @@
         ObjectContext context = new DataContext(i, new ObjectStore(getDomain()
                 .getSharedSnapshotCache()));
 
-        registry.addListener(LifecycleListener.POST_LOAD, Artist.class, "postLoadCallback");
+        registry.addListener(
+                LifecycleListener.POST_LOAD,
+                Artist.class,
+                "postLoadCallback");
         MockCallingBackListener listener = new MockCallingBackListener();
         registry.addListener(
                 LifecycleListener.POST_LOAD,
@@ -132,7 +136,10 @@
         context.commitChanges();
         assertFalse(a1.isPreUpdated());
 
-        registry.addListener(LifecycleListener.PRE_UPDATE, Artist.class, "preUpdateCallback");
+        registry.addListener(
+                LifecycleListener.PRE_UPDATE,
+                Artist.class,
+                "preUpdateCallback");
         a1.setArtistName("ZZ");
         context.commitChanges();
         assertTrue(a1.isPreUpdated());
@@ -175,7 +182,10 @@
         context.commitChanges();
         assertFalse(a1.isPostUpdated());
 
-        registry.addListener(LifecycleListener.POST_UPDATE, Artist.class, "postUpdateCallback");
+        registry.addListener(
+                LifecycleListener.POST_UPDATE,
+                Artist.class,
+                "postUpdateCallback");
         a1.setArtistName("ZZ");
         context.commitChanges();
         assertTrue(a1.isPostUpdated());
@@ -213,7 +223,10 @@
         a1.setArtistName("XX");
         context.commitChanges();
 
-        registry.addListener(LifecycleListener.POST_REMOVE, Artist.class, "postRemoveCallback");
+        registry.addListener(
+                LifecycleListener.POST_REMOVE,
+                Artist.class,
+                "postRemoveCallback");
         MockCallingBackListener listener2 = new MockCallingBackListener();
         registry.addListener(
                 LifecycleListener.POST_REMOVE,
@@ -249,7 +262,13 @@
                 LifecycleListener.POST_PERSIST,
                 Artist.class,
                 "postPersistCallback");
-        MockCallingBackListener listener2 = new MockCallingBackListener();
+        MockCallingBackListener listener2 = new MockCallingBackListener() {
+
+            public void publicCallback(Object entity) {
+                super.publicCallback(entity);
+                assertFalse(((Persistent) entity).getObjectId().isTemporary());
+            }
+        };
         registry.addListener(
                 LifecycleListener.POST_PERSIST,
                 Artist.class,