Author: aadamchik
Date: Thu Sep 21 20:47:37 2006
New Revision: 448789

URL: http://svn.apache.org/viewvc?view=rev&rev=448789
Log:
CAY-660 - more tests; enabling PostLoad callback on rollback

Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptor.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTst.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ListenerCallbackTst.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/MockCallingBackListener.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ObjectContextCallbackInterceptorTst.java

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
 Thu Sep 21 20:47:37 2006
@@ -87,8 +87,8 @@
  * <p>
  * DataObjects are registered with DataContext either implicitly when they are 
fetched via
  * a query, or read via a relationship from another object, or explicitly via 
calling
- * [EMAIL PROTECTED] #newObject(Class)}during new DataObject creation. 
DataContext
- * tracks changes made to its DataObjects in memory, and flushes them to the 
database when
+ * [EMAIL PROTECTED] #newObject(Class)}during new DataObject creation. 
DataContext tracks changes
+ * made to its DataObjects in memory, and flushes them to the database when
  * [EMAIL PROTECTED] #commitChanges()}is called. Until DataContext is 
committed, changes made to its
  * objects are not visible in other DataContexts.
  * </p>
@@ -997,12 +997,15 @@
 
         if (objectStore.hasChanges()) {
             GraphDiff diff = getObjectStore().getChanges();
-            getObjectStore().objectsRolledBack();
+
+            // call channel with changes BEFORE reverting them, so that any 
interceptors
+            // could record them
 
             if (channel != null) {
-                channel.onSync(this, null, DataChannel.ROLLBACK_CASCADE_SYNC);
+                channel.onSync(this, diff, DataChannel.ROLLBACK_CASCADE_SYNC);
             }
 
+            getObjectStore().objectsRolledBack();
             fireDataChannelRolledback(this, diff);
         }
     }

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptor.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptor.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptor.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptor.java
 Thu Sep 21 20:47:37 2006
@@ -58,6 +58,8 @@
     public QueryResponse onQuery(ObjectContext originatingContext, Query 
query) {
         QueryResponse response = super.onQuery(originatingContext, query);
 
+        // TODO: andrus, 9/21/2006 - this method incorrectly calls "postLoad" 
when query
+        // refresh flag is set to false and object is already there.
         if (!postLoad.isEmpty()) {
 
             List list = response.firstList();
@@ -77,18 +79,15 @@
             GraphDiff changes,
             int syncType) {
 
-        if (isEmpty() || syncType == DataChannel.ROLLBACK_CASCADE_SYNC) {
+        if (isEmpty()) {
             return super.onSync(originatingContext, changes, syncType);
         }
 
         CommitState commitState = new CommitState(originatingContext, changes);
-        commitState.applyPreUpdate();
 
+        commitState.applyPreCommit(syncType);
         GraphDiff parentDiff = super.onSync(originatingContext, changes, 
syncType);
-
-        commitState.applyPostUpdate();
-        commitState.applyPostRemove();
-        commitState.applyPostPersist();
+        commitState.applyPostCommit(syncType);
 
         return parentDiff;
     }
@@ -170,25 +169,58 @@
             changes.apply(this);
         }
 
-        void applyPreUpdate() {
+        void applyPreCommit(int syncType) {
+            switch (syncType) {
+                case DataChannel.FLUSH_CASCADE_SYNC:
+                case DataChannel.FLUSH_NOCASCADE_SYNC:
+                    applyPreUpdate();
+            }
+        }
+
+        void applyPostCommit(int syncType) {
+            switch (syncType) {
+                case DataChannel.FLUSH_CASCADE_SYNC:
+                case DataChannel.FLUSH_NOCASCADE_SYNC:
+                    applyPostUpdate();
+                    applyPostRemove();
+                    applyPostPersist();
+                    break;
+                case DataChannel.ROLLBACK_CASCADE_SYNC:
+                    applyPostLoad();
+            }
+        }
+
+        private void applyPostLoad() {
+            if (!postLoad.isEmpty()) {
+                if (updated != null) {
+                    postLoad.applyCallbacks(updated);
+                }
+                
+                if (removed != null) {
+                    postLoad.applyCallbacks(removed);
+                }
+            }
+        }
+
+        private void applyPreUpdate() {
             if (updated != null && !preUpdate.isEmpty()) {
                 preUpdate.applyCallbacks(updated);
             }
         }
 
-        void applyPostUpdate() {
+        private void applyPostUpdate() {
             if (updated != null && !postUpdate.isEmpty()) {
                 postUpdate.applyCallbacks(updated);
             }
         }
 
-        void applyPostPersist() {
+        private void applyPostPersist() {
             if (persisted != null && !postPersist.isEmpty()) {
                 postPersist.applyCallbacks(persisted);
             }
         }
 
-        void applyPostRemove() {
+        private void applyPostRemove() {
             if (removed != null && !postRemove.isEmpty()) {
                 postRemove.applyCallbacks(removed);
             }

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTst.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTst.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/DataChannelCallbackInterceptorTst.java
 Thu Sep 21 20:47:37 2006
@@ -22,10 +22,77 @@
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.access.ObjectStore;
+import org.apache.cayenne.query.RefreshQuery;
+import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.unit.CayenneTestCase;
 
 public class DataChannelCallbackInterceptorTst extends CayenneTestCase {
 
+    public void testPostLoad() throws Exception {
+        deleteTestData();
+
+        DataChannelCallbackInterceptor i = new 
DataChannelCallbackInterceptor();
+        i.setChannel(getDomain());
+
+        ObjectContext context = new DataContext(i, new ObjectStore(getDomain()
+                .getSharedSnapshotCache()));
+
+        i.addPostLoadCallback(Artist.class, "postLoadCallback");
+        MockCallingBackListener listener = new MockCallingBackListener();
+        i.addPostLoadCallback(listener, "publicCallback", Artist.class);
+
+        Artist a1 = (Artist) context.newObject(Artist.class);
+        a1.setArtistName("XX");
+        context.commitChanges();
+        assertFalse(a1.isPostLoaded());
+        assertNull(listener.getPublicCalledbackEntity());
+
+        SelectQuery q = new SelectQuery(Artist.class);
+        context.performQuery(q);
+        assertTrue(a1.isPostLoaded());
+        assertSame(a1, listener.getPublicCalledbackEntity());
+
+        a1.resetCallbackFlags();
+        listener.reset();
+
+        // TODO: andrus, 9/21/2006 - this fails as "postLoad" is called when 
query
+        // refresh flag is set to false and object is already there.
+        // q.setRefreshingObjects(false);
+        //        
+        // assertFalse(a1.isPostLoaded());
+        // context.performQuery(q);
+        // assertFalse(a1.isPostLoaded());
+        // assertNull(listener.getPublicCalledbackEntity());
+
+        // post load must be called on rollback...
+        a1.resetCallbackFlags();
+        listener.reset();
+
+        context.rollbackChanges();
+        assertFalse(a1.isPostLoaded());
+        assertNull(listener.getPublicCalledbackEntity());
+
+        // now change and rollback the artist - postLoad must be called
+        a1.setArtistName("YY");
+        context.rollbackChanges();
+        assertTrue(a1.isPostLoaded());
+        assertSame(a1, listener.getPublicCalledbackEntity());
+        
+        // test invalidated 
+        a1.resetCallbackFlags();
+        listener.reset();
+        assertFalse(a1.isPostLoaded());
+        assertNull(listener.getPublicCalledbackEntity());
+        
+        context.performQuery(new RefreshQuery(a1));
+        assertFalse(a1.isPostLoaded());
+        assertNull(listener.getPublicCalledbackEntity());
+        
+        a1.getArtistName();
+        assertTrue(a1.isPostLoaded());
+        assertSame(a1, listener.getPublicCalledbackEntity());
+    }
+
     public void testPreUpdate() {
 
         DataChannelCallbackInterceptor i = new 
DataChannelCallbackInterceptor();
@@ -58,7 +125,7 @@
         context.commitChanges();
 
         assertTrue(a1.isPreUpdated());
-        assertSame(a1, listener2.publicCalledbackEntity);
+        assertSame(a1, listener2.getPublicCalledbackEntity());
     }
 
     public void testPostUpdate() {
@@ -93,7 +160,7 @@
         context.commitChanges();
 
         assertTrue(a1.isPostUpdated());
-        assertSame(a1, listener2.publicCalledbackEntity);
+        assertSame(a1, listener2.getPublicCalledbackEntity());
     }
 
     public void testPostRemove() {
@@ -116,7 +183,7 @@
         context.commitChanges();
 
         assertTrue(a1.isPostRemoved());
-        assertSame(a1, listener2.publicCalledbackEntity);
+        assertSame(a1, listener2.getPublicCalledbackEntity());
     }
 
     public void testPostPersist() {
@@ -142,6 +209,6 @@
 
         assertFalse(a1.isPostPersisted());
         assertTrue(a2.isPostPersisted());
-        assertSame(a2, listener2.publicCalledbackEntity);
+        assertSame(a2, listener2.getPublicCalledbackEntity());
     }
 }

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ListenerCallbackTst.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ListenerCallbackTst.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ListenerCallbackTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ListenerCallbackTst.java
 Thu Sep 21 20:47:37 2006
@@ -39,6 +39,6 @@
         assertFalse(e.privateCallbackInvoked);
         assertFalse(e.defaultCallbackInvoked);
 
-        assertSame(e, listener.publicCalledbackEntity);
+        assertSame(e, listener.getPublicCalledbackEntity());
     }
 }

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/MockCallingBackListener.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/MockCallingBackListener.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/MockCallingBackListener.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/MockCallingBackListener.java
 Thu Sep 21 20:47:37 2006
@@ -20,9 +20,17 @@
 
 public class MockCallingBackListener {
 
-    public Object publicCalledbackEntity;
+    private Object publicCalledbackEntity;
 
     public void publicCallback(Object entity) {
         publicCalledbackEntity = entity;
+    }
+
+    public Object getPublicCalledbackEntity() {
+        return publicCalledbackEntity;
+    }
+
+    public void reset() {
+        this.publicCalledbackEntity = null;
     }
 }

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ObjectContextCallbackInterceptorTst.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ObjectContextCallbackInterceptorTst.java?view=diff&rev=448789&r1=448788&r2=448789
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ObjectContextCallbackInterceptorTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/intercept/ObjectContextCallbackInterceptorTst.java
 Thu Sep 21 20:47:37 2006
@@ -50,12 +50,12 @@
         assertNotNull(a3);
         assertTrue(a3.isPrePersisted());
 
-        assertSame(a3, listener2.publicCalledbackEntity);
+        assertSame(a3, listener2.getPublicCalledbackEntity());
 
         Painting p3 = (Painting) i.newObject(Painting.class);
         assertNotNull(p3);
         assertFalse(p3.isPrePersisted());
-        assertSame(a3, listener2.publicCalledbackEntity);
+        assertSame(a3, listener2.getPublicCalledbackEntity());
     }
 
     public void testPreRemoveCallbacks() {
@@ -89,7 +89,7 @@
         assertFalse(a3.isPrePersisted());
         assertTrue(a3.isPreRemoved());
 
-        assertSame(a3, listener2.publicCalledbackEntity);
+        assertSame(a3, listener2.getPublicCalledbackEntity());
 
         Painting p3 = (Painting) i.newObject(Painting.class);
         p3.setPaintingTitle("XX");
@@ -97,6 +97,6 @@
         i.deleteObject(p3);
         assertFalse(p3.isPrePersisted());
         assertFalse(p3.isPreRemoved());
-        assertSame(a3, listener2.publicCalledbackEntity);
+        assertSame(a3, listener2.getPublicCalledbackEntity());
     }
 }


Reply via email to