Author: aadamchik
Date: Sun Sep 24 11:01:24 2006
New Revision: 449444
URL: http://svn.apache.org/viewvc?view=rev&rev=449444
Log:
CAY-666 - fixing "pre" callbacks - they can only be done when commit is
started, doing them before DataContext loaded the client changes is meaningless.
Removed:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/DataChannelFullCallbackInterceptor.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/SyncFullCallbackProcessor.java
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ClientServerChannel.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/main/java/org/apache/cayenne/intercept/SyncCallbackProcessor.java
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ClientServerChannel.java?view=diff&rev=449444&r1=449443&r2=449444
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
Sun Sep 24 11:01:24 2006
@@ -41,7 +41,6 @@
protected DataContext serverContext;
protected boolean lifecycleCallbacksEnabled;
- protected DataChannel callbackInterceptor;
public ClientServerChannel(DataDomain domain) {
this(domain.createDataContext());
@@ -86,7 +85,7 @@
}
DataChannel getParentChannel() {
- return callbackInterceptor != null ? callbackInterceptor :
serverContext;
+ return serverContext;
}
public EntityResolver getEntityResolver() {
@@ -135,11 +134,15 @@
void enableCallbacks() {
DataChannelCallbackInterceptor interceptor = new
DataChannelCallbackInterceptor();
- interceptor.setChannel(serverContext);
- this.callbackInterceptor = interceptor;
+
+ // must call pre-persist and pre-remove on commit
+ interceptor.setContextCallbacksEnabled(true);
+ interceptor.setChannel(serverContext.getParentDataDomain());
+
+ serverContext.setChannel(interceptor);
}
void disableCallbacks() {
- this.callbackInterceptor = null;
+ serverContext.setChannel(serverContext.getParentDataDomain());
}
}
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=449444&r1=449443&r2=449444
==============================================================================
---
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
Sun Sep 24 11:01:24 2006
@@ -24,6 +24,7 @@
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.QueryResponse;
import org.apache.cayenne.graph.GraphDiff;
+import org.apache.cayenne.graph.GraphManager;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.LifecycleEventCallback;
import org.apache.cayenne.map.LifecycleEventCallbackMap;
@@ -53,6 +54,10 @@
protected LifecycleEventCallbackMap postUpdate;
protected LifecycleEventCallbackMap postLoad;
+ protected boolean contextCallbacksEnabled;
+ protected LifecycleEventCallbackMap preRemove;
+ protected LifecycleEventCallbackMap prePersist;
+
public void setChannel(DataChannel channel) {
this.channel = channel;
@@ -65,6 +70,8 @@
postRemove =
resolver.getCallbacks(LifecycleEventCallback.POST_REMOVE);
postUpdate =
resolver.getCallbacks(LifecycleEventCallback.POST_UPDATE);
postLoad = resolver.getCallbacks(LifecycleEventCallback.POST_LOAD);
+ preRemove =
resolver.getCallbacks(LifecycleEventCallback.PRE_REMOVE);
+ prePersist =
resolver.getCallbacks(LifecycleEventCallback.PRE_PERSIST);
}
else {
preUpdate = null;
@@ -72,15 +79,22 @@
postRemove = null;
postUpdate = null;
postLoad = null;
+ preRemove = null;
+ prePersist = null;
}
}
protected boolean isEmpty() {
- return preUpdate.isEmpty()
+ if (!(preUpdate.isEmpty()
&& postPersist.isEmpty()
&& postRemove.isEmpty()
- && postUpdate.isEmpty()
- && postLoad.isEmpty();
+ && postUpdate.isEmpty() && postLoad.isEmpty())) {
+ return false;
+ }
+
+ return contextCallbacksEnabled
+ ? preRemove.isEmpty() && prePersist.isEmpty()
+ : true;
}
public QueryResponse onQuery(ObjectContext originatingContext, Query
query) {
@@ -112,7 +126,8 @@
return channel.onSync(originatingContext, changes, syncType);
}
- SyncCallbackProcessor processor =
createSyncProcessor(originatingContext, changes);
+ SyncCallbackProcessor processor =
createSyncProcessor(originatingContext
+ .getGraphManager(), changes);
processor.applyPreCommit(syncType);
GraphDiff parentDiff = channel.onSync(originatingContext, changes,
syncType);
@@ -121,10 +136,8 @@
return parentDiff;
}
- SyncCallbackProcessor createSyncProcessor(
- ObjectContext originatingContext,
- GraphDiff changes) {
- return new SyncCallbackProcessor(this, originatingContext, changes);
+ SyncCallbackProcessor createSyncProcessor(GraphManager graphManager,
GraphDiff changes) {
+ return new SyncCallbackProcessor(this, graphManager, changes);
}
public LifecycleEventCallbackMap getPostLoad() {
@@ -145,5 +158,28 @@
public LifecycleEventCallbackMap getPreUpdate() {
return preUpdate;
+ }
+
+ /**
+ * Returns whether "PrePersist" and "PreRemove" callbacks should be
executed during
+ * sync. By default this is false, as they are executed by the parent
ObjectContext.
+ * This can be changed by calling [EMAIL PROTECTED]
#setContextCallbacksEnabled(boolean)}.
+ */
+ public boolean isContextCallbacksEnabled() {
+ return contextCallbacksEnabled;
+ }
+
+ public void setContextCallbacksEnabled(boolean contextCallbacksEnabled) {
+ this.contextCallbacksEnabled = contextCallbacksEnabled;
+ }
+
+
+ public LifecycleEventCallbackMap getPrePersist() {
+ return prePersist;
+ }
+
+
+ public LifecycleEventCallbackMap getPreRemove() {
+ return preRemove;
}
}
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/SyncCallbackProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/SyncCallbackProcessor.java?view=diff&rev=449444&r1=449443&r2=449444
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/SyncCallbackProcessor.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/intercept/SyncCallbackProcessor.java
Sun Sep 24 11:01:24 2006
@@ -24,7 +24,6 @@
import java.util.Set;
import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.graph.GraphChangeHandler;
import org.apache.cayenne.graph.GraphDiff;
import org.apache.cayenne.graph.GraphManager;
@@ -40,10 +39,10 @@
private Set seenIds;
SyncCallbackProcessor(DataChannelCallbackInterceptor interceptor,
- ObjectContext originatingContext, GraphDiff changes) {
+ GraphManager graphManager, GraphDiff changes) {
this.interceptor = interceptor;
this.seenIds = new HashSet();
- this.graphManager = originatingContext.getGraphManager();
+ this.graphManager = graphManager;
changes.apply(this);
}
@@ -52,6 +51,11 @@
case DataChannel.FLUSH_CASCADE_SYNC:
case DataChannel.FLUSH_NOCASCADE_SYNC:
apply(interceptor.getPreUpdate(), updated);
+
+ if (interceptor.isContextCallbacksEnabled()) {
+ apply(interceptor.getPrePersist(), persisted);
+ apply(interceptor.getPreRemove(), removed);
+ }
}
}