You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/04/24 14:54:00 UTC

[cayenne] 03/06: CAY-2571 DataDomainFlushAction redesign switch data domain to new Flush action implementation

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit d0b4244748b8e5fc579587b8711085c1d58de011
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Mon Apr 22 18:03:04 2019 +0300

    CAY-2571 DataDomainFlushAction redesign
    switch data domain to new Flush action implementation
---
 .../dbsync/reverse/configuration/ToolsModule.java  |  8 +++-
 .../event/JavaGroupsBridgeProviderTest.java        |  6 +++
 .../cayenne/event/JMSBridgeProviderTest.java       |  6 +++
 .../java/org/apache/cayenne/access/DataDomain.java | 12 ++++--
 .../cayenne/access/DataDomainDBDiffBuilder.java    |  2 +
 .../cayenne/access/DataDomainDeleteBucket.java     |  4 +-
 .../cayenne/access/DataDomainFlattenedBucket.java  |  6 ++-
 .../cayenne/access/DataDomainFlushObserver.java    |  2 +
 .../access/DataDomainIndirectDiffBuilder.java      |  7 ++--
 .../cayenne/access/DataDomainInsertBucket.java     |  7 +++-
 .../cayenne/access/DataDomainSyncBucket.java       |  6 ++-
 .../cayenne/access/DataDomainUpdateBucket.java     |  4 +-
 .../access/DataNodeSyncQualifierDescriptor.java    |  2 +
 .../java/org/apache/cayenne/access/DbArcId.java    |  2 +
 .../cayenne/access/DbEntityClassDescriptor.java    |  2 +
 .../org/apache/cayenne/access/FlattenedArcKey.java |  2 +
 ...ction.java => LegacyDataDomainFlushAction.java} | 11 ++++--
 .../access/LegacyDataDomainFlushActionFactory.java | 45 ++++++++++++++++++++++
 .../apache/cayenne/access/OperationObserver.java   |  4 +-
 .../cayenne/configuration/server/ServerModule.java | 14 +++++--
 .../cayenne/event/XMPPBridgeProviderTest.java      |  6 +++
 21 files changed, 132 insertions(+), 26 deletions(-)

diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
index 0f41ffd..ce6d643 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
@@ -19,6 +19,10 @@
 
 package org.apache.cayenne.dbsync.reverse.configuration;
 
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.operation.DefaultDbRowOpSorter;
+import org.apache.cayenne.access.flush.operation.DbRowOpSorter;
 import org.apache.cayenne.access.translator.batch.BatchTranslatorFactory;
 import org.apache.cayenne.access.translator.batch.DefaultBatchTranslatorFactory;
 import org.apache.cayenne.access.types.DefaultValueObjectTypeRegistry;
@@ -53,9 +57,7 @@ import org.apache.cayenne.dba.openbase.OpenBaseSniffer;
 import org.apache.cayenne.dba.oracle.OracleSniffer;
 import org.apache.cayenne.dba.postgres.PostgresSniffer;
 import org.apache.cayenne.dba.sqlite.SQLiteSniffer;
-import org.apache.cayenne.dba.sqlserver.SQLServerAdapter;
 import org.apache.cayenne.dba.sqlserver.SQLServerSniffer;
-import org.apache.cayenne.dba.sybase.SybasePkGenerator;
 import org.apache.cayenne.dba.sybase.SybaseSniffer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
@@ -129,6 +131,8 @@ public class ToolsModule implements Module {
         binder.bind(HandlerFactory.class).to(ExtensionAwareHandlerFactory.class);
         binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
         binder.bind(XMLReader.class).toProviderInstance(new XMLReaderProvider(true)).withoutScope();
+        binder.bind(DataDomainFlushActionFactory.class).to(DefaultDataDomainFlushActionFactory.class);
+        binder.bind(DbRowOpSorter.class).to(DefaultDbRowOpSorter.class);
 
         ProjectModule.contributeExtensions(binder);
     }
diff --git a/cayenne-jgroups/src/test/java/org/apache/cayenne/event/JavaGroupsBridgeProviderTest.java b/cayenne-jgroups/src/test/java/org/apache/cayenne/event/JavaGroupsBridgeProviderTest.java
index 8df03d8..eee4833 100644
--- a/cayenne-jgroups/src/test/java/org/apache/cayenne/event/JavaGroupsBridgeProviderTest.java
+++ b/cayenne-jgroups/src/test/java/org/apache/cayenne/event/JavaGroupsBridgeProviderTest.java
@@ -20,6 +20,10 @@
 package org.apache.cayenne.event;
 
 import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.operation.DefaultDbRowOpSorter;
+import org.apache.cayenne.access.flush.operation.DbRowOpSorter;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.RuntimeProperties;
@@ -93,6 +97,8 @@ public class JavaGroupsBridgeProviderTest {
             binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
             binder.bind(JdbcEventLogger.class).to(Slf4jJdbcEventLogger.class);
             binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
+            binder.bind(DataDomainFlushActionFactory.class).to(DefaultDataDomainFlushActionFactory.class);
+            binder.bind(DbRowOpSorter.class).to(DefaultDbRowOpSorter.class);
         }
     }
 }
diff --git a/cayenne-jms/src/test/java/org/apache/cayenne/event/JMSBridgeProviderTest.java b/cayenne-jms/src/test/java/org/apache/cayenne/event/JMSBridgeProviderTest.java
index 9c77f05..117859f 100644
--- a/cayenne-jms/src/test/java/org/apache/cayenne/event/JMSBridgeProviderTest.java
+++ b/cayenne-jms/src/test/java/org/apache/cayenne/event/JMSBridgeProviderTest.java
@@ -20,6 +20,10 @@
 package org.apache.cayenne.event;
 
 import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.operation.DefaultDbRowOpSorter;
+import org.apache.cayenne.access.flush.operation.DbRowOpSorter;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.RuntimeProperties;
@@ -82,6 +86,8 @@ public class JMSBridgeProviderTest {
             binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
             binder.bind(JdbcEventLogger.class).to(Slf4jJdbcEventLogger.class);
             binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
+            binder.bind(DataDomainFlushActionFactory.class).to(DefaultDataDomainFlushActionFactory.class);
+            binder.bind(DbRowOpSorter.class).to(DefaultDbRowOpSorter.class);
         }
     }
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
index a81c940..6c41466 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
@@ -28,6 +28,8 @@ import org.apache.cayenne.DataChannelSyncFilter;
 import org.apache.cayenne.DataChannelSyncFilterChain;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.QueryResponse;
+import org.apache.cayenne.access.flush.DataDomainFlushAction;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
 import org.apache.cayenne.cache.QueryCache;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.di.BeforeScopeEnd;
@@ -107,6 +109,12 @@ public class DataDomain implements QueryEngine, DataChannel {
 	 */
 	protected List<DataChannelSyncFilter> syncFilters;
 
+	/**
+	 * @since 4.2
+	 */
+	@Inject
+	protected DataDomainFlushActionFactory flushActionFactory;
+
 	protected Map<String, DataNode> nodes;
 	protected Map<String, DataNode> nodesByDataMapName;
 	protected DataNode defaultNode;
@@ -618,9 +626,7 @@ public class DataDomain implements QueryEngine, DataChannel {
 							+ "Unsupported context: %s", originatingContext);
 		}
 
-		DataDomainFlushAction action = new DataDomainFlushAction(this);
-		action.setJdbcEventLogger(jdbcEventLogger);
-
+		DataDomainFlushAction action = flushActionFactory.createFlushAction(this);
 		return action.flush((DataContext) originatingContext, childChanges);
 	}
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
index ea6964d..a9ccd39 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
@@ -42,7 +42,9 @@ import java.util.Map.Entry;
  * INSERT.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainDBDiffBuilder implements GraphChangeHandler {
 
     private ObjEntity objEntity;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDeleteBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDeleteBucket.java
index 7d1e772..46193bd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDeleteBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDeleteBucket.java
@@ -36,10 +36,12 @@ import org.apache.cayenne.query.Query;
 
 /**
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainDeleteBucket extends DataDomainSyncBucket {
 
-    DataDomainDeleteBucket(DataDomainFlushAction parent) {
+    DataDomainDeleteBucket(LegacyDataDomainFlushAction parent) {
         super(parent);
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
index ba2a844..321daee 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlattenedBucket.java
@@ -38,14 +38,16 @@ import java.util.Map;
  * A sync bucket that holds flattened queries.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainFlattenedBucket {
 
-    final DataDomainFlushAction parent;
+    final LegacyDataDomainFlushAction parent;
     final Map<DbEntity, List<FlattenedArcKey>> insertArcKeys;
     final Map<DbEntity, DeleteBatchQuery> flattenedDeleteQueries;
 
-    DataDomainFlattenedBucket(DataDomainFlushAction parent) {
+    DataDomainFlattenedBucket(LegacyDataDomainFlushAction parent) {
         this.parent = parent;
         this.insertArcKeys = new HashMap<>();
         this.flattenedDeleteQueries = new HashMap<>();
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
index 44923dc..58d1d4a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
@@ -36,7 +36,9 @@ import org.apache.cayenne.util.Util;
  * Used as an observer for DataContext commit operations.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainFlushObserver implements OperationObserver {
 
     /**
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
index b7aeaf2..57686ac 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.graph.ArcId;
 import org.apache.cayenne.graph.GraphChangeHandler;
 import org.apache.cayenne.graph.GraphDiff;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -38,16 +37,18 @@ import org.apache.cayenne.map.ObjRelationship;
  * and to-many relationships.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 final class DataDomainIndirectDiffBuilder implements GraphChangeHandler {
 
-    private final DataDomainFlushAction parent;
+    private final LegacyDataDomainFlushAction parent;
     private final EntityResolver resolver;
     private final Collection<ObjectId> indirectModifications;
     private final Collection<FlattenedArcKey> flattenedInserts;
     private final Collection<FlattenedArcKey> flattenedDeletes;
 
-    DataDomainIndirectDiffBuilder(DataDomainFlushAction parent) {
+    DataDomainIndirectDiffBuilder(LegacyDataDomainFlushAction parent) {
         this.parent = parent;
         this.indirectModifications = parent.getResultIndirectlyModifiedIds();
         this.resolver = parent.getDomain().getEntityResolver();
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
index eee50ab..8fbdd18 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
@@ -41,12 +41,14 @@ import org.apache.cayenne.query.Query;
 
 /**
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainInsertBucket extends DataDomainSyncBucket {
 
     List<FlattenedInsert> flattenedInserts;
 
-    DataDomainInsertBucket(DataDomainFlushAction parent) {
+    DataDomainInsertBucket(LegacyDataDomainFlushAction parent) {
         super(parent);
     }
 
@@ -222,13 +224,14 @@ class DataDomainInsertBucket extends DataDomainSyncBucket {
     private static class FlattenedInsert {
         private final String path;
         private final Persistent object;
+
         private FlattenedInsert(String path, Persistent object) {
             this.path = path;
             this.object = object;
         }
 
         private void register(ObjectStore objectStore) {
-            objectStore.markFlattenedPath(object.getObjectId(), path);
+            objectStore.markFlattenedPath(object.getObjectId(), path, ObjectId.of("tmp"));
         }
     }
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
index 4e9dd0d..afb6a82 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
@@ -48,16 +48,18 @@ import java.util.function.Supplier;
  * A superclass of batch query wrappers.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 abstract class DataDomainSyncBucket {
 
     final Map<ClassDescriptor, List<Persistent>> objectsByDescriptor;
-    final DataDomainFlushAction parent;
+    final LegacyDataDomainFlushAction parent;
 
     List<DbEntity> dbEntities;
     Map<DbEntity, Collection<DbEntityClassDescriptor>> descriptorsByDbEntity;
 
-    DataDomainSyncBucket(DataDomainFlushAction parent) {
+    DataDomainSyncBucket(LegacyDataDomainFlushAction parent) {
         this.objectsByDescriptor = new HashMap<>();
         this.parent = parent;
     }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainUpdateBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainUpdateBucket.java
index 57d871a..9fcf23a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainUpdateBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainUpdateBucket.java
@@ -40,10 +40,12 @@ import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataDomainUpdateBucket extends DataDomainSyncBucket {
 
-    DataDomainUpdateBucket(DataDomainFlushAction parent) {
+    DataDomainUpdateBucket(LegacyDataDomainFlushAction parent) {
         super(parent);
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
index 176227c..cc75bae 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
@@ -38,7 +38,9 @@ import org.apache.cayenne.map.ObjRelationship;
  * Builds update qualifier snapshots, including optimistic locking.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DataNodeSyncQualifierDescriptor {
 
 	private List<DbAttribute> attributes;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DbArcId.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DbArcId.java
index 4d66101..3ac905d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbArcId.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbArcId.java
@@ -30,7 +30,9 @@ import org.apache.cayenne.util.HashCodeBuilder;
  * 'hashCode' implementations adequate for use as a map key.
  * 
  * @since 4.0
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 final class DbArcId {
 
     private int hashCode;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DbEntityClassDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DbEntityClassDescriptor.java
index 273ce33..b8e8344 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbEntityClassDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbEntityClassDescriptor.java
@@ -36,7 +36,9 @@ import java.util.List;
  * commit.
  * 
  * @since 3.0
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 class DbEntityClassDescriptor {
 
     private ClassDescriptor classDescriptor;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java b/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
index 2b2217d..3209add 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
@@ -48,7 +48,9 @@ import java.util.Map;
  * A holder of flattened relationship modification data.
  * 
  * @since 1.2
+ * @deprecated since 4.2 as part of deprecated {@link LegacyDataDomainFlushAction}
  */
+@Deprecated
 final class FlattenedArcKey {
 
 	ObjRelationship relationship;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushAction.java
similarity index 95%
rename from cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java
rename to cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushAction.java
index 2acb561..b4d21d5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushAction.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushAction;
 import org.apache.cayenne.graph.CompoundDiff;
 import org.apache.cayenne.graph.GraphDiff;
 import org.apache.cayenne.log.JdbcEventLogger;
@@ -46,10 +47,12 @@ import java.util.Map;
  * DataContextCommitAction resolves primary key dependencies, referential integrity
  * dependencies (including multi-reflexive entities), generates primary keys, creates
  * batches for massive data modifications, assigns operations to data nodes.
- * 
+ *
  * @since 1.2
+ * @deprecated this implementation is deprecated since 4.2, {@link DefaultDataDomainFlushAction} is used
  */
-class DataDomainFlushAction {
+@Deprecated
+public class LegacyDataDomainFlushAction implements org.apache.cayenne.access.flush.DataDomainFlushAction {
 
     private final DataDomain domain;
     private DataContext context;
@@ -69,7 +72,7 @@ class DataDomainFlushAction {
 
     private JdbcEventLogger logger;
 
-    DataDomainFlushAction(DataDomain domain) {
+    public LegacyDataDomainFlushAction(DataDomain domain) {
         this.domain = domain;
     }
 
@@ -117,7 +120,7 @@ class DataDomainFlushAction {
         flattenedBucket.addFlattenedDelete(flattenedEntity, flattenedDeleteInfo);
     }
 
-    GraphDiff flush(DataContext context, GraphDiff changes) {
+    public GraphDiff flush(DataContext context, GraphDiff changes) {
 
         if (changes == null) {
             return new CompoundDiff();
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushActionFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushActionFactory.java
new file mode 100644
index 0000000..b822b03
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/LegacyDataDomainFlushActionFactory.java
@@ -0,0 +1,45 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.access;
+
+import org.apache.cayenne.access.flush.DataDomainFlushAction;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.log.JdbcEventLogger;
+
+/**
+ * Factory for {@link LegacyDataDomainFlushAction}.
+ * A fallback factory to use deprecated implementation if absolutely needed.
+ *
+ * @since 4.2
+ */
+@Deprecated
+public class LegacyDataDomainFlushActionFactory implements DataDomainFlushActionFactory {
+
+    @Inject
+    private JdbcEventLogger jdbcEventLogger;
+
+    @Override
+    public DataDomainFlushAction createFlushAction(DataDomain dataDomain) {
+        LegacyDataDomainFlushAction action = new LegacyDataDomainFlushAction(dataDomain);
+        action.setJdbcEventLogger(jdbcEventLogger);
+        return action;
+    }
+}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
index 2c7734a..80f2906 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
@@ -69,11 +69,11 @@ public interface OperationObserver extends OperationHints {
      * Callback method invoked on exceptions that happen during an execution of a specific
      * query.
      */
-    public void nextQueryException(Query query, Exception ex);
+    void nextQueryException(Query query, Exception ex);
 
     /**
      * Callback method invoked on exceptions that are not tied to a specific query
      * execution, such as JDBC connection exceptions, etc.
      */
-    public void nextGlobalException(Exception ex);
+    void nextGlobalException(Exception ex);
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
index 197ad72..bdeb97f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
@@ -29,9 +29,14 @@ import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.access.DataRowStoreFactory;
 import org.apache.cayenne.access.DefaultDataRowStoreFactory;
 import org.apache.cayenne.access.DefaultObjectMapRetainStrategy;
+import org.apache.cayenne.access.LegacyDataDomainFlushActionFactory;
 import org.apache.cayenne.access.ObjectMapRetainStrategy;
 import org.apache.cayenne.access.dbsync.DefaultSchemaUpdateStrategyFactory;
 import org.apache.cayenne.access.dbsync.SchemaUpdateStrategyFactory;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.operation.DbRowOpSorter;
+import org.apache.cayenne.access.flush.operation.DefaultDbRowOpSorter;
 import org.apache.cayenne.access.jdbc.SQLTemplateProcessor;
 import org.apache.cayenne.access.jdbc.reader.DefaultRowReaderFactory;
 import org.apache.cayenne.access.jdbc.reader.RowReaderFactory;
@@ -473,12 +478,10 @@ public class ServerModule implements Module {
 
         binder.bind(SchemaUpdateStrategyFactory.class).to(DefaultSchemaUpdateStrategyFactory.class);
 
-        // a default DBAdapterFactory used to load custom and automatic
-        // DbAdapters
+        // a default DBAdapterFactory used to load custom and automatic DbAdapters
         binder.bind(DbAdapterFactory.class).to(DefaultDbAdapterFactory.class);
 
-        // binding AshwoodEntitySorter without scope, as this is a stateful
-        // object and is
+        // binding AshwoodEntitySorter without scope, as this is a stateful object and is
         // configured by the owning domain
         binder.bind(EntitySorter.class).to(AshwoodEntitySorter.class).withoutScope();
 
@@ -501,5 +504,8 @@ public class ServerModule implements Module {
         binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
         binder.bind(DataChannelMetaData.class).to(NoopDataChannelMetaData.class);
         binder.bind(XMLReader.class).toProviderInstance(new XMLReaderProvider(false)).withoutScope();
+
+        binder.bind(DataDomainFlushActionFactory.class).to(DefaultDataDomainFlushActionFactory.class);
+        binder.bind(DbRowOpSorter.class).to(DefaultDbRowOpSorter.class);
     }
 }
diff --git a/cayenne-xmpp/src/test/java/org/apache/cayenne/event/XMPPBridgeProviderTest.java b/cayenne-xmpp/src/test/java/org/apache/cayenne/event/XMPPBridgeProviderTest.java
index e2de1bb..1f84d45 100644
--- a/cayenne-xmpp/src/test/java/org/apache/cayenne/event/XMPPBridgeProviderTest.java
+++ b/cayenne-xmpp/src/test/java/org/apache/cayenne/event/XMPPBridgeProviderTest.java
@@ -20,6 +20,10 @@
 package org.apache.cayenne.event;
 
 import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.access.flush.DataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.DefaultDataDomainFlushActionFactory;
+import org.apache.cayenne.access.flush.operation.DefaultDbRowOpSorter;
+import org.apache.cayenne.access.flush.operation.DbRowOpSorter;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.RuntimeProperties;
@@ -101,6 +105,8 @@ public class XMPPBridgeProviderTest {
             binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
             binder.bind(JdbcEventLogger.class).to(Slf4jJdbcEventLogger.class);
             binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
+            binder.bind(DataDomainFlushActionFactory.class).to(DefaultDataDomainFlushActionFactory.class);
+            binder.bind(DbRowOpSorter.class).to(DefaultDbRowOpSorter.class);
         }
     }
 }