You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2015/10/22 11:32:26 UTC
[2/3] cayenne git commit: CAY-2028 | Wrap DataChannelFilter calls in
the main transaction
CAY-2028 | Wrap DataChannelFilter calls in the main transaction
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/0428fb11
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/0428fb11
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/0428fb11
Branch: refs/heads/master
Commit: 0428fb11e121c8abd86bb9a1c3c2cdd97ad0f5fb
Parents: 3cdd487
Author: Savva Kolbachev <s....@gmail.com>
Authored: Tue Oct 20 15:05:29 2015 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Tue Oct 20 15:05:29 2015 +0300
----------------------------------------------------------------------
.../org/apache/cayenne/access/DataDomain.java | 40 +++------
.../configuration/server/ServerModule.java | 8 +-
.../apache/cayenne/tx/TransactionFilter.java | 86 ++++++++++++++++++++
.../cayenne/access/DataDomainFiltersIT.java | 5 +-
4 files changed, 108 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0428fb11/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 718b55a..040aa5e 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
@@ -19,20 +19,10 @@
package org.apache.cayenne.access;
-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;
-import java.util.concurrent.CopyOnWriteArrayList;
-
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataChannel;
import org.apache.cayenne.DataChannelFilter;
import org.apache.cayenne.DataChannelFilterChain;
-import org.apache.cayenne.DataChannelSyncCallbackAction;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.QueryResponse;
import org.apache.cayenne.cache.QueryCache;
@@ -54,6 +44,15 @@ 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;
+import java.util.concurrent.CopyOnWriteArrayList;
+
/**
* DataDomain performs query routing functions in Cayenne. DataDomain creates
* single data source abstraction hiding multiple physical data sources from the
@@ -587,34 +586,21 @@ public class DataDomain implements QueryEngine, DataChannel {
}
GraphDiff onSyncNoFilters(final ObjectContext originatingContext, final GraphDiff changes, int syncType) {
- DataChannelSyncCallbackAction callbackAction = DataChannelSyncCallbackAction.getCallbackAction(
- getEntityResolver().getCallbackRegistry(), originatingContext.getGraphManager(), changes, syncType);
-
- callbackAction.applyPreCommit();
- GraphDiff result;
- switch (syncType) {
+ GraphDiff result;
+ switch (syncType) {
case DataChannel.ROLLBACK_CASCADE_SYNC:
result = onSyncRollback(originatingContext);
break;
- // "cascade" and "no_cascade" are the same from the DataDomain
- // perspective,
- // including transaction handling logic
+ // "cascade" and "no_cascade" are the same from the DataDomain perspective
case DataChannel.FLUSH_NOCASCADE_SYNC:
case DataChannel.FLUSH_CASCADE_SYNC:
- result = transactionManager.performInTransaction(new TransactionalOperation<GraphDiff>() {
- @Override
- public GraphDiff perform() {
- return onSyncFlush(originatingContext, changes);
- }
- });
-
+ result = onSyncFlush(originatingContext, changes);
break;
default:
throw new CayenneRuntimeException("Invalid synchronization type: " + syncType);
}
- callbackAction.applyPostCommit();
return result;
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0428fb11/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
----------------------------------------------------------------------
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 997a579..c761b4c 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
@@ -22,6 +22,7 @@ import org.apache.cayenne.DataChannel;
import org.apache.cayenne.access.DataDomain;
import org.apache.cayenne.access.DefaultObjectMapRetainStrategy;
import org.apache.cayenne.access.ObjectMapRetainStrategy;
+import org.apache.cayenne.tx.TransactionFilter;
import org.apache.cayenne.access.dbsync.SchemaUpdateStrategy;
import org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy;
import org.apache.cayenne.access.jdbc.SQLTemplateProcessor;
@@ -165,8 +166,11 @@ public class ServerModule implements Module {
.add(SQLServerSniffer.class).add(OracleSniffer.class).add(PostgresSniffer.class)
.add(MySQLSniffer.class);
- // configure an empty filter chain
- binder.bindList(Constants.SERVER_DOMAIN_FILTERS_LIST);
+ binder.bind(TransactionFilter.class).to(TransactionFilter.class);
+
+ // configure a filter chain with only one TransactionFilter as default
+ binder.bindList(Constants.SERVER_DOMAIN_FILTERS_LIST)
+ .add(TransactionFilter.class);
// configure extended types
binder.bindList(Constants.SERVER_DEFAULT_TYPES_LIST).add(new VoidType()).add(new BigDecimalType())
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0428fb11/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
new file mode 100644
index 0000000..e87ca34
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ * 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.tx;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.DataChannel;
+import org.apache.cayenne.DataChannelFilter;
+import org.apache.cayenne.DataChannelFilterChain;
+import org.apache.cayenne.DataChannelSyncCallbackAction;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.QueryResponse;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.graph.GraphDiff;
+import org.apache.cayenne.query.Query;
+
+/**
+ * A {@link DataChannelFilter} that provides transactions.
+ *
+ * @since 4.0
+ */
+public class TransactionFilter implements DataChannelFilter {
+
+ @Inject
+ protected TransactionManager transactionManager;
+
+ @Override
+ public void init(DataChannel channel) {
+ }
+
+ @Override
+ public QueryResponse onQuery(ObjectContext originatingContext, Query query, DataChannelFilterChain filterChain) {
+ return filterChain.onQuery(originatingContext, query);
+ }
+
+ @Override
+ public GraphDiff onSync(final ObjectContext originatingContext, final GraphDiff changes, final int syncType, final DataChannelFilterChain filterChain) {
+ DataChannelSyncCallbackAction callbackAction = DataChannelSyncCallbackAction.getCallbackAction(
+ originatingContext.getChannel().getEntityResolver().getCallbackRegistry(),
+ originatingContext.getGraphManager(),
+ changes, syncType);
+
+ callbackAction.applyPreCommit();
+
+ GraphDiff result;
+ switch (syncType) {
+ case DataChannel.ROLLBACK_CASCADE_SYNC:
+ result = filterChain.onSync(originatingContext, changes, syncType);;
+ break;
+
+ // including transaction handling logic
+ case DataChannel.FLUSH_NOCASCADE_SYNC:
+ case DataChannel.FLUSH_CASCADE_SYNC:
+ result = transactionManager.performInTransaction(new TransactionalOperation<GraphDiff>() {
+ @Override
+ public GraphDiff perform() {
+ return filterChain.onSync(originatingContext, changes, syncType);
+ }
+ });
+
+ break;
+ default:
+ throw new CayenneRuntimeException("Invalid synchronization type: " + syncType);
+ }
+
+ callbackAction.applyPostCommit();
+ return result;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0428fb11/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 36dd7f8..8e84fd0 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
@@ -52,10 +52,11 @@ public class DataDomainFiltersIT extends ServerCase {
private ServerRuntime runtime;
@Test
- public void testDefaultNoFilters() {
+ public void testDefaultFilters() {
+ // There is a default TransactionFilter
DataDomain domain = runtime.getDataDomain();
- assertEquals(0, domain.filters.size());
+ assertEquals(1, domain.filters.size());
}
@Test