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(); + } +}