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


Reply via email to