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 2010/11/10 21:12:54 UTC
svn commit: r1033690 - in /cayenne/main/branches/STABLE-3.0:
docs/doc/src/main/resources/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/
framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/
Author: aadamchik
Date: Wed Nov 10 20:12:53 2010
New Revision: 1033690
URL: http://svn.apache.org/viewvc?rev=1033690&view=rev
Log:
CAY-1505 Callbacks: POST_UPDATE is called on updated removed object, instead of POST_REMOVE
Modified:
cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataDomainCallbacksTest.java
Modified: cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1033690&r1=1033689&r2=1033690&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/branches/STABLE-3.0/docs/doc/src/main/resources/RELEASE-NOTES.txt Wed Nov 10 20:12:53 2010
@@ -25,6 +25,7 @@ CAY-1488 OutOfMemory when selecting "Rem
CAY-1489 NPE using DataContext.objectFromDataRow for a nested context
CAY-1490 Maven cgen: all and datamap modes can not be activated
CAY-1496 Problem in derby: comparison operators are not supported on Clob object values.
+CAY-1505 Callbacks: POST_UPDATE is called on updated removed object, instead of POST_REMOVE
----------------------------------
Release: 3.0.1
Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java?rev=1033690&r1=1033689&r2=1033690&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java Wed Nov 10 20:12:53 2010
@@ -20,8 +20,8 @@ package org.apache.cayenne.access;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
import org.apache.cayenne.DataChannel;
import org.apache.cayenne.graph.GraphChangeHandler;
@@ -35,6 +35,10 @@ import org.apache.cayenne.reflect.Lifecy
*/
abstract class DataChannelSyncCallbackAction implements GraphChangeHandler {
+ static enum Op {
+ INSERT, UPDATE, DELETE
+ }
+
static DataChannelSyncCallbackAction getCallbackAction(
LifecycleCallbackRegistry callbackRegistry,
GraphManager graphManager,
@@ -56,7 +60,7 @@ abstract class DataChannelSyncCallbackAc
Collection updated;
Collection persisted;
Collection removed;
- private Set<Object> seenIds;
+ private Map<Object, Op> seenIds;
private GraphManager graphManager;
DataChannelSyncCallbackAction(LifecycleCallbackRegistry callbackRegistry,
@@ -66,7 +70,7 @@ abstract class DataChannelSyncCallbackAc
this.graphManager = graphManager;
if (hasListeners()) {
- this.seenIds = new HashSet<Object>();
+ this.seenIds = new HashMap<Object, Op>();
changes.apply(this);
}
}
@@ -84,13 +88,14 @@ abstract class DataChannelSyncCallbackAc
}
public void nodeCreated(Object nodeId) {
- if (seenIds.add(nodeId)) {
+ Op op = seenIds.put(nodeId, Op.INSERT);
+ if (op == null) {
Object node = graphManager.getNode(nodeId);
if (node != null) {
if (persisted == null) {
- persisted = new ArrayList();
+ persisted = new ArrayList<Object>();
}
persisted.add(node);
@@ -99,16 +104,26 @@ abstract class DataChannelSyncCallbackAc
}
public void nodeRemoved(Object nodeId) {
- if (seenIds.add(nodeId)) {
+ Op op = seenIds.put(nodeId, Op.DELETE);
+
+ // the node may have been updated prior to delete
+ if (op != Op.DELETE) {
Object node = graphManager.getNode(nodeId);
if (node != null) {
if (removed == null) {
- removed = new ArrayList();
+ removed = new ArrayList<Object>();
}
removed.add(node);
+
+ if (op == Op.UPDATE) {
+ updated.remove(node);
+ }
+
+ // don't care about preceding Op.INSERT, as NEW -> DELETED objects are
+ // purged from the change log upstream and we don't see them here
}
}
}
@@ -135,13 +150,16 @@ abstract class DataChannelSyncCallbackAc
}
private void nodeUpdated(Object nodeId) {
- if (seenIds.add(nodeId)) {
+
+ Op op = seenIds.put(nodeId, Op.UPDATE);
+
+ if (op == null) {
Object node = graphManager.getNode(nodeId);
if (node != null) {
if (updated == null) {
- updated = new ArrayList();
+ updated = new ArrayList<Object>();
}
updated.add(node);
Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataDomainCallbacksTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataDomainCallbacksTest.java?rev=1033690&r1=1033689&r2=1033690&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataDomainCallbacksTest.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataDomainCallbacksTest.java Wed Nov 10 20:12:53 2010
@@ -219,6 +219,81 @@ public class DataDomainCallbacksTest ext
assertTrue(a1.isPostRemoved());
assertSame(a1, listener2.getPublicCalledbackEntity());
}
+
+ public void testPostRemove_UpdatedDeleted() {
+
+ LifecycleCallbackRegistry registry = getDomain()
+ .getEntityResolver()
+ .getCallbackRegistry();
+
+ ObjectContext context = createDataContext();
+
+ Artist a1 = context.newObject(Artist.class);
+ a1.setArtistName("XX");
+ context.commitChanges();
+
+ MockCallingBackListener listener1 = new MockCallingBackListener();
+ registry.addListener(
+ LifecycleEvent.POST_REMOVE,
+ Artist.class,
+ listener1,
+ "publicCallback");
+
+ MockCallingBackListener listener2 = new MockCallingBackListener();
+ registry.addListener(
+ LifecycleEvent.POST_UPDATE,
+ Artist.class,
+ listener2,
+ "publicCallback");
+
+
+ // change before removing
+ a1.setArtistName("YY");
+ context.deleteObject(a1);
+ context.commitChanges();
+
+ assertNull(listener2.getPublicCalledbackEntity());
+ assertSame(a1, listener1.getPublicCalledbackEntity());
+ }
+
+ public void testPostRemove_InsertedUpdatedDeleted() {
+
+ LifecycleCallbackRegistry registry = getDomain()
+ .getEntityResolver()
+ .getCallbackRegistry();
+
+ ObjectContext context = createDataContext();
+
+ MockCallingBackListener listener0 = new MockCallingBackListener();
+ registry.addListener(
+ LifecycleEvent.POST_PERSIST,
+ Artist.class,
+ listener0,
+ "publicCallback");
+
+ MockCallingBackListener listener1 = new MockCallingBackListener();
+ registry.addListener(
+ LifecycleEvent.POST_REMOVE,
+ Artist.class,
+ listener1,
+ "publicCallback");
+
+ MockCallingBackListener listener2 = new MockCallingBackListener();
+ registry.addListener(
+ LifecycleEvent.POST_UPDATE,
+ Artist.class,
+ listener2,
+ "publicCallback");
+
+ Artist a1 = context.newObject(Artist.class);
+ a1.setArtistName("XX");
+ context.deleteObject(a1);
+ context.commitChanges();
+
+ assertNull(listener0.getPublicCalledbackEntity());
+ assertNull(listener1.getPublicCalledbackEntity());
+ assertNull(listener2.getPublicCalledbackEntity());
+ }
public void testPostPersist() {