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

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

commit 77d67e724a1c112fed161d14202947229776d80a
Author: Arseni Bulatski <ancars...@gmail.com>
AuthorDate: Fri Jan 18 10:38:00 2019 +0300

    CAY-2514 Set SERVER_CONTEXTS_SYNC_PROPERTY default value to false
---
 RELEASE-NOTES.txt                                  |  1 +
 .../configuration/rop/client/ClientModule.java     | 11 ++-
 .../CayenneContextClientChannelEventsIT.java       |  4 +-
 .../configuration/rop/client/ClientModuleTest.java | 10 ++-
 .../rop/client/ClientRuntimeTest.java              | 10 ++-
 .../unit/di/client/ClientCaseContextsSync.java     | 70 +++++++++++++++++++
 .../client/ClientRuntimeProviderContextsSync.java  | 60 ++++++++++++++++
 .../configuration/DefaultObjectStoreFactory.java   |  2 +-
 .../cayenne/configuration/server/ServerModule.java | 12 ++--
 .../apache/cayenne/event/EventManagerProvider.java | 44 ++++++++++++
 .../org/apache/cayenne/event/NoopEventManager.java | 81 ++++++++++++++++++++++
 .../access/DataContextDataChannelEventsIT.java     |  4 +-
 .../access/DataContextDelegateSharedCacheIT.java   |  8 +--
 .../access/DataContextSharedCacheEmpiricIT.java    | 10 +--
 .../cayenne/access/DataContextSharedCacheIT.java   | 16 ++---
 .../access/NestedDataContextParentEventsIT.java    |  4 +-
 .../NestedDataContextParentPeerEventsIT.java       |  4 +-
 .../access/NestedDataContextPeerEventsIT.java      |  4 +-
 .../apache/cayenne/access/jdbc/SelectActionIT.java |  8 +--
 .../unit/di/server/ServerCaseContextsSync.java     | 65 +++++++++++++++++
 .../server/ServerRuntimeProviderContextsSync.java  | 64 +++++++++++++++++
 21 files changed, 443 insertions(+), 49 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 628300f..ecbaa20 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -45,6 +45,7 @@ CAY-2491 Remaster Db Import View
 CAY-2493 Save cgen configuration with datamap XML
 CAY-2494 Rename dbImport tag from 'config' to 'dbImport'
 CAY-2499 Support for COUNT(DISTINCT(column)) function aggregate
+CAY-2514 Set SERVER_CONTEXTS_SYNC_PROPERTY default value to false
 
 Bug Fixes:
 
diff --git 
a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
 
b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
index 4a95df6..ba07559 100644
--- 
a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
+++ 
b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.rop.client;
 
-import java.util.Map;
-
 import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.cache.MapQueryCacheProvider;
 import org.apache.cayenne.cache.QueryCache;
@@ -28,13 +26,14 @@ import 
org.apache.cayenne.configuration.ObjectContextFactory;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.MapBuilder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.event.DefaultEventManager;
 import org.apache.cayenne.event.EventManager;
+import org.apache.cayenne.event.EventManagerProvider;
 import org.apache.cayenne.remote.ClientConnection;
 import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.rop.*;
+import org.apache.cayenne.rop.HttpClientConnectionProvider;
+import org.apache.cayenne.rop.ProxyRemoteService;
+import org.apache.cayenne.rop.ROPSerializationService;
 import org.apache.cayenne.rop.http.ClientHessianSerializationServiceProvider;
 
 /**
@@ -61,7 +60,7 @@ public class ClientModule implements Module {
         
binder.bind(ROPSerializationService.class).toProvider(ClientHessianSerializationServiceProvider.class);
         binder.bind(RemoteService.class).to(ProxyRemoteService.class);
         
binder.bind(ClientConnection.class).toProvider(HttpClientConnectionProvider.class);
-        binder.bind(EventManager.class).to(DefaultEventManager.class);
+        binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
         
binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
         binder.bind(DataChannel.class).toProvider(ClientChannelProvider.class);
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
index 891f146..49ef1f5 100644
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.testdo.mt.ClientMtTable1;
 import org.apache.cayenne.testdo.mt.ClientMtTable2;
 import org.apache.cayenne.testdo.mt.ClientMtTable4;
 import org.apache.cayenne.testdo.mt.ClientMtTable5;
-import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.client.ClientCaseContextsSync;
 import org.apache.cayenne.unit.di.client.ClientRuntimeProperty;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
@@ -45,7 +45,7 @@ import static org.junit.Assert.*;
 @ClientRuntimeProperty({
         ClientConstants.ROP_CHANNEL_EVENTS_PROPERTY, "true"
 })
-public class CayenneContextClientChannelEventsIT extends ClientCase {
+public class CayenneContextClientChannelEventsIT extends 
ClientCaseContextsSync {
 
     @Inject
     private DBHelper dbHelper;
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
index 2480c26..0fb1005 100644
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
@@ -18,8 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.rop.client;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.cayenne.DataChannel;
+import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.ObjectContextFactory;
+import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
@@ -29,9 +34,6 @@ import org.apache.cayenne.remote.ClientConnection;
 import org.apache.cayenne.remote.MockClientConnection;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
@@ -75,6 +77,8 @@ public class ClientModuleTest {
 
                 // use a noop connection to prevent startup errors...
                 
binder.bind(ClientConnection.class).to(MockClientConnection.class);
+                ServerModule.contributeProperties(binder)
+                        .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, 
String.valueOf(true));
             }
         };
 
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
index 1b28d45..8fdb593 100644
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
@@ -18,9 +18,14 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.rop.client;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.cayenne.CayenneContext;
 import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.event.DefaultEventManager;
@@ -30,9 +35,6 @@ import org.apache.cayenne.remote.ClientConnection;
 import org.apache.cayenne.remote.MockClientConnection;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
@@ -98,6 +100,8 @@ public class ClientRuntimeTest {
                Map<String, String> properties = new HashMap<>();
                ClientRuntime runtime = ClientRuntime.builder()
                                                                
.properties(properties)
+                                                               
.addModule(binder -> ServerModule.contributeProperties(binder)
+                                                                               
.put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, String.valueOf(true)))
                                                                .build();
 
                // make sure objects to be shut down are resolved
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseContextsSync.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseContextsSync.java
new file mode 100644
index 0000000..2e48a80
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseContextsSync.java
@@ -0,0 +1,70 @@
+/*****************************************************************
+ *   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.unit.di.client;
+
+import org.apache.cayenne.configuration.rop.client.ClientRuntime;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.di.spi.DefaultScope;
+import org.apache.cayenne.unit.di.DICase;
+import org.apache.cayenne.unit.di.server.DBCleaner;
+import org.apache.cayenne.unit.di.server.SchemaBuilder;
+import org.apache.cayenne.unit.di.server.ServerCaseModule;
+import org.apache.cayenne.unit.di.server.ServerRuntimeProviderContextsSync;
+import org.junit.Before;
+
+/**
+ * @since 4.1
+ */
+public class ClientCaseContextsSync extends DICase {
+
+    private static final Injector injector;
+
+    @Inject
+    private DBCleaner dbCleaner;
+
+    static {
+        DefaultScope testScope = new DefaultScope();
+        injector = DIBootstrap.createInjector(
+                new ServerCaseModule(testScope),
+                new ClientCaseModule(testScope),
+                binder -> {
+                    
binder.bind(ClientRuntime.class).toProvider(ClientRuntimeProviderContextsSync.class);
+                    
binder.bind(ServerRuntime.class).toProvider(ServerRuntimeProviderContextsSync.class);
+                });
+
+        injector.getInstance(SchemaBuilder.class).rebuildSchema();
+    }
+
+    @Before
+    public void cleanUpDB() throws Exception {
+        try {
+            dbCleaner.clean();
+        } catch (Exception ex) {
+            dbCleaner.clean();
+        }
+    }
+
+    @Override
+    protected Injector getUnitTestInjector() {
+        return injector;
+    }
+}
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProviderContextsSync.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProviderContextsSync.java
new file mode 100644
index 0000000..01c6d7a
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProviderContextsSync.java
@@ -0,0 +1,60 @@
+/*****************************************************************
+ *   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.unit.di.client;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.DataChannel;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.rop.client.ClientRuntime;
+import org.apache.cayenne.configuration.rop.client.LocalConnectionProvider;
+import org.apache.cayenne.configuration.server.ServerModule;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Key;
+import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.remote.ClientConnection;
+
+/**
+ * @since 4.1
+ */
+public class ClientRuntimeProviderContextsSync implements 
Provider<ClientRuntime> {
+
+    // injecting provider to make this provider independent from scoping of 
ServerRuntime
+    @Inject
+    protected Provider<ServerRuntime> serverRuntimeProvider;
+
+    @Inject
+    protected ClientCaseProperties clientCaseProperties;
+
+    public ClientRuntime get() throws ConfigurationException {
+        return ClientRuntime.builder()
+                .properties(clientCaseProperties.getRuntimeProperties())
+                .addModule(binder -> {
+                    // add an interceptor between client and server parts to 
capture and inspect the traffic
+                    binder.bind(Key.get(DataChannel.class, 
ClientRuntime.CLIENT_SERVER_CHANNEL_KEY))
+                            .toProviderInstance(new 
InterceptingClientServerChannelProvider(serverRuntimeProvider.get().getInjector()));
+                    // create local connection
+                    binder.bind(ClientConnection.class).toProviderInstance(new 
LocalConnectionProvider());
+                    ServerModule.contributeProperties(binder)
+                            .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, 
String.valueOf(true));
+                })
+                .build();
+    }
+
+}
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultObjectStoreFactory.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultObjectStoreFactory.java
index 820ca07..29d5c99 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultObjectStoreFactory.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultObjectStoreFactory.java
@@ -40,7 +40,7 @@ public class DefaultObjectStoreFactory implements 
ObjectStoreFactory {
     protected ObjectMapRetainStrategy retainStrategy;
     
     public ObjectStore createObjectStore(DataRowStore dataRowCache) {
-        boolean sync = 
runtimeProperties.getBoolean(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, true);
+        boolean sync = 
runtimeProperties.getBoolean(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, false);
         
         return sync ? new ObjectStore(dataRowCache, 
retainStrategy.createObjectMap()) 
                 : new NoSyncObjectStore(dataRowCache, 
retainStrategy.createObjectMap());
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 0fa82b8..197ad72 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
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.server;
 
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
 import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.DataChannelFilter;
 import org.apache.cayenne.DataChannelQueryFilter;
@@ -132,9 +135,9 @@ import org.apache.cayenne.di.MapBuilder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.event.DefaultEventManager;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
+import org.apache.cayenne.event.EventManagerProvider;
 import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.log.Slf4jJdbcEventLogger;
@@ -151,9 +154,6 @@ import org.apache.cayenne.tx.TransactionFilter;
 import org.apache.cayenne.tx.TransactionManager;
 import org.xml.sax.XMLReader;
 
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
 /**
  * A DI module containing all Cayenne server runtime configuration.
  *
@@ -342,6 +342,8 @@ public class ServerModule implements Module {
         // configure global stack properties
         contributeProperties(binder)
                 .put(Constants.SERVER_MAX_ID_QUALIFIER_SIZE_PROPERTY, 
String.valueOf(DEFAULT_MAX_ID_QUALIFIER_SIZE));
+        contributeProperties(binder)
+                .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, 
String.valueOf(false));
 
         binder.bind(JdbcEventLogger.class).to(Slf4jJdbcEventLogger.class);
         
binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
@@ -430,7 +432,7 @@ public class ServerModule implements Module {
 
         
binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
 
-        binder.bind(EventManager.class).to(DefaultEventManager.class);
+        binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
 
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java
new file mode 100644
index 0000000..8a14169
--- /dev/null
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java
@@ -0,0 +1,44 @@
+/*****************************************************************
+ *   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.event;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+
+/**
+ * @since 4.1
+ */
+public class EventManagerProvider implements Provider<EventManager> {
+
+    protected RuntimeProperties properties;
+
+    public EventManagerProvider(@Inject RuntimeProperties properties) {
+        this.properties = properties;
+    }
+
+    @Override
+    public EventManager get() throws ConfigurationException {
+        boolean sync = 
properties.getBoolean(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, false);
+
+        return sync ? new DefaultEventManager() : new NoopEventManager();
+    }
+}
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java 
b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java
new file mode 100644
index 0000000..14d2f51
--- /dev/null
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java
@@ -0,0 +1,81 @@
+/*****************************************************************
+ *   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.event;
+
+import java.util.EventObject;
+
+/**
+ * @since 4.1
+ */
+public class NoopEventManager implements EventManager {
+    @Override
+    public boolean isSingleThreaded() {
+        return false;
+    }
+
+    @Override
+    public void addListener(Object listener, String methodName, Class<?> 
eventParameterClass, EventSubject subject) {
+
+    }
+
+    @Override
+    public void addNonBlockingListener(Object listener, String methodName, 
Class<?> eventParameterClass, EventSubject subject) {
+
+    }
+
+    @Override
+    public void addListener(Object listener, String methodName, Class<?> 
eventParameterClass, EventSubject subject, Object sender) {
+
+    }
+
+    @Override
+    public void addNonBlockingListener(Object listener, String methodName, 
Class<?> eventParameterClass, EventSubject subject, Object sender) {
+
+    }
+
+    @Override
+    public boolean removeListener(Object listener) {
+        return false;
+    }
+
+    @Override
+    public boolean removeAllListeners(EventSubject subject) {
+        return false;
+    }
+
+    @Override
+    public boolean removeListener(Object listener, EventSubject subject) {
+        return false;
+    }
+
+    @Override
+    public boolean removeListener(Object listener, EventSubject subject, 
Object sender) {
+        return false;
+    }
+
+    @Override
+    public void postEvent(EventObject event, EventSubject subject) {
+
+    }
+
+    @Override
+    public void postNonBlockingEvent(EventObject event, EventSubject subject) {
+
+    }
+}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDataChannelEventsIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDataChannelEventsIT.java
index 2cff155..914845a 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDataChannelEventsIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDataChannelEventsIT.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.graph.GraphEvent;
 import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.apache.cayenne.util.EventUtil;
 import org.junit.Test;
@@ -40,7 +40,7 @@ import static org.junit.Assert.assertTrue;
  * Tests that DataContext sends DataChannel events.
  */
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextDataChannelEventsIT extends ServerCase {
+public class DataContextDataChannelEventsIT extends ServerCaseContextsSync {
 
     @Inject
     private DataContext context;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheIT.java
index 79c66a5..5548e21 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheIT.java
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.access;
 
+import java.util.Date;
+
 import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.PersistenceState;
@@ -26,13 +28,11 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Date;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -40,7 +40,7 @@ import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertTrue;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextDelegateSharedCacheIT extends ServerCase {
+public class DataContextDelegateSharedCacheIT extends ServerCaseContextsSync {
 
     @Inject
     private DataContext context;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheEmpiricIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheEmpiricIT.java
index 5bae357..c834de9 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheEmpiricIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheEmpiricIT.java
@@ -19,6 +19,9 @@
 
 package org.apache.cayenne.access;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.ObjectStoreFactory;
@@ -31,21 +34,18 @@ import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collections;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextSharedCacheEmpiricIT extends ServerCase {
+public class DataContextSharedCacheEmpiricIT extends ServerCaseContextsSync {
 
     private static final String NEW_NAME = "versionX";
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheIT.java
index 4ba1a2d..20fe8d2 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheIT.java
@@ -19,6 +19,12 @@
 
 package org.apache.cayenne.access;
 
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
@@ -31,18 +37,12 @@ import 
org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.apache.cayenne.unit.util.SQLTemplateCustomizer;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -56,7 +56,7 @@ import static org.junit.Assert.assertTrue;
  * DataDomain.
  */
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextSharedCacheIT extends ServerCase {
+public class DataContextSharedCacheIT extends ServerCaseContextsSync {
 
     @Inject
     private DataContext context;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentEventsIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentEventsIT.java
index 34512bf..3eb69da 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentEventsIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentEventsIT.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
@@ -35,7 +35,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class NestedDataContextParentEventsIT extends ServerCase {
+public class NestedDataContextParentEventsIT extends ServerCaseContextsSync {
 
     @Inject
     protected ServerRuntime runtime;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentPeerEventsIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentPeerEventsIT.java
index 3b62cbf..9ce8a1d 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentPeerEventsIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextParentPeerEventsIT.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.relationships_child_master.Child;
 import org.apache.cayenne.testdo.relationships_child_master.Master;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
@@ -37,7 +37,7 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 @UseServerRuntime(CayenneProjects.RELATIONSHIPS_CHILD_MASTER_PROJECT)
-public class NestedDataContextParentPeerEventsIT extends ServerCase {
+public class NestedDataContextParentPeerEventsIT extends 
ServerCaseContextsSync {
 
     @Inject
     private ServerRuntime runtime;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextPeerEventsIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextPeerEventsIT.java
index 5c71361..d3448e8 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextPeerEventsIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextPeerEventsIT.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.test.parallel.ParallelTestContainer;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
@@ -37,7 +37,7 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class NestedDataContextPeerEventsIT extends ServerCase {
+public class NestedDataContextPeerEventsIT extends ServerCaseContextsSync {
 
        @Inject
        private DataContext context;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/jdbc/SelectActionIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/jdbc/SelectActionIT.java
index b58f2fa..3cd2365 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/jdbc/SelectActionIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/jdbc/SelectActionIT.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc;
 
+import java.util.List;
+
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.di.Inject;
@@ -29,17 +31,15 @@ import org.apache.cayenne.testdo.lob.ClobTestEntity;
 import org.apache.cayenne.testdo.lob.ClobTestRelation;
 import org.apache.cayenne.unit.UnitDbAdapter;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseContextsSync;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 @UseServerRuntime(CayenneProjects.LOB_PROJECT)
-public class SelectActionIT extends ServerCase {
+public class SelectActionIT extends ServerCaseContextsSync {
 
     @Inject
     private DataContext context;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseContextsSync.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseContextsSync.java
new file mode 100644
index 0000000..8b514ac
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseContextsSync.java
@@ -0,0 +1,65 @@
+/*****************************************************************
+ *   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.unit.di.server;
+
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.server.ServerModule;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.di.spi.DefaultScope;
+import org.apache.cayenne.unit.di.DICase;
+import org.junit.Before;
+
+/**
+ * @since 4.1
+ */
+public class ServerCaseContextsSync extends DICase {
+    private static final Injector injector;
+
+    @Inject
+    private DBCleaner dbCleaner;
+
+    static {
+        DefaultScope testScope = new DefaultScope();
+        injector = DIBootstrap.createInjector(
+                new ServerCaseModule(testScope),
+                binder -> {
+                    
binder.bind(ServerRuntime.class).toProvider(ServerRuntimeProviderContextsSync.class).in(testScope);
+                    ServerModule.contributeProperties(binder)
+                            .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, 
String.valueOf(true));
+                });
+        injector.getInstance(SchemaBuilder.class).rebuildSchema();
+    }
+
+    @Before
+    public void cleanUpDB() throws Exception {
+        try {
+            dbCleaner.clean();
+        } catch (Exception ex) {
+            dbCleaner.clean();
+        }
+    }
+
+    @Override
+    protected Injector getUnitTestInjector() {
+        return injector;
+    }
+}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerRuntimeProviderContextsSync.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerRuntimeProviderContextsSync.java
new file mode 100644
index 0000000..f5e38df
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerRuntimeProviderContextsSync.java
@@ -0,0 +1,64 @@
+/*****************************************************************
+ *   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.unit.di.server;
+
+import java.util.Collection;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.server.ServerModule;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.unit.UnitDbAdapter;
+
+/**
+ * @since 4.1
+ */
+public class ServerRuntimeProviderContextsSync extends ServerRuntimeProvider {
+
+    private ServerCaseProperties properties;
+
+    public ServerRuntimeProviderContextsSync(@Inject 
ServerCaseDataSourceFactory dataSourceFactory,
+                                             @Inject ServerCaseProperties 
properties,
+                                             @Inject Provider<DbAdapter> 
dbAdapterProvider,
+                                             @Inject UnitDbAdapter 
unitDbAdapter) {
+        super(dataSourceFactory, properties, dbAdapterProvider, unitDbAdapter);
+        this.properties = properties;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ServerRuntime get() throws ConfigurationException {
+        String configurationLocation = properties.getConfigurationLocation();
+        if (configurationLocation == null) {
+            throw new NullPointerException("Null 'configurationLocation', "
+                    + "annotate your test case with @UseServerRuntime");
+        }
+        Collection modules = getExtraModules();
+
+        return ServerRuntime.builder()
+                .addConfig(configurationLocation)
+                .addModules(modules)
+                .addModule(binder -> ServerModule.contributeProperties(binder)
+                            .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, 
String.valueOf(true)))
+                .build();
+    }
+}

Reply via email to