You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/03/15 08:27:30 UTC

cayenne git commit: Change DataRowStore settings to use RuntimeProperties. Add user-friendly contribution method to ServerModule.

Repository: cayenne
Updated Branches:
  refs/heads/master daaa20381 -> 46450e751


Change DataRowStore settings to use RuntimeProperties.
Add user-friendly contribution method to ServerModule.


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/46450e75
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/46450e75
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/46450e75

Branch: refs/heads/master
Commit: 46450e7513b17def75737b97232fa6167182b5f7
Parents: daaa203
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Mar 15 11:11:47 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Mar 15 11:11:47 2017 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/access/DataRowStore.java | 41 ++++-----
 .../access/DefaultDataRowStoreFactory.java      |  6 +-
 .../apache/cayenne/configuration/Constants.java | 89 ++++++++++----------
 .../configuration/server/ServerModule.java      | 13 ++-
 .../access/DataContextSerializationIT.java      |  5 +-
 .../access/DataContextSharedCacheEmpiricIT.java |  9 +-
 .../org/apache/cayenne/access/DataDomainIT.java |  6 +-
 .../apache/cayenne/access/DataRowStoreIT.java   |  8 +-
 .../access/DefaultDataRowStoreFactoryIT.java    | 13 +--
 .../apache/cayenne/access/MockDataRowStore.java | 10 ++-
 .../server/DataContextFactoryTest.java          |  7 +-
 .../server/DataDomainProviderTest.java          |  1 -
 docs/doc/src/main/resources/UPGRADE.txt         | 10 +--
 13 files changed, 106 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowStore.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowStore.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowStore.java
index fcc49a8..8c518db 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowStore.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataRowStore.java
@@ -26,11 +26,12 @@ import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.access.event.SnapshotEvent;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.event.EventSubject;
 import org.apache.cayenne.util.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
-import org.apache.commons.collections.ExtendedProperties;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -53,8 +54,16 @@ public class DataRowStore implements Serializable {
 
     private static Log logger = LogFactory.getLog(DataRowStore.class);
 
-    // property keys
+    /**
+     * @deprecated since 4.0, never used actually
+     */
+    @Deprecated
     public static final String SNAPSHOT_EXPIRATION_PROPERTY = "cayenne.DataRowStore.snapshot.expiration";
+
+    /**
+     * @deprecated since 4.0, use {@link org.apache.cayenne.configuration.Constants#SNAPSHOT_CACHE_SIZE_PROPERTY}
+     */
+    @Deprecated
     public static final String SNAPSHOT_CACHE_SIZE_PROPERTY = "cayenne.DataRowStore.snapshot.size";
 
     /**
@@ -112,7 +121,7 @@ public class DataRowStore implements Serializable {
      *                     events.
      * @since 1.2
      */
-    public DataRowStore(String name, Map<String, String> properties, EventManager eventManager) {
+    public DataRowStore(String name, RuntimeProperties properties, EventManager eventManager) {
         if (name == null) {
             throw new IllegalArgumentException("DataRowStore name can't be null.");
         }
@@ -127,36 +136,18 @@ public class DataRowStore implements Serializable {
         return EventSubject.getSubject(this.getClass(), name);
     }
 
-    protected void initWithProperties(Map<String, String> properties) {
-        ExtendedProperties propertiesWrapper = new ExtendedProperties();
-
-        if (properties != null) {
-            propertiesWrapper.putAll(properties);
-        }
+    protected void initWithProperties(RuntimeProperties properties) {
 
-        long snapshotsExpiration = propertiesWrapper.getLong(
-                SNAPSHOT_EXPIRATION_PROPERTY,
-                SNAPSHOT_EXPIRATION_DEFAULT);
-
-        maxSize = propertiesWrapper.getInt(
-                SNAPSHOT_CACHE_SIZE_PROPERTY,
-                SNAPSHOT_CACHE_SIZE_DEFAULT);
+        // expiration time is never used actually
+        maxSize = properties.getInt(Constants.SNAPSHOT_CACHE_SIZE_PROPERTY, SNAPSHOT_CACHE_SIZE_DEFAULT);
 
         if (logger.isDebugEnabled()) {
-            logger.debug("DataRowStore property "
-                    + SNAPSHOT_EXPIRATION_PROPERTY
-                    + " = "
-                    + snapshotsExpiration);
-            logger.debug("DataRowStore property "
-                    + SNAPSHOT_CACHE_SIZE_PROPERTY
-                    + " = "
-                    + maxSize);
+            logger.debug("DataRowStore property " + Constants.SNAPSHOT_CACHE_SIZE_PROPERTY + " = " + maxSize);
         }
 
         this.snapshots = new ConcurrentLinkedHashMap.Builder<ObjectId, DataRow>()
                 .maximumWeightedCapacity(maxSize)
                 .build();
-
     }
 
     protected void setEventBridge(EventBridge eventBridge) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultDataRowStoreFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultDataRowStoreFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultDataRowStoreFactory.java
index 787c177..22b5e2f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultDataRowStoreFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultDataRowStoreFactory.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.access;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.di.DIRuntimeException;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.event.EventBridge;
@@ -40,13 +40,13 @@ public class DefaultDataRowStoreFactory implements DataRowStoreFactory {
 
     EventManager eventManager;
 
-    Map<String, String> properties;
+    RuntimeProperties properties;
 
     boolean isNoopEventBridge;
 
     public DefaultDataRowStoreFactory(@Inject EventBridge eventBridge,
                                       @Inject EventManager eventManager,
-                                      @Inject(Constants.DATA_ROW_STORE_PROPERTIES_MAP) Map<String, String> properties) {
+                                      @Inject RuntimeProperties properties) {
         this.eventBridge = eventBridge;
         this.eventManager = eventManager;
         this.properties = properties;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
index 18c42cd..091af8a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
@@ -35,14 +35,14 @@ public interface Constants {
      *
      * @see org.apache.cayenne.configuration.server.ServerModule#contributeProperties(Binder).
      */
-    public static final String PROPERTIES_MAP = "cayenne.properties";
+    String PROPERTIES_MAP = "cayenne.properties";
 
     /**
      * A DI container key for the List&lt;DbAdapterDetector&gt; that contains
      * objects that can discover the type of current database and install the
      * correct DbAdapter in runtime.
      */
-    public static final String SERVER_ADAPTER_DETECTORS_LIST = "cayenne.server.adapter_detectors";
+    String SERVER_ADAPTER_DETECTORS_LIST = "cayenne.server.adapter_detectors";
 
     /**
      * A DI container key for the List&lt;DataChannelFilter&gt; storing
@@ -50,13 +50,13 @@ public interface Constants {
      *
      * @see org.apache.cayenne.configuration.server.ServerModule#contributeDomainFilters(Binder).
      */
-    public static final String SERVER_DOMAIN_FILTERS_LIST = "cayenne.server.domain_filters";
+    String SERVER_DOMAIN_FILTERS_LIST = "cayenne.server.domain_filters";
 
     /**
      * A DI container key for the List&lt;String&gt; storing locations of the
      * one of more project configuration files.
      */
-    public static final String SERVER_PROJECT_LOCATIONS_LIST = "cayenne.server.project_locations";
+    String SERVER_PROJECT_LOCATIONS_LIST = "cayenne.server.project_locations";
 
     /**
      * A DI container key for the List&lt;ExtendedType&gt; storing default
@@ -64,7 +64,7 @@ public interface Constants {
      *
      * @see org.apache.cayenne.configuration.server.ServerModule#contributeDefaultTypes(Binder).
      */
-    public static final String SERVER_DEFAULT_TYPES_LIST = "cayenne.server.default_types";
+    String SERVER_DEFAULT_TYPES_LIST = "cayenne.server.default_types";
 
     /**
      * A DI container key for the List&lt;ExtendedType&gt; storing a
@@ -72,7 +72,7 @@ public interface Constants {
      *
      * @see org.apache.cayenne.configuration.server.ServerModule#contributeUserTypes(Binder).
      */
-    public static final String SERVER_USER_TYPES_LIST = "cayenne.server.user_types";
+    String SERVER_USER_TYPES_LIST = "cayenne.server.user_types";
 
     /**
      * A DI container key for the List&lt;ExtendedTypeFactory&gt; storing
@@ -80,32 +80,32 @@ public interface Constants {
      *
      * @see org.apache.cayenne.configuration.server.ServerModule#contributeTypeFactories(Binder).
      */
-    public static final String SERVER_TYPE_FACTORIES_LIST = "cayenne.server.type_factories";
+    String SERVER_TYPE_FACTORIES_LIST = "cayenne.server.type_factories";
 
     /**
      * A server-side DI container key for binding {@link org.apache.cayenne.resource.ResourceLocator}
      */
-    public final static String SERVER_RESOURCE_LOCATOR = "cayenne.server.resource_locator";
+    String SERVER_RESOURCE_LOCATOR = "cayenne.server.resource_locator";
 
     /**
      * A server-side DI container key for the Map&lt;String, String&gt; storing
      * event bridge properties passed to the ROP client on bootstrap.
      */
-    public static final String SERVER_ROP_EVENT_BRIDGE_PROPERTIES_MAP = "cayenne.server.rop_event_bridge_properties";
+    String SERVER_ROP_EVENT_BRIDGE_PROPERTIES_MAP = "cayenne.server.rop_event_bridge_properties";
 
     // Runtime properties
 
-    public static final String JDBC_DRIVER_PROPERTY = "cayenne.jdbc.driver";
+    String JDBC_DRIVER_PROPERTY = "cayenne.jdbc.driver";
 
-    public static final String JDBC_URL_PROPERTY = "cayenne.jdbc.url";
+    String JDBC_URL_PROPERTY = "cayenne.jdbc.url";
 
-    public static final String JDBC_USERNAME_PROPERTY = "cayenne.jdbc.username";
+    String JDBC_USERNAME_PROPERTY = "cayenne.jdbc.username";
 
-    public static final String JDBC_PASSWORD_PROPERTY = "cayenne.jdbc.password";
+    String JDBC_PASSWORD_PROPERTY = "cayenne.jdbc.password";
 
-    public static final String JDBC_MIN_CONNECTIONS_PROPERTY = "cayenne.jdbc.min_connections";
+    String JDBC_MIN_CONNECTIONS_PROPERTY = "cayenne.jdbc.min_connections";
 
-    public static final String JDBC_MAX_CONNECTIONS_PROPERTY = "cayenne.jdbc.max_connections";
+    String JDBC_MAX_CONNECTIONS_PROPERTY = "cayenne.jdbc.max_connections";
 
     /**
      * Defines a maximum time in milliseconds that a connection request could
@@ -116,12 +116,12 @@ public interface Constants {
      *
      * @since 4.0
      */
-    public static final String JDBC_MAX_QUEUE_WAIT_TIME = "cayenne.jdbc.max_wait";
+    String JDBC_MAX_QUEUE_WAIT_TIME = "cayenne.jdbc.max_wait";
 
     /**
      * @since 4.0
      */
-    public static final String JDBC_VALIDATION_QUERY_PROPERTY = "cayenne.jdbc.validation_query";
+    String JDBC_VALIDATION_QUERY_PROPERTY = "cayenne.jdbc.validation_query";
 
     /**
      * An integer property defining the maximum number of entries in the query
@@ -129,7 +129,7 @@ public interface Constants {
      * MapQueryCache uses it, but the rest would use alternative configuration
      * methods.
      */
-    public static final String QUERY_CACHE_SIZE_PROPERTY = "cayenne.querycache.size";
+    String QUERY_CACHE_SIZE_PROPERTY = "cayenne.querycache.size";
 
     /**
      * An optional name of the runtime DataDomain. If not specified (which is
@@ -137,25 +137,25 @@ public interface Constants {
      *
      * @since 4.0
      */
-    public static final String SERVER_DOMAIN_NAME_PROPERTY = "cayenne.server.domain.name";
+    String SERVER_DOMAIN_NAME_PROPERTY = "cayenne.server.domain.name";
 
     /**
      * A boolean property defining whether cross-contexts synchronization is
      * enabled. Possible values are "true" or "false".
      */
-    public static final String SERVER_CONTEXTS_SYNC_PROPERTY = "cayenne.server.contexts_sync_strategy";
+    String SERVER_CONTEXTS_SYNC_PROPERTY = "cayenne.server.contexts_sync_strategy";
 
     /**
      * A String property that defines how ObjectContexts should retain cached
      * committed objects. Possible values are "weak", "soft", "hard".
      */
-    public static final String SERVER_OBJECT_RETAIN_STRATEGY_PROPERTY = "cayenne.server.object_retain_strategy";
+    String SERVER_OBJECT_RETAIN_STRATEGY_PROPERTY = "cayenne.server.object_retain_strategy";
 
     /**
      * A boolean property that defines whether runtime should use external
      * transactions. Possible values are "true" or "false".
      */
-    public static final String SERVER_EXTERNAL_TX_PROPERTY = "cayenne.server.external_tx";
+    String SERVER_EXTERNAL_TX_PROPERTY = "cayenne.server.external_tx";
 
     /**
      * The name of the {@link org.apache.cayenne.event.EventBridgeFactory} that
@@ -164,7 +164,7 @@ public interface Constants {
      * stored in {@link #SERVER_ROP_EVENT_BRIDGE_PROPERTIES_MAP}, not
      * {@link #PROPERTIES_MAP}.
      */
-    public static final String SERVER_ROP_EVENT_BRIDGE_FACTORY_PROPERTY = "cayenne.server.rop_event_bridge_factory";
+    String SERVER_ROP_EVENT_BRIDGE_FACTORY_PROPERTY = "cayenne.server.rop_event_bridge_factory";
 
     /**
      * A property that defines a maximum number of ID qualifiers in where clause
@@ -173,7 +173,7 @@ public interface Constants {
      * DISJOINT_BY_ID prefetch processing. This is needed to avoid where clause
      * size limitations and memory usage efficiency.
      */
-    public static final String SERVER_MAX_ID_QUALIFIER_SIZE_PROPERTY = "cayenne.server.max_id_qualifier_size";
+    String SERVER_MAX_ID_QUALIFIER_SIZE_PROPERTY = "cayenne.server.max_id_qualifier_size";
 
     /**
      * Defines a maximum time in milliseconds that a connection request could
@@ -184,12 +184,12 @@ public interface Constants {
      *
      * @deprecated since 4.0 renamed to {@link #JDBC_MAX_QUEUE_WAIT_TIME}. Property name is preserved.
      */
-    public static final String SERVER_MAX_QUEUE_WAIT_TIME = JDBC_MAX_QUEUE_WAIT_TIME;
+    String SERVER_MAX_QUEUE_WAIT_TIME = JDBC_MAX_QUEUE_WAIT_TIME;
 
     /**
      * Defines if database uses case-insensitive collation
      */
-    public final static String CI_PROPERTY = "cayenne.runtime.db.collation.assume.ci";
+    String CI_PROPERTY = "cayenne.runtime.db.collation.assume.ci";
 
     /**
      * A integer property that enables logging for just long running queries
@@ -199,31 +199,38 @@ public interface Constants {
      *
      * @since 4.0
      */
-    public final static String QUERY_EXECUTION_TIME_LOGGING_THRESHOLD_PROPERTY = "cayenne.server.query_execution_time_logging_threshold";
+    String QUERY_EXECUTION_TIME_LOGGING_THRESHOLD_PROPERTY = "cayenne.server.query_execution_time_logging_threshold";
+
+    /**
+     * Snapshot cache max size
+     * @see org.apache.cayenne.configuration.server.ServerModule#setSnapshotCacheSize(Binder, int)
+     * @since 4.0
+     */
+    String SNAPSHOT_CACHE_SIZE_PROPERTY = "cayenne.DataRowStore.snapshot.size";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_URL_PROPERTY = "cayenne.rop.service_url";
+    String ROP_SERVICE_URL_PROPERTY = "cayenne.rop.service_url";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_USERNAME_PROPERTY = "cayenne.rop.service_username";
+    String ROP_SERVICE_USERNAME_PROPERTY = "cayenne.rop.service_username";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_PASSWORD_PROPERTY = "cayenne.rop.service_password";
+    String ROP_SERVICE_PASSWORD_PROPERTY = "cayenne.rop.service_password";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_REALM_PROPERTY = "cayenne.rop.service_realm";
+    String ROP_SERVICE_REALM_PROPERTY = "cayenne.rop.service_realm";
 
     /**
      * A boolean property that defines whether ALPN should be used.
@@ -232,44 +239,36 @@ public interface Constants {
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_USE_ALPN_PROPERTY = "cayenne.rop.service_use_alpn";
+    String ROP_SERVICE_USE_ALPN_PROPERTY = "cayenne.rop.service_use_alpn";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_SHARED_SESSION_PROPERTY = "cayenne.rop.shared_session_name";
+    String ROP_SERVICE_SHARED_SESSION_PROPERTY = "cayenne.rop.shared_session_name";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_SERVICE_TIMEOUT_PROPERTY = "cayenne.rop.service_timeout";
+    String ROP_SERVICE_TIMEOUT_PROPERTY = "cayenne.rop.service_timeout";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_CHANNEL_EVENTS_PROPERTY = "cayenne.rop.channel_events";
+    String ROP_CHANNEL_EVENTS_PROPERTY = "cayenne.rop.channel_events";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_CONTEXT_CHANGE_EVENTS_PROPERTY = "cayenne.rop.context_change_events";
+    String ROP_CONTEXT_CHANGE_EVENTS_PROPERTY = "cayenne.rop.context_change_events";
 
     /**
      * @deprecated  since 4.0 moved to cayenne-client org.apache.cayenne.configuration.rop.client.ClientConstants.
      */
     @Deprecated
-    public static final String ROP_CONTEXT_LIFECYCLE_EVENTS_PROPERTY = "cayenne.rop.context_lifecycle_events";
-
-    /**
-     * A DI container key for the Map&lt;String, String&gt; storing
-     * {@link org.apache.cayenne.access.DataRowStore} properties
-     *
-     * @since 4.0
-     */
-    public static final String DATA_ROW_STORE_PROPERTIES_MAP = "cayenne.server.data_row_store";
+    String ROP_CONTEXT_LIFECYCLE_EVENTS_PROPERTY = "cayenne.rop.context_lifecycle_events";
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/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 5a4bf66..49b9624 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
@@ -137,6 +137,17 @@ public class ServerModule implements Module {
     }
 
     /**
+     * Sets max size of snapshot cache, in pre 4.0 version this was set in the Modeler.
+     *
+     * @param binder DI binder passed to the module during injector startup.
+     * @param size max size of snapshot cache
+     * @since 4.0
+     */
+    public static void setSnapshotCacheSize(Binder binder, int size) {
+        contributeProperties(binder).put(Constants.SNAPSHOT_CACHE_SIZE_PROPERTY, Integer.toString(size));
+    }
+
+    /**
      * Provides access to a DI collection builder for String locations that allows downstream modules to
      * "contribute" their own Cayenne project locations.
      *
@@ -301,8 +312,6 @@ public class ServerModule implements Module {
 
         binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
 
-        binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
-
 		// a service to provide the main stack DataDomain
 		binder.bind(DataDomain.class).toProvider(DataDomainProvider.class);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSerializationIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSerializationIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSerializationIT.java
index 5ac9f0c..7c3e621 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSerializationIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSerializationIT.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.configuration.CayenneRuntime;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.log.JdbcEventLogger;
@@ -149,10 +150,10 @@ public class DataContextSerializationIT extends ServerCase {
         DataDomain domain = context.getParentDataDomain();
         DataRowStore snapshotCache = new DataRowStore(
                 domain.getName(),
-                domain.getProperties(),
+                new DefaultRuntimeProperties(domain.getProperties()),
                 domain.getEventManager());
 
-        Map<Object, Persistent> map = new HashMap<Object, Persistent>();
+        Map<Object, Persistent> map = new HashMap<>();
 
         DataContext localCacheContext = new DataContext(domain, new ObjectStore(
                 snapshotCache,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSharedCacheEmpiricIT.java
----------------------------------------------------------------------
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 dec040c..5bae357 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
@@ -20,6 +20,7 @@
 package org.apache.cayenne.access;
 
 import org.apache.cayenne.DataRow;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.ObjectStoreFactory;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
@@ -67,7 +68,7 @@ public class DataContextSharedCacheEmpiricIT extends ServerCase {
         eventManager = new DefaultEventManager();
         DataRowStore cache = new DataRowStore(
                 "cacheTest",
-                Collections.EMPTY_MAP,
+                new DefaultRuntimeProperties(Collections.<String, String>emptyMap()),
                 eventManager);
 
         c1 = new DataContext(runtime.getDataDomain(), 
@@ -91,7 +92,7 @@ public class DataContextSharedCacheEmpiricIT extends ServerCase {
     @Test
     public void testSelectSelectCommitRefresh() throws Exception {
 
-        SelectQuery query = new SelectQuery(Artist.class);
+        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
 
         // select both, a2 should go second...
         List<?> artists = c1.performQuery(query);
@@ -112,7 +113,7 @@ public class DataContextSharedCacheEmpiricIT extends ServerCase {
     @Test
     public void testSelectSelectCommitRefreshReverse() throws Exception {
 
-        SelectQuery query = new SelectQuery(Artist.class);
+        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
 
         List<?> altArtists = c2.performQuery(query);
         final Artist a2 = (Artist) altArtists.get(0);
@@ -132,7 +133,7 @@ public class DataContextSharedCacheEmpiricIT extends ServerCase {
     @Test
     public void testSelectUpdateSelectCommitRefresh() throws Exception {
 
-        SelectQuery query = new SelectQuery(Artist.class);
+        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
 
         List<?> artists = c1.performQuery(query);
         Artist a1 = (Artist) artists.get(0);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
index 05acc0e..21f4d3a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.annotation.PostAdd;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.event.DefaultEventManager;
@@ -227,8 +228,9 @@ public class DataDomainIT extends ServerCase {
 
         DefaultEventManager eventManager = new DefaultEventManager();
         try {
-            DataRowStore cache = new DataRowStore("Y", Collections.EMPTY_MAP, eventManager) {
-
+            DataRowStore cache = new DataRowStore("Y",
+                    new DefaultRuntimeProperties(Collections.<String, String>emptyMap()),
+                    eventManager) {
                 @Override
                 public void shutdown() {
                     cacheShutdown[0] = true;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
index 889abd8..d2180b2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
@@ -21,6 +21,8 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
@@ -59,7 +61,7 @@ public class DataRowStoreIT extends ServerCase {
     public void testDefaultConstructor() {
         cache = new DataRowStore(
                 "cacheXYZ",
-                Collections.<String, String>emptyMap(),
+                new DefaultRuntimeProperties(Collections.<String, String>emptyMap()),
                 null);
         assertEquals("cacheXYZ", cache.getName());
         assertNotNull(cache.getSnapshotEventSubject());
@@ -72,11 +74,11 @@ public class DataRowStoreIT extends ServerCase {
     @Test
     public void testMaxSize() throws Exception {
         Map<String, String> props = new HashMap<>();
-        props.put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, String.valueOf(2));
+        props.put(Constants.SNAPSHOT_CACHE_SIZE_PROPERTY, String.valueOf(2));
 
         cache = new DataRowStore(
                 "cacheXYZ",
-                props,
+                new DefaultRuntimeProperties(props),
                 null);
         assertEquals(2, cache.maximumSize());
         assertEquals(0, cache.size());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/DefaultDataRowStoreFactoryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DefaultDataRowStoreFactoryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DefaultDataRowStoreFactoryIT.java
index 779396a..7aeb303 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DefaultDataRowStoreFactoryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DefaultDataRowStoreFactoryIT.java
@@ -19,9 +19,9 @@
 
 package org.apache.cayenne.access;
 
-import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.DIBootstrap;
@@ -64,12 +64,9 @@ public class DefaultDataRowStoreFactoryIT extends ServerCase {
         final DataDomain DOMAIN = new DataDomain("test");
         final EventManager EVENT_MANAGER = new DefaultEventManager();
         final int CACHE_SIZE = 500;
-        final int EXPIRATION_PROPERTY = 60 * 60 * 24;
 
         Module testModule = new Module() {
-
             public void configure(Binder binder) {
-                binder.bindMap(Constants.PROPERTIES_MAP);
                 binder.bind(DataDomain.class).toInstance(DOMAIN);
                 binder.bind(EventManager.class).toInstance(EVENT_MANAGER);
                 binder.bind(TransactionManager.class).to(DefaultTransactionManager.class);
@@ -78,9 +75,7 @@ public class DefaultDataRowStoreFactoryIT extends ServerCase {
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
                 binder.bind(EventBridge.class).toProvider(NoopEventBridgeProvider.class);
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP)
-                        .put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, String.valueOf(CACHE_SIZE))
-                        .put(DataRowStore.SNAPSHOT_EXPIRATION_PROPERTY, String.valueOf(EXPIRATION_PROPERTY));
+                ServerModule.setSnapshotCacheSize(binder, CACHE_SIZE);
             }
         };
 
@@ -98,9 +93,7 @@ public class DefaultDataRowStoreFactoryIT extends ServerCase {
         final EventManager EVENT_MANAGER = new DefaultEventManager();
 
         Module testModule = new Module() {
-
             public void configure(Binder binder) {
-                binder.bindMap(Constants.PROPERTIES_MAP);
                 binder.bind(DataDomain.class).toInstance(DOMAIN);
                 binder.bind(EventManager.class).toInstance(EVENT_MANAGER);
                 binder.bind(TransactionManager.class).to(DefaultTransactionManager.class);
@@ -109,7 +102,7 @@ public class DefaultDataRowStoreFactoryIT extends ServerCase {
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
                 binder.bind(EventBridge.class).toProvider(MockEventBridgeProvider.class);
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
+                ServerModule.contributeProperties(binder);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/access/MockDataRowStore.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/MockDataRowStore.java b/cayenne-server/src/test/java/org/apache/cayenne/access/MockDataRowStore.java
index 76ac2cb..a2e48d5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/MockDataRowStore.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/MockDataRowStore.java
@@ -21,6 +21,8 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.event.MockEventManager;
 
 import java.util.HashMap;
@@ -31,14 +33,14 @@ import java.util.Map;
  */
 public class MockDataRowStore extends DataRowStore {
 
-    private static final Map TEST_DEFAULTS = new HashMap();
+    private static final Map<String, String> TEST_DEFAULTS = new HashMap<>();
 
     static {
-        TEST_DEFAULTS.put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, new Integer(10));
+        TEST_DEFAULTS.put(Constants.SNAPSHOT_CACHE_SIZE_PROPERTY, Integer.toString(10));
     }
 
     public MockDataRowStore() {
-        super("mock DataRowStore", TEST_DEFAULTS, new MockEventManager());
+        super("mock DataRowStore", new DefaultRuntimeProperties(TEST_DEFAULTS), new MockEventManager());
     }
 
     /**
@@ -48,7 +50,7 @@ public class MockDataRowStore extends DataRowStore {
         snapshots.put(id, snapshot);
     }
 
-    public void putSnapshot(ObjectId id, Map snapshot) {
+    public void putSnapshot(ObjectId id, Map<String, ?> snapshot) {
         snapshots.put(id, new DataRow(snapshot));
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataContextFactoryTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataContextFactoryTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataContextFactoryTest.java
index f7a362d..3eca368 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataContextFactoryTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataContextFactoryTest.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.access.DefaultObjectMapRetainStrategy;
 import org.apache.cayenne.access.ObjectMapRetainStrategy;
 import org.apache.cayenne.cache.MapQueryCache;
 import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.DefaultObjectStoreFactory;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.ObjectStoreFactory;
@@ -73,7 +72,7 @@ public class DataContextFactoryTest {
                 binder.bind(EventManager.class).toInstance(eventManager);
                 binder.bind(QueryCache.class).toInstance(new MapQueryCache(5));
                 binder.bind(RuntimeProperties.class).toInstance(
-                        new DefaultRuntimeProperties(Collections.EMPTY_MAP));
+                        new DefaultRuntimeProperties(Collections.<String, String>emptyMap()));
                 binder.bind(ObjectMapRetainStrategy.class).to(
                         DefaultObjectMapRetainStrategy.class);
                 binder.bind(ObjectStoreFactory.class).to(DefaultObjectStoreFactory.class);
@@ -82,7 +81,6 @@ public class DataContextFactoryTest {
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
                 binder.bind(EventBridge.class).toProvider(NoopEventBridgeProvider.class);
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
             }
         };
 
@@ -114,7 +112,7 @@ public class DataContextFactoryTest {
                 binder.bind(EventManager.class).toInstance(eventManager);
                 binder.bind(QueryCache.class).toInstance(new MapQueryCache(5));
                 binder.bind(RuntimeProperties.class).toInstance(
-                        new DefaultRuntimeProperties(Collections.EMPTY_MAP));
+                        new DefaultRuntimeProperties(Collections.<String, String>emptyMap()));
                 binder.bind(ObjectMapRetainStrategy.class).to(
                         DefaultObjectMapRetainStrategy.class);
                 binder.bind(ObjectStoreFactory.class).to(DefaultObjectStoreFactory.class);
@@ -122,7 +120,6 @@ public class DataContextFactoryTest {
                 binder.bind(TransactionManager.class).to(DefaultTransactionManager.class);
                 binder.bind(EventBridge.class).toProvider(NoopEventBridgeProvider.class);
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
index 7fe4763..3e96950 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
@@ -199,7 +199,6 @@ public class DataDomainProviderTest {
 
                 binder.bind(EventBridge.class).toProvider(NoopEventBridgeProvider.class);
                 binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
 			}
 		};
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/46450e75/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/UPGRADE.txt b/docs/doc/src/main/resources/UPGRADE.txt
index f90a816..6afe47d 100644
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@ -7,14 +7,12 @@ IMPORTANT: be sure to read all notes for the intermediate releases between your
 
 UPGRADING TO 4.0.M6
 
-* Per CAY-1873 and CAY-2266 Cache and remote notification configuration was moved
-  from Modeler into runtime DI settings. To set custom cache size and expiration time,
-  you should use custom module like this:
+* Per CAY-1873 and CAY-2266 Cache and remote notification configuration was moved from Modeler into
+  runtime DI settings. To set custom cache size, you should use custom module like this:
         Module module = binder -> {
-            binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP)
-                .put(DataRowStore.SNAPSHOT_EXPIRATION_PROPERTY, "10800")
-                .put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, "20000");
+            ServerModule.setSnapshotCacheSize(binder, 20000);
         };
+  Or you can use cmd line arg: -Dcayenne.DataRowStore.snapshot.size=20000
 
   If you have used remote notifications, you should include one of the following modules into your project:
         - cayenne-jgroups