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 2018/07/10 13:54:24 UTC
[2/3] cayenne git commit: CAY-2438 Split DataChannel filter into two
independent filters
CAY-2438 Split DataChannel filter into two independent filters
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/b2d3b393
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/b2d3b393
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/b2d3b393
Branch: refs/heads/master
Commit: b2d3b393610652ab3d51bf88c43c80b324ef0820
Parents: 7475b4e
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed May 30 14:38:23 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Jun 8 16:18:39 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 1 +
UPGRADE.txt | 6 ++-
.../apache/cayenne/DataChannelQueryFilter.java | 24 +++++++++++
.../cayenne/DataChannelQueryFilterChain.java | 2 +
.../apache/cayenne/DataChannelSyncFilter.java | 34 +++++++++++++++
.../cayenne/DataChannelSyncFilterChain.java | 5 +++
.../org/apache/cayenne/access/DataDomain.java | 12 ++++--
.../cayenne/access/DataDomainFiltersIT.java | 45 ++++++++++++++++++++
8 files changed, 124 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index b7d8a7c..482f979 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -35,6 +35,7 @@ CAY-2414 Modeler: new icon design
CAY-2415 Transaction isolation and propagation support
CAY-2416 Change TreeMap for HashMap to store data in Cayenne model classes
CAY-2422 Modeler: Open driver setup window on driver load error
+CAY-2438 Split DataChannel filter into two independent filters
CAY-2440 cdbimport: allow cross-schema relationships
Bug Fixes:
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 6b2f3d1..2dfbd9b 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -5,7 +5,11 @@ IMPORTANT: be sure to read all notes for the intermediate releases between your
current release and the release you are upgrading to.
-------------------------------------------------------------------------------
UPGRADING TO 4.1.M2
-* Per CAY-2400 Cayenne-DBCP2 was deprecated
+
+* Per CAY-2438 DataChannelFilter filter was deprecated and two new independent filters are introduced:
+ DataChannelSyncFilter and DataChannelQueryFilter.
+
+* Per CAY-2400 Cayenne-DBCP2 integration was deprecated
* Per CAY-2377 All code deprecated in Cayenne 4.0 was removed, please review your code before upgrading.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilter.java b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilter.java
index 04f0ef1..ec1b55f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilter.java
@@ -22,11 +22,35 @@ package org.apache.cayenne;
import org.apache.cayenne.query.Query;
/**
+ * An interface of a filter that allows to intercept DataChannel query operations.
+ * Query filters allow to implement chains of custom processors around a DataChannel.
+ * <p>
+ * Example: <pre>{@code
+ * public class MyQueryFilter implements DataChannelQueryFilter {
+ * public QueryResponse onQuery(ObjectContext originatingContext, Query query,
+ * DataChannelQueryFilterChain filterChain) {
+ * System.out.println("Do something before query");
+ * // process query or return some custom response
+ * QueryResponse response = filterChain.onQuery(originatingContext, query);
+ * System.out.println("Do something after query");
+ * return response;
+ * }
+ * }}</pre>
+ *
+ * @see DataChannelSyncFilter
+ * @see org.apache.cayenne.configuration.server.ServerModule#contributeDomainQueryFilters(org.apache.cayenne.di.Binder)
+ *
* @since 4.1
*/
@FunctionalInterface
public interface DataChannelQueryFilter {
+ /**
+ * @param originatingContext originating context of query
+ * @param query that is processed
+ * @param filterChain chain of query filters to invoke after this filter
+ * @return query response
+ */
QueryResponse onQuery(ObjectContext originatingContext, Query query, DataChannelQueryFilterChain filterChain);
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilterChain.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilterChain.java b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilterChain.java
index 322d9d2..4d1b4e4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilterChain.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelQueryFilterChain.java
@@ -22,6 +22,8 @@ package org.apache.cayenne;
import org.apache.cayenne.query.Query;
/**
+ * Interface for chain of query filters
+ *
* @since 4.1
*/
public interface DataChannelQueryFilterChain {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilter.java b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilter.java
index 96f1cdd..b37f8c4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilter.java
@@ -22,10 +22,44 @@ package org.apache.cayenne;
import org.apache.cayenne.graph.GraphDiff;
/**
+ * An interface of a filter that allows to intercept DataChannel sync operations.
+ * Sync filters allow to implement chains of custom processors around a DataChannel.
+ * <p>
+ * Example: <pre>{@code
+ * public class MySyncFilter implements DataChannelSyncFilter {
+ * public GraphDiff onSync(ObjectContext originatingContext,
+ * GraphDiff changes,
+ * int syncType,
+ * DataChannelSyncFilterChain filterChain) {
+ * System.out.println("Do something before sync");
+ * // process changes or return some custom diff
+ * GraphDiff diff = filterChain.onSync(originatingContext, changes, syncType);
+ * System.out.println("Do something after sync");
+ * return diff;
+ * }
+ * }}</pre>
+ *
+ * @see DataChannelQueryFilter
+ * @see org.apache.cayenne.configuration.server.ServerModule#contributeDomainSyncFilters(org.apache.cayenne.di.Binder)
+ *
* @since 4.1
*/
+@FunctionalInterface
public interface DataChannelSyncFilter {
+ /**
+ * @param originatingContext originating context of changes
+ * @param changes diff that is being processed
+ * @param syncType type of sync; possible values: {@link DataChannel#FLUSH_NOCASCADE_SYNC},
+ * {@link DataChannel#FLUSH_CASCADE_SYNC},
+ * {@link DataChannel#ROLLBACK_CASCADE_SYNC}
+ * @param filterChain chain of sync filters to invoke after this filter
+ * @return final context diff
+ *
+ * @see DataChannel#FLUSH_NOCASCADE_SYNC
+ * @see DataChannel#FLUSH_CASCADE_SYNC
+ * @see DataChannel#ROLLBACK_CASCADE_SYNC
+ */
GraphDiff onSync(
ObjectContext originatingContext,
GraphDiff changes,
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilterChain.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilterChain.java b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilterChain.java
index cd5587c..6c7bf38 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilterChain.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/DataChannelSyncFilterChain.java
@@ -20,6 +20,11 @@ package org.apache.cayenne;
import org.apache.cayenne.graph.GraphDiff;
+/**
+ * Interface for chain of sync filters
+ *
+ * @since 4.1 (it was present, but not used before 4.1)
+ */
public interface DataChannelSyncFilterChain {
GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
----------------------------------------------------------------------
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 ecd0938..a81c940 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
@@ -44,13 +44,11 @@ import org.apache.cayenne.query.QueryChain;
import org.apache.cayenne.tx.BaseTransaction;
import org.apache.cayenne.tx.Transaction;
import org.apache.cayenne.tx.TransactionManager;
-import org.apache.cayenne.tx.TransactionalOperation;
import org.apache.cayenne.util.ToStringBuilder;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -731,7 +729,10 @@ public class DataDomain implements QueryEngine, DataChannel {
* @since 4.1
*/
public void addQueryFilter(DataChannelQueryFilter filter) {
- addListener(filter);
+ // skip double listener registration, if filter already in sync filters list
+ if(!syncFilters.contains(filter)) {
+ addListener(filter);
+ }
queryFilters.add(filter);
}
@@ -742,7 +743,10 @@ public class DataDomain implements QueryEngine, DataChannel {
* @since 4.1
*/
public void addSyncFilter(DataChannelSyncFilter filter) {
- addListener(filter);
+ // skip double listener registration, if filter already in query filters list
+ if(!queryFilters.contains(filter)) {
+ addListener(filter);
+ }
syncFilters.add(filter);
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b2d3b393/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainFiltersIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainFiltersIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainFiltersIT.java
index c63e13e..d9aca80 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainFiltersIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainFiltersIT.java
@@ -19,12 +19,16 @@
package org.apache.cayenne.access;
import org.apache.cayenne.DataChannelQueryFilter;
+import org.apache.cayenne.DataChannelQueryFilterChain;
import org.apache.cayenne.DataChannelSyncFilter;
+import org.apache.cayenne.DataChannelSyncFilterChain;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.QueryResponse;
+import org.apache.cayenne.annotation.PostPersist;
import org.apache.cayenne.configuration.server.ServerRuntime;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.graph.GraphDiff;
+import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.testdo.testmap.Artist;
import org.apache.cayenne.unit.di.server.CayenneProjects;
@@ -145,4 +149,45 @@ public class DataDomainFiltersIT extends ServerCase {
assertSame(r2, response);
}
+
+ @Test
+ public void testSyncAndQueryFilter() {
+ ComplexFilter complexFilter = new ComplexFilter();
+ DataDomain domain = runtime.getDataDomain();
+
+ domain.addQueryFilter(complexFilter);
+ domain.addSyncFilter(complexFilter);
+
+ Artist a = context.newObject(Artist.class);
+ a.setArtistName("AAA");
+
+ // testing domain.onSync indirectly
+ context.commitChanges();
+
+ assertEquals(2, complexFilter.results.size());
+ assertEquals("onSync", complexFilter.results.get(0));
+ assertEquals("postPersist", complexFilter.results.get(1));
+ }
+
+ private static class ComplexFilter implements DataChannelQueryFilter, DataChannelSyncFilter {
+
+ private List<String> results = new ArrayList<>();
+
+ @Override
+ public QueryResponse onQuery(ObjectContext originatingContext, Query query, DataChannelQueryFilterChain filterChain) {
+ results.add("onQuery");
+ return filterChain.onQuery(originatingContext, query);
+ }
+
+ @Override
+ public GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType, DataChannelSyncFilterChain filterChain) {
+ results.add("onSync");
+ return filterChain.onSync(originatingContext, changes, syncType);
+ }
+
+ @PostPersist
+ public void postPersist(Object object) {
+ results.add("postPersist");
+ }
+ }
}