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 2007/07/30 00:28:07 UTC
svn commit: r560828 - in
/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access:
DataChannelSyncCallbackAction.java DataDomain.java
Author: aadamchik
Date: Sun Jul 29 15:27:57 2007
New Revision: 560828
URL: http://svn.apache.org/viewvc?view=rev&rev=560828
Log:
CAY-834 DataContext and DataDomain must support lifecycle callbacks out of the box without wrapping
(optimizing performance - avoiding callback calls when no listeners are registered)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java?view=diff&rev=560828&r1=560827&r2=560828
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java Sun Jul 29 15:27:57 2007
@@ -28,55 +28,59 @@
import org.apache.cayenne.graph.GraphChangeHandler;
import org.apache.cayenne.graph.GraphDiff;
import org.apache.cayenne.graph.GraphManager;
+import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
/**
* @since 3.0
* @author Andrus Adamchik
*/
-class DataChannelSyncCallbackAction implements GraphChangeHandler {
+abstract class DataChannelSyncCallbackAction implements GraphChangeHandler {
- private DataChannel channel;
- private GraphManager graphManager;
+ static DataChannelSyncCallbackAction getCallbackAction(
+ LifecycleCallbackRegistry callbackRegistry,
+ GraphManager graphManager,
+ GraphDiff changes,
+ int syncType) {
+
+ switch (syncType) {
+ case DataChannel.FLUSH_CASCADE_SYNC:
+ case DataChannel.FLUSH_NOCASCADE_SYNC:
+ return new FlushCallbackAction(callbackRegistry, graphManager, changes);
+ case DataChannel.ROLLBACK_CASCADE_SYNC:
+ return new RollbackCallbackAction(callbackRegistry, graphManager, changes);
+ default:
+ throw new IllegalArgumentException("Unsupported sync type: " + syncType);
+ }
+ }
+
+ LifecycleCallbackRegistry callbackRegistry;
Collection updated;
Collection persisted;
Collection removed;
private Set seenIds;
+ private GraphManager graphManager;
+
+ DataChannelSyncCallbackAction(LifecycleCallbackRegistry callbackRegistry,
+ GraphManager graphManager, GraphDiff changes) {
- DataChannelSyncCallbackAction(DataChannel channel, GraphManager graphManager,
- GraphDiff changes) {
- this.channel = channel;
- this.seenIds = new HashSet();
+ this.callbackRegistry = callbackRegistry;
this.graphManager = graphManager;
- changes.apply(this);
- }
- void applyPreCommit(int syncType) {
- switch (syncType) {
- case DataChannel.FLUSH_CASCADE_SYNC:
- case DataChannel.FLUSH_NOCASCADE_SYNC:
- apply(LifecycleListener.PRE_UPDATE, updated);
+ if (hasListeners()) {
+ this.seenIds = new HashSet();
+ changes.apply(this);
}
}
- void applyPostCommit(int syncType) {
- switch (syncType) {
- case DataChannel.FLUSH_CASCADE_SYNC:
- case DataChannel.FLUSH_NOCASCADE_SYNC:
- apply(LifecycleListener.POST_UPDATE, updated);
- apply(LifecycleListener.POST_REMOVE, removed);
- apply(LifecycleListener.POST_PERSIST, persisted);
- break;
- case DataChannel.ROLLBACK_CASCADE_SYNC:
- apply(LifecycleListener.POST_LOAD, updated);
- apply(LifecycleListener.POST_LOAD, removed);
- }
- }
+ protected abstract boolean hasListeners();
+
+ abstract void applyPreCommit();
+
+ abstract void applyPostCommit();
void apply(int callbackType, Collection objects) {
- if (objects != null) {
- channel.getEntityResolver().getCallbackRegistry().performCallbacks(
- callbackType,
- objects);
+ if (seenIds != null && objects != null) {
+ callbackRegistry.performCallbacks(callbackType, objects);
}
}
@@ -143,6 +147,52 @@
updated.add(node);
}
+ }
+ }
+
+ static class FlushCallbackAction extends DataChannelSyncCallbackAction {
+
+ FlushCallbackAction(LifecycleCallbackRegistry callbackRegistry,
+ GraphManager graphManager, GraphDiff changes) {
+ super(callbackRegistry, graphManager, changes);
+ }
+
+ protected boolean hasListeners() {
+ return !(callbackRegistry.isEmpty(LifecycleListener.PRE_UPDATE)
+ && callbackRegistry.isEmpty(LifecycleListener.POST_UPDATE)
+ && callbackRegistry.isEmpty(LifecycleListener.POST_REMOVE) && callbackRegistry
+ .isEmpty(LifecycleListener.POST_PERSIST));
+ }
+
+ void applyPreCommit() {
+ apply(LifecycleListener.PRE_UPDATE, updated);
+ }
+
+ void applyPostCommit() {
+ apply(LifecycleListener.POST_UPDATE, updated);
+ apply(LifecycleListener.POST_REMOVE, removed);
+ apply(LifecycleListener.POST_PERSIST, persisted);
+ }
+ }
+
+ static class RollbackCallbackAction extends DataChannelSyncCallbackAction {
+
+ RollbackCallbackAction(LifecycleCallbackRegistry callbackRegistry,
+ GraphManager graphManager, GraphDiff changes) {
+ super(callbackRegistry, graphManager, changes);
+ }
+
+ protected boolean hasListeners() {
+ return !callbackRegistry.isEmpty(LifecycleListener.POST_LOAD);
+ }
+
+ void applyPreCommit() {
+ // noop
+ }
+
+ void applyPostCommit() {
+ apply(LifecycleListener.POST_LOAD, updated);
+ apply(LifecycleListener.POST_LOAD, removed);
}
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java?view=diff&rev=560828&r1=560827&r2=560828
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java Sun Jul 29 15:27:57 2007
@@ -743,12 +743,14 @@
final GraphDiff changes,
int syncType) {
- DataChannelSyncCallbackAction callbackAction = new DataChannelSyncCallbackAction(
- this,
- originatingContext.getGraphManager(),
- changes);
+ DataChannelSyncCallbackAction callbackAction = DataChannelSyncCallbackAction
+ .getCallbackAction(
+ getEntityResolver().getCallbackRegistry(),
+ originatingContext.getGraphManager(),
+ changes,
+ syncType);
- callbackAction.applyPreCommit(syncType);
+ callbackAction.applyPreCommit();
GraphDiff result;
switch (syncType) {
@@ -772,7 +774,7 @@
+ syncType);
}
- callbackAction.applyPostCommit(syncType);
+ callbackAction.applyPostCommit();
return result;
}