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());
}
}