CAY-1873 final cleanup
  - generics in DataRowStore and related classes
  - rename default event bridge to NoopEventBridge and check for it in 
DataRowStoreFactory
  - return "shared cache" checkbox for DataDomain in Modeler

Closes #72


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

Branch: refs/heads/master
Commit: 982b1541049a479a01b480cb6c1d2ad2d65a9503
Parents: dae15ce
Author: Nikita Timofeev <stari...@gmail.com>
Authored: Mon Mar 13 16:42:25 2017 +0300
Committer: Nikita Timofeev <stari...@gmail.com>
Committed: Mon Mar 13 16:42:25 2017 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/access/DataDomain.java   |  15 ++-
 .../org/apache/cayenne/access/DataRowStore.java | 107 +++++++++----------
 .../access/DefaultDataRowStoreFactory.java      |  37 ++++---
 .../access/HierarchicalObjectResolver.java      |  10 +-
 .../cayenne/access/PrefetchProcessorNode.java   |  66 +++++-------
 .../cayenne/access/event/SnapshotEvent.java     |  40 +++----
 .../configuration/server/ServerModule.java      |  10 +-
 .../cayenne/event/EventBridgeProvider.java      |  60 -----------
 .../apache/cayenne/event/JMSBridgeProvider.java |   2 +-
 .../cayenne/event/JavaGroupsBridgeProvider.java |   2 +-
 .../apache/cayenne/event/NoopEventBridge.java   |  43 ++++++++
 .../cayenne/event/NoopEventBridgeProvider.java  |  35 ++++++
 .../cayenne/event/XMPPBridgeProvider.java       |   2 +-
 .../apache/cayenne/access/DataRowStoreIT.java   |  28 ++---
 .../access/DefaultDataRowStoreFactoryIT.java    |   4 +-
 .../cayenne/access/event/SnapshotEventTest.java |  10 +-
 .../server/DataContextFactoryTest.java          |   6 +-
 .../server/DataDomainProviderTest.java          |   4 +-
 .../cayenne/modeler/editor/DataDomainView.java  |  20 ++++
 19 files changed, 272 insertions(+), 229 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
index 73e0c02..13746f1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
@@ -94,7 +94,6 @@ public class DataDomain implements QueryEngine, DataChannel {
        /**
      * @since 4.0
      */
-    @Inject
     protected DataRowStoreFactory dataRowStoreFactory;
 
     /**
@@ -654,6 +653,20 @@ public class DataDomain implements QueryEngine, 
DataChannel {
        }
 
        /**
+        * @since 4.0
+        */
+       public DataRowStoreFactory getDataRowStoreFactory() {
+               return dataRowStoreFactory;
+       }
+
+       /**
+        * @since 4.0
+        */
+       public void setDataRowStoreFactory(DataRowStoreFactory 
dataRowStoreFactory) {
+               this.dataRowStoreFactory = dataRowStoreFactory;
+       }
+
+       /**
         * @since 3.1
         */
        JdbcEventLogger getJdbcEventLogger() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 e16d834..fcc49a8 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
@@ -40,7 +40,6 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
@@ -59,29 +58,28 @@ public class DataRowStore implements Serializable {
     public static final String SNAPSHOT_CACHE_SIZE_PROPERTY = 
"cayenne.DataRowStore.snapshot.size";
 
     /**
-     * @deprecated since 4.0.M3 does nothing. Previously it used to check
-     * if need to create {@link EventBridge}.
+     * @deprecated since 4.0 does nothing. Previously it used to check if need 
to create {@link EventBridge}.
      */
     @Deprecated
     public static final String REMOTE_NOTIFICATION_PROPERTY = 
"cayenne.DataRowStore.remote.notify";
 
     /**
-     * @deprecated since 4.0.M3 {@link DataRowStoreFactory} establishes {@link 
EventBridge}.
+     * @deprecated since 4.0 {@link DataRowStoreFactory} establishes {@link 
EventBridge}.
      */
     @Deprecated
     public static final String EVENT_BRIDGE_FACTORY_PROPERTY = 
"cayenne.DataRowStore.EventBridge.factory";
 
     // default property values
 
-    // default expiration time is 2 hours
-    public static final long SNAPSHOT_EXPIRATION_DEFAULT = 2 * 60 * 60;
+    public static final long SNAPSHOT_EXPIRATION_DEFAULT = 2 * 60 * 60; // 
default expiration time is 2 hours
     public static final int SNAPSHOT_CACHE_SIZE_DEFAULT = 10000;
 
     @Deprecated
     public static final boolean REMOTE_NOTIFICATION_DEFAULT = false;
 
-    // use String for class name, since JavaGroups may not be around,
-    // causing CNF exceptions
+    /**
+     * @deprecated since 4.0 does nothing.
+     */
     @Deprecated
     public static final String EVENT_BRIDGE_FACTORY_DEFAULT = 
"org.apache.cayenne.event.JavaGroupsBridgeFactory";
 
@@ -90,8 +88,7 @@ public class DataRowStore implements Serializable {
     protected ConcurrentMap<ObjectId, DataRow> snapshots;
 
     /**
-     * @deprecated since 4.0.M3 does nothing. Previously it used to check
-     * if need to create {@link EventBridge}.
+     * @deprecated since 4.0 does nothing. Previously it used to check if need 
to create {@link EventBridge}.
      */
     @Deprecated
     protected boolean notifyingRemoteListeners;
@@ -115,7 +112,7 @@ public class DataRowStore implements Serializable {
      *                     events.
      * @since 1.2
      */
-    public DataRowStore(String name, Map properties, EventManager 
eventManager) {
+    public DataRowStore(String name, Map<String, String> properties, 
EventManager eventManager) {
         if (name == null) {
             throw new IllegalArgumentException("DataRowStore name can't be 
null.");
         }
@@ -130,7 +127,7 @@ public class DataRowStore implements Serializable {
         return EventSubject.getSubject(this.getClass(), name);
     }
 
-    protected void initWithProperties(Map properties) {
+    protected void initWithProperties(Map<String, String> properties) {
         ExtendedProperties propertiesWrapper = new ExtendedProperties();
 
         if (properties != null) {
@@ -175,7 +172,7 @@ public class DataRowStore implements Serializable {
      *
      * @since 1.2
      */
-    void snapshotsUpdatedForObjects(List objects, List snapshots, boolean 
refresh) {
+    void snapshotsUpdatedForObjects(List<Persistent> objects, List<? extends 
DataRow> snapshots, boolean refresh) {
 
         int size = objects.size();
 
@@ -189,11 +186,11 @@ public class DataRowStore implements Serializable {
                             + snapshots.size());
         }
 
-        Map modified = null;
+        Map<ObjectId, DataRow> modified = null;
         Object eventPostedBy = null;
 
         for (int i = 0; i < size; i++) {
-            Persistent object = (Persistent) objects.get(i);
+            Persistent object = objects.get(i);
 
             // skip null objects... possible since 3.0 in some EJBQL results
             if (object == null) {
@@ -213,14 +210,13 @@ public class DataRowStore implements Serializable {
             DataRow cachedSnapshot = this.snapshots.get(oid);
             if (refresh || cachedSnapshot == null) {
 
-                DataRow newSnapshot = (DataRow) snapshots.get(i);
+                DataRow newSnapshot = snapshots.get(i);
 
                 if (cachedSnapshot != null) {
                     // use old snapshot if no changes occurred
                     if (object instanceof DataObject
                             && cachedSnapshot.equals(newSnapshot)) {
-                        ((DataObject) object).setSnapshotVersion(cachedSnapshot
-                                .getVersion());
+                        ((DataObject) 
object).setSnapshotVersion(cachedSnapshot.getVersion());
                         continue;
                     } else {
                         
newSnapshot.setReplacesVersion(cachedSnapshot.getVersion());
@@ -228,7 +224,7 @@ public class DataRowStore implements Serializable {
                 }
 
                 if (modified == null) {
-                    modified = new HashMap();
+                    modified = new HashMap<>();
                     eventPostedBy = 
object.getObjectContext().getGraphManager();
                 }
 
@@ -240,9 +236,9 @@ public class DataRowStore implements Serializable {
             processSnapshotChanges(
                     eventPostedBy,
                     modified,
-                    Collections.EMPTY_LIST,
-                    Collections.EMPTY_LIST,
-                    Collections.EMPTY_LIST);
+                    Collections.<ObjectId>emptyList(),
+                    Collections.<ObjectId>emptyList(),
+                    Collections.<ObjectId>emptyList());
         }
     }
 
@@ -348,10 +344,10 @@ public class DataRowStore implements Serializable {
             logger.debug("remote event: " + event);
         }
 
-        Collection deletedSnapshotIds = event.getDeletedIds();
-        Collection invalidatedSnapshotIds = event.getInvalidatedIds();
-        Map diffs = event.getModifiedDiffs();
-        Collection indirectlyModifiedIds = event.getIndirectlyModifiedIds();
+        Collection<ObjectId> deletedSnapshotIds = event.getDeletedIds();
+        Collection<ObjectId> invalidatedSnapshotIds = 
event.getInvalidatedIds();
+        Map<ObjectId, DataRow> diffs = event.getModifiedDiffs();
+        Collection<ObjectId> indirectlyModifiedIds = 
event.getIndirectlyModifiedIds();
 
         if (deletedSnapshotIds.isEmpty()
                 && invalidatedSnapshotIds.isEmpty()
@@ -378,10 +374,10 @@ public class DataRowStore implements Serializable {
      */
     public void processSnapshotChanges(
             Object postedBy,
-            Map updatedSnapshots,
-            Collection deletedSnapshotIds,
-            Collection invalidatedSnapshotIds,
-            Collection indirectlyModifiedIds) {
+            Map<ObjectId, DataRow> updatedSnapshots,
+            Collection<ObjectId> deletedSnapshotIds,
+            Collection<ObjectId> invalidatedSnapshotIds,
+            Collection<ObjectId> indirectlyModifiedIds) {
 
         // update the internal cache, prepare snapshot event
 
@@ -395,7 +391,7 @@ public class DataRowStore implements Serializable {
 
         processDeletedIDs(deletedSnapshotIds);
         processInvalidatedIDs(invalidatedSnapshotIds);
-        Map diffs = processUpdatedSnapshots(updatedSnapshots);
+        Map<ObjectId, DataRow> diffs = 
processUpdatedSnapshots(updatedSnapshots);
         sendUpdateNotification(
                 postedBy,
                 diffs,
@@ -404,37 +400,32 @@ public class DataRowStore implements Serializable {
                 indirectlyModifiedIds);
     }
 
-    private void processDeletedIDs(Collection deletedSnapshotIDs) {
+    private void processDeletedIDs(Collection<ObjectId> deletedSnapshotIDs) {
         // DELETED: evict deleted snapshots
         if (!deletedSnapshotIDs.isEmpty()) {
-            Iterator it = deletedSnapshotIDs.iterator();
-            while (it.hasNext()) {
-                snapshots.remove(it.next());
+            for (ObjectId deletedSnapshotID : deletedSnapshotIDs) {
+                snapshots.remove(deletedSnapshotID);
             }
         }
     }
 
-    private void processInvalidatedIDs(Collection invalidatedSnapshotIds) {
+    private void processInvalidatedIDs(Collection<ObjectId> 
invalidatedSnapshotIds) {
         // INVALIDATED: forget snapshot, treat as expired from cache
         if (!invalidatedSnapshotIds.isEmpty()) {
-            Iterator it = invalidatedSnapshotIds.iterator();
-            while (it.hasNext()) {
-                snapshots.remove(it.next());
+            for (ObjectId invalidatedSnapshotId : invalidatedSnapshotIds) {
+                snapshots.remove(invalidatedSnapshotId);
             }
         }
     }
 
-    private Map processUpdatedSnapshots(Map updatedSnapshots) {
-        Map diffs = null;
+    private Map<ObjectId, DataRow> processUpdatedSnapshots(Map<ObjectId, 
DataRow> updatedSnapshots) {
+        Map<ObjectId, DataRow> diffs = null;
 
         // MODIFIED: replace/add snapshots, generate diffs for event
         if (!updatedSnapshots.isEmpty()) {
-            Iterator it = updatedSnapshots.entrySet().iterator();
-            while (it.hasNext()) {
-                Map.Entry entry = (Map.Entry) it.next();
-
-                ObjectId key = (ObjectId) entry.getKey();
-                DataRow newSnapshot = (DataRow) entry.getValue();
+            for (Map.Entry<ObjectId, DataRow> entry : 
updatedSnapshots.entrySet()) {
+                ObjectId key = entry.getKey();
+                DataRow newSnapshot = entry.getValue();
                 DataRow oldSnapshot = snapshots.put(key, newSnapshot);
 
                 // generate diff for the updated event, if this not a new
@@ -474,11 +465,11 @@ public class DataRowStore implements Serializable {
                         continue;
                     }
 
-                    Map diff = oldSnapshot.createDiff(newSnapshot);
+                    DataRow diff = oldSnapshot.createDiff(newSnapshot);
 
                     if (diff != null) {
                         if (diffs == null) {
-                            diffs = new HashMap();
+                            diffs = new HashMap<>();
                         }
 
                         diffs.put(key, diff);
@@ -490,20 +481,18 @@ public class DataRowStore implements Serializable {
         return diffs;
     }
 
-    private void processUpdateDiffs(Map diffs) {
+    private void processUpdateDiffs(Map<ObjectId, DataRow> diffs) {
         // apply snapshot diffs
         if (!diffs.isEmpty()) {
-            Iterator it = diffs.entrySet().iterator();
-            while (it.hasNext()) {
-                Map.Entry entry = (Map.Entry) it.next();
-                ObjectId key = (ObjectId) entry.getKey();
+            for (Map.Entry<ObjectId, DataRow> entry : diffs.entrySet()) {
+                ObjectId key = entry.getKey();
                 DataRow oldSnapshot = snapshots.remove(key);
 
                 if (oldSnapshot == null) {
                     continue;
                 }
 
-                DataRow newSnapshot = oldSnapshot.applyDiff((DataRow) 
entry.getValue());
+                DataRow newSnapshot = oldSnapshot.applyDiff(entry.getValue());
                 snapshots.put(key, newSnapshot);
             }
         }
@@ -511,10 +500,10 @@ public class DataRowStore implements Serializable {
 
     private void sendUpdateNotification(
             Object postedBy,
-            Map diffs,
-            Collection deletedSnapshotIDs,
-            Collection invalidatedSnapshotIDs,
-            Collection indirectlyModifiedIds) {
+            Map<ObjectId, DataRow> diffs,
+            Collection<ObjectId> deletedSnapshotIDs,
+            Collection<ObjectId> invalidatedSnapshotIDs,
+            Collection<ObjectId> indirectlyModifiedIds) {
 
         // do not send bogus events... e.g. inserted objects are not counted
         if ((diffs != null && !diffs.isEmpty())

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 a3397b3..787c177 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
@@ -23,9 +23,9 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.di.DIRuntimeException;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
+import org.apache.cayenne.event.NoopEventBridge;
 
 import java.util.Map;
 
@@ -36,30 +36,39 @@ import java.util.Map;
  */
 public class DefaultDataRowStoreFactory implements DataRowStoreFactory {
 
-    @Inject
-    protected Injector injector;
+    EventBridge eventBridge;
 
-    @Inject
-    protected EventManager eventManager;
+    EventManager eventManager;
 
-    @Inject(Constants.DATA_ROW_STORE_PROPERTIES_MAP)
     Map<String, String> properties;
 
+    boolean isNoopEventBridge;
+
+    public DefaultDataRowStoreFactory(@Inject EventBridge eventBridge,
+                                      @Inject EventManager eventManager,
+                                      
@Inject(Constants.DATA_ROW_STORE_PROPERTIES_MAP) Map<String, String> 
properties) {
+        this.eventBridge = eventBridge;
+        this.eventManager = eventManager;
+        this.properties = properties;
+        isNoopEventBridge = eventBridge instanceof NoopEventBridge;
+    }
+
     @Override
     public DataRowStore createDataRowStore(String name) throws 
DIRuntimeException {
-        DataRowStore store = new DataRowStore(
-                name,
-                properties,
-                eventManager);
+        DataRowStore store = new DataRowStore(name, properties, eventManager);
+        setUpEventBridge(store);
+        return store;
+    }
 
+    private void setUpEventBridge(DataRowStore store) {
+        if(isNoopEventBridge) {
+            return;
+        }
         try {
-            store.setEventBridge(injector.getInstance(EventBridge.class));
+            store.setEventBridge(eventBridge);
             store.startListeners();
         } catch (Exception ex) {
             throw new CayenneRuntimeException("Error initializing 
DataRowStore.", ex);
         }
-
-        return store;
     }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index 613c88d..d75f232 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -209,7 +209,7 @@ class HierarchicalObjectResolver {
 
             PrefetchTreeNode jointSubtree = node.cloneJointSubtree();
 
-            List dataRows = new ArrayList();
+            List<DataRow> dataRows = new ArrayList<>();
             for (PrefetchSelectQuery query : queries) {
                 // need to pass the remaining tree to make joint prefetches 
work
                 if (jointSubtree.hasChildren()) {
@@ -223,7 +223,7 @@ class HierarchicalObjectResolver {
                     query.addResultPath("db:"
                             + relationship.getReverseDbRelationshipPath());
                 }
-                dataRows.addAll(context.performQuery(query));
+                dataRows.addAll((List<DataRow>)context.performQuery(query));
             }
             processorNode.setDataRows(dataRows);
 
@@ -280,16 +280,16 @@ class HierarchicalObjectResolver {
                     return false;
                 }
 
-                List parentObjects = parent.getObjects();
+                List<Persistent> parentObjects = parent.getObjects();
                 int size = parentRows.size();
 
                 for (int i = 0; i < size; i++) {
                     subprocessor.setCurrentFlatRow((DataRow) 
parentRows.get(i));
-                    parent.setLastResolved((Persistent) parentObjects.get(i));
+                    parent.setLastResolved(parentObjects.get(i));
                     processorNode.traverse(subprocessor);
                 }
 
-                List objects = processorNode.getObjects();
+                List<Persistent> objects = processorNode.getObjects();
 
                 cache.snapshotsUpdatedForObjects(
                         objects,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorNode.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorNode.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorNode.java
index 09ce0fa..1fcb363 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorNode.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorNode.java
@@ -37,13 +37,13 @@ import org.apache.cayenne.util.ToStringBuilder;
  */
 class PrefetchProcessorNode extends PrefetchTreeNode {
 
-    List dataRows;
+    List<DataRow> dataRows;
     List<Persistent> objects;
 
     ArcProperty incoming;
     ObjectResolver resolver;
 
-    Map partitionByParent;
+    Map<Persistent, List<Persistent>> partitionByParent;
     boolean jointChildren;
 
     private Persistent lastResolved;
@@ -58,9 +58,8 @@ class PrefetchProcessorNode extends PrefetchTreeNode {
      * all properties are initialized.
      */
     void afterInit() {
-
         if (isPartitionedByParent()) {
-            partitionByParent = new HashMap();
+            partitionByParent = new HashMap<>();
         }
     }
 
@@ -76,21 +75,18 @@ class PrefetchProcessorNode extends PrefetchTreeNode {
             // away.... write directly to prevent changing persistence state.
             if (incoming instanceof ToOneProperty) {
                 incoming.writePropertyDirectly(parent, null, object);
-            }
-            else {
-
-                List peers = (List) partitionByParent.get(parent);
+            } else {
+                List<Persistent> peers = partitionByParent.get(parent);
 
                 // wrap in a list even if relationship is to-one... will 
unwrap at the end
                 // of the processing cycle.
                 if (peers == null) {
-                    peers = new ArrayList();
+                    peers = new ArrayList<>();
                     partitionByParent.put(parent, peers);
-                }
-                // checking for duplicates is needed in case of nested joint 
prefetches
-                // when there is more than one row with the same combination 
of adjacent
-                // parent and child...
-                else if (peers.contains(object)) {
+                } else if (peers.contains(object)) {
+                    // checking for duplicates is needed in case of nested 
joint prefetches
+                    // when there is more than one row with the same 
combination of adjacent
+                    // parent and child...
                     return;
                 }
 
@@ -108,17 +104,14 @@ class PrefetchProcessorNode extends PrefetchTreeNode {
             // use different strategy
 
             PrefetchProcessorNode parent = (PrefetchProcessorNode) getParent();
-            boolean parentObjectsExist = parent.getObjects() != null
-                    && parent.getObjects().size() > 0;
+            boolean parentObjectsExist = parent.getObjects() != null && 
parent.getObjects().size() > 0;
             if (incoming.getRelationship().isToMany()) {
                 if (parentObjectsExist) {
                     connectToNodeParents(parent.getObjects());
-                }
-                else {
+                } else {
                     connectToFaultedParents();
                 }
-            }
-            else {
+            } else {
                 // optional to-one ... need to fill in unresolved 
relationships with
                 // null...
                 if (parentObjectsExist) {
@@ -128,49 +121,40 @@ class PrefetchProcessorNode extends PrefetchTreeNode {
         }
     }
 
-    private void clearNullRelationships(List parentObjects) {
-        for (Object object : parentObjects) {
+    private void clearNullRelationships(List<Persistent> parentObjects) {
+        for (Persistent object : parentObjects) {
             if (incoming.readPropertyDirectly(object) instanceof Fault) {
                 incoming.writePropertyDirectly(object, null, null);
             }
         }
     }
 
-    private void connectToNodeParents(List parentObjects) {
-
-        for (Object parentObject : parentObjects) {
-            Persistent object = (Persistent) parentObject;
-            List related = (List) partitionByParent.get(object);
-            connect(object, related);
+    private void connectToNodeParents(List<Persistent> parentObjects) {
+        for (Persistent parentObject : parentObjects) {
+            connect(parentObject, partitionByParent.get(parentObject));
         }
     }
 
     private void connectToFaultedParents() {
-        for (Object o : partitionByParent.entrySet()) {
-            Map.Entry entry = (Map.Entry) o;
-
-            Persistent object = (Persistent) entry.getKey();
-            List related = (List) entry.getValue();
-            connect(object, related);
+        for (Map.Entry<Persistent, List<Persistent>> entry : 
partitionByParent.entrySet()) {
+            connect(entry.getKey(), entry.getValue());
         }
     }
 
-    private void connect(Persistent object, List related) {
+    private void connect(Persistent object, List<Persistent> related) {
         if (incoming.getRelationship().isToMany()) {
             ValueHolder toManyList = (ValueHolder) 
incoming.readProperty(object);
 
             // TODO, Andrus 11/15/2005 - if list is modified, shouldn't we 
attempt to
             // merge the changes instead of overwriting?
             toManyList.setValueDirectly(related != null ? related : new 
ArrayList(1));
-        }
-        else {
+        } else {
             // this should've been handled elsewhere
-            throw new CayenneRuntimeException(
-                    "To-one relationship wasn't handled properly: " + 
incoming.getName());
+            throw new CayenneRuntimeException("To-one relationship wasn't 
handled properly: %s", incoming.getName());
         }
     }
 
-    List getDataRows() {
+    List<DataRow> getDataRows() {
         return dataRows;
     }
 
@@ -194,7 +178,7 @@ class PrefetchProcessorNode extends PrefetchTreeNode {
         this.incoming = incoming;
     }
 
-    void setDataRows(List dataRows) {
+    void setDataRows(List<DataRow> dataRows) {
         this.dataRows = dataRows;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/access/event/SnapshotEvent.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/event/SnapshotEvent.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/event/SnapshotEvent.java
index 61c2564..72bfb4b 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/event/SnapshotEvent.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/event/SnapshotEvent.java
@@ -23,6 +23,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.event.CayenneEvent;
 
 /**
@@ -33,14 +35,14 @@ import org.apache.cayenne.event.CayenneEvent;
 public class SnapshotEvent extends CayenneEvent {
 
     protected long timestamp;
-    protected Collection deletedIds;
-    protected Collection invalidatedIds;
-    protected Map modifiedDiffs;
-    protected Collection indirectlyModifiedIds;
+    protected Collection<ObjectId> deletedIds;
+    protected Collection<ObjectId> invalidatedIds;
+    protected Map<ObjectId, DataRow> modifiedDiffs;
+    protected Collection<ObjectId> indirectlyModifiedIds;
 
-    public SnapshotEvent(Object source, Object postedBy, Map modifiedDiffs,
-            Collection deletedIds, Collection invalidatedIds,
-            Collection indirectlyModifiedIds) {
+    public SnapshotEvent(Object source, Object postedBy, Map<ObjectId, 
DataRow> modifiedDiffs,
+            Collection<ObjectId> deletedIds, Collection<ObjectId> 
invalidatedIds,
+            Collection<ObjectId> indirectlyModifiedIds) {
 
         super(source, postedBy, null);
 
@@ -55,22 +57,22 @@ public class SnapshotEvent extends CayenneEvent {
         return timestamp;
     }
 
-    public Map getModifiedDiffs() {
-        return (modifiedDiffs != null) ? modifiedDiffs : Collections.EMPTY_MAP;
+    public Map<ObjectId, DataRow> getModifiedDiffs() {
+        return (modifiedDiffs != null) ? modifiedDiffs : 
Collections.<ObjectId, DataRow>emptyMap();
     }
 
-    public Collection getDeletedIds() {
-        return (deletedIds != null) ? deletedIds : Collections.EMPTY_LIST;
+    public Collection<ObjectId> getDeletedIds() {
+        return (deletedIds != null) ? deletedIds : 
Collections.<ObjectId>emptyList();
     }
 
-    public Collection getInvalidatedIds() {
-        return (invalidatedIds != null) ? invalidatedIds : 
Collections.EMPTY_LIST;
+    public Collection<ObjectId> getInvalidatedIds() {
+        return (invalidatedIds != null) ? invalidatedIds : 
Collections.<ObjectId>emptyList();
     }
 
-    public Collection getIndirectlyModifiedIds() {
+    public Collection<ObjectId> getIndirectlyModifiedIds() {
         return (indirectlyModifiedIds != null)
                 ? indirectlyModifiedIds
-                : Collections.EMPTY_LIST;
+                : Collections.<ObjectId>emptyList();
     }
 
     @Override
@@ -78,22 +80,22 @@ public class SnapshotEvent extends CayenneEvent {
         StringBuilder buffer = new StringBuilder();
         buffer.append("[SnapshotEvent] source: ").append(getSource());
 
-        Map modified = getModifiedDiffs();
+        Map<ObjectId, DataRow> modified = getModifiedDiffs();
         if (!modified.isEmpty()) {
             buffer.append(", modified ").append(modified.size()).append(" 
id(s)");
         }
 
-        Collection deleted = getDeletedIds();
+        Collection<ObjectId> deleted = getDeletedIds();
         if (!deleted.isEmpty()) {
             buffer.append(", deleted ").append(deleted.size()).append(" 
id(s)");
         }
 
-        Collection invalidated = getInvalidatedIds();
+        Collection<ObjectId> invalidated = getInvalidatedIds();
         if (!invalidated.isEmpty()) {
             buffer.append(", invalidated 
").append(invalidated.size()).append(" id(s)");
         }
 
-        Collection related = getIndirectlyModifiedIds();
+        Collection<ObjectId> related = getIndirectlyModifiedIds();
         if (!related.isEmpty()) {
             buffer.append(", indirectly modified 
").append(related.size()).append(
                     " id(s)");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 8e24e38..5a4bf66 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
@@ -43,6 +43,8 @@ import org.apache.cayenne.access.types.CalendarType;
 import org.apache.cayenne.access.types.CharType;
 import org.apache.cayenne.access.types.DateType;
 import org.apache.cayenne.access.types.DoubleType;
+import org.apache.cayenne.access.types.ExtendedType;
+import org.apache.cayenne.access.types.ExtendedTypeFactory;
 import org.apache.cayenne.access.types.FloatType;
 import org.apache.cayenne.access.types.IntegerType;
 import org.apache.cayenne.access.types.LongType;
@@ -88,11 +90,12 @@ import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.Key;
 import org.apache.cayenne.di.ListBuilder;
+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.EventBridgeProvider;
+import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
@@ -294,7 +297,10 @@ public class ServerModule implements Module {
 
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
 
-        
binder.bind(EventBridge.class).toProvider(EventBridgeProvider.class);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);
 
                // a service to provide the main stack DataDomain

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/EventBridgeProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/EventBridgeProvider.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/event/EventBridgeProvider.java
deleted file mode 100644
index ef78fb7..0000000
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/event/EventBridgeProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*****************************************************************
- *   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.access.DataDomain;
-import org.apache.cayenne.access.DataRowStore;
-import org.apache.cayenne.di.DIRuntimeException;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-
-import java.util.Collections;
-
-public class EventBridgeProvider implements Provider<EventBridge> {
-
-    @Inject
-    protected DataDomain dataDomain;
-
-    @Override
-    public EventBridge get() throws DIRuntimeException {
-        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class.getClass(), dataDomain.getName());
-
-        return new EventBridge(
-                Collections.singleton(snapshotEventSubject),
-                EventBridge.convertToExternalSubject(snapshotEventSubject)) {
-
-            @Override
-            protected void startupExternal() throws Exception {
-
-            }
-
-            @Override
-            protected void shutdownExternal() throws Exception {
-
-            }
-
-            @Override
-            protected void sendExternalEvent(CayenneEvent localEvent) throws 
Exception {
-
-            }
-        };
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/JMSBridgeProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/JMSBridgeProvider.java 
b/cayenne-server/src/main/java/org/apache/cayenne/event/JMSBridgeProvider.java
index 217c5b3..fbd5468 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/event/JMSBridgeProvider.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/JMSBridgeProvider.java
@@ -39,7 +39,7 @@ public class JMSBridgeProvider implements 
Provider<EventBridge> {
 
     @Override
     public EventBridge get() throws DIRuntimeException {
-        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class, dataDomain.getName());;
+        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class, dataDomain.getName());
 
         return new JMSBridge(
                 Collections.singleton(snapshotEventSubject),

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/JavaGroupsBridgeProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/JavaGroupsBridgeProvider.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/event/JavaGroupsBridgeProvider.java
index 191872d..c2e184f 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/event/JavaGroupsBridgeProvider.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/JavaGroupsBridgeProvider.java
@@ -39,7 +39,7 @@ public class JavaGroupsBridgeProvider implements 
Provider<EventBridge> {
 
     @Override
     public EventBridge get() throws DIRuntimeException {
-        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class, dataDomain.getName());;
+        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class, dataDomain.getName());
 
         return new JavaGroupsBridge(
                 Collections.singleton(snapshotEventSubject),

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridge.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridge.java 
b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridge.java
new file mode 100644
index 0000000..5a4f941
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridge.java
@@ -0,0 +1,43 @@
+/*****************************************************************
+ *   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.access.DataRowStore;
+
+/**
+ * @since 4.0
+ */
+public class NoopEventBridge extends EventBridge {
+    NoopEventBridge() {
+        super(EventSubject.getSubject(DataRowStore.class, "noop-subject"), 
"noop-subject");
+    }
+
+    @Override
+    protected void startupExternal() throws Exception {
+    }
+
+    @Override
+    protected void shutdownExternal() throws Exception {
+    }
+
+    @Override
+    protected void sendExternalEvent(CayenneEvent localEvent) throws Exception 
{
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridgeProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridgeProvider.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridgeProvider.java
new file mode 100644
index 0000000..432b143
--- /dev/null
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventBridgeProvider.java
@@ -0,0 +1,35 @@
+/*****************************************************************
+ *   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.di.DIRuntimeException;
+import org.apache.cayenne.di.Provider;
+
+/**
+ * @since 4.0
+ */
+public class NoopEventBridgeProvider implements Provider<EventBridge> {
+
+    @Override
+    public EventBridge get() throws DIRuntimeException {
+        return new NoopEventBridge();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/main/java/org/apache/cayenne/event/XMPPBridgeProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/event/XMPPBridgeProvider.java 
b/cayenne-server/src/main/java/org/apache/cayenne/event/XMPPBridgeProvider.java
index ae577f2..2870edf 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/event/XMPPBridgeProvider.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/event/XMPPBridgeProvider.java
@@ -39,7 +39,7 @@ public class XMPPBridgeProvider implements 
Provider<EventBridge> {
 
     @Override
     public EventBridge get() throws DIRuntimeException {
-        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class.getClass(), dataDomain.getName());;
+        EventSubject snapshotEventSubject = 
EventSubject.getSubject(DataRowStore.class.getClass(), dataDomain.getName());
 
         return new XMPPBridge(
                 Collections.singleton(snapshotEventSubject),

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 879e98d..889abd8 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
@@ -59,7 +59,7 @@ public class DataRowStoreIT extends ServerCase {
     public void testDefaultConstructor() {
         cache = new DataRowStore(
                 "cacheXYZ",
-                Collections.EMPTY_MAP,
+                Collections.<String, String>emptyMap(),
                 null);
         assertEquals("cacheXYZ", cache.getName());
         assertNotNull(cache.getSnapshotEventSubject());
@@ -71,7 +71,7 @@ public class DataRowStoreIT extends ServerCase {
      */
     @Test
     public void testMaxSize() throws Exception {
-        Map<Object, Object> props = new HashMap<Object, Object>();
+        Map<String, String> props = new HashMap<>();
         props.put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, 
String.valueOf(2));
 
         cache = new DataRowStore(
@@ -82,40 +82,40 @@ public class DataRowStoreIT extends ServerCase {
         assertEquals(0, cache.size());
 
         ObjectId key1 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 1);
-        Map<Object, Object> diff1 = new HashMap<Object, Object>();
+        Map<ObjectId, DataRow> diff1 = new HashMap<>();
         diff1.put(key1, new DataRow(1));
 
         ObjectId key2 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 2);
-        Map<Object, Object> diff2 = new HashMap<Object, Object>();
+        Map<ObjectId, DataRow> diff2 = new HashMap<>();
         diff2.put(key2, new DataRow(1));
 
         ObjectId key3 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 3);
-        Map<Object, Object> diff3 = new HashMap<Object, Object>();
+        Map<ObjectId, DataRow> diff3 = new HashMap<>();
         diff3.put(key3, new DataRow(1));
 
         cache.processSnapshotChanges(
                 this,
                 diff1,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList());
         assertEquals(1, cache.size());
 
         cache.processSnapshotChanges(
                 this,
                 diff2,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList());
         assertEquals(2, cache.size());
 
         // this addition must overflow the cache, and throw out the first item
         cache.processSnapshotChanges(
                 this,
                 diff3,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList(),
+                Collections.<ObjectId>emptyList());
         assertEquals(2, cache.size());
         assertNotNull(cache.getCachedSnapshot(key2));
         assertNotNull(cache.getCachedSnapshot(key3));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 2621443..779396a 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
@@ -29,7 +29,7 @@ import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.event.DefaultEventManager;
 import org.apache.cayenne.event.EventBridge;
-import org.apache.cayenne.event.EventBridgeProvider;
+import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.event.MockEventBridge;
 import org.apache.cayenne.event.MockEventBridgeProvider;
@@ -76,7 +76,7 @@ public class DefaultDataRowStoreFactoryIT extends ServerCase {
                 
binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
                 
binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
                 
binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
-                
binder.bind(EventBridge.class).toProvider(EventBridgeProvider.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))

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/cayenne-server/src/test/java/org/apache/cayenne/access/event/SnapshotEventTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/event/SnapshotEventTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/event/SnapshotEventTest.java
index 94a49e6..e24ce2e 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/event/SnapshotEventTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/event/SnapshotEventTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.access.event;
 
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.ObjectId;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -33,10 +35,10 @@ public class SnapshotEventTest {
     @Test
     public void testRootEvent() {
         Object source = new Object();
-        Collection<?> deleted = new ArrayList<Object>();
-        Collection<?> invalidated = new ArrayList<Object>();
-        Map<?, ?> modified = new HashMap<Object, Object>();
-        Collection<?> related = new ArrayList<Object>();
+        Collection<ObjectId> deleted = new ArrayList<>();
+        Collection<ObjectId> invalidated = new ArrayList<>();
+        Map<ObjectId, DataRow> modified = new HashMap<>();
+        Collection<ObjectId> related = new ArrayList<>();
 
         SnapshotEvent event = new SnapshotEvent(
                 source,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/982b1541/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 32477cb..f7a362d 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
@@ -35,7 +35,7 @@ import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.event.EventBridgeProvider;
+import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.event.MockEventManager;
@@ -80,7 +80,7 @@ public class DataContextFactoryTest {
                 
binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
                 
binder.bind(TransactionManager.class).to(DefaultTransactionManager.class);
                 
binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
-                
binder.bind(EventBridge.class).toProvider(EventBridgeProvider.class);
+                
binder.bind(EventBridge.class).toProvider(NoopEventBridgeProvider.class);
                 
binder.bind(DataRowStoreFactory.class).to(DefaultDataRowStoreFactory.class);
                 binder.bindMap(Constants.DATA_ROW_STORE_PROPERTIES_MAP);
             }
@@ -120,7 +120,7 @@ public class DataContextFactoryTest {
                 
binder.bind(ObjectStoreFactory.class).to(DefaultObjectStoreFactory.class);
                 
binder.bind(TransactionFactory.class).to(DefaultTransactionFactory.class);
                 
binder.bind(TransactionManager.class).to(DefaultTransactionManager.class);
-                
binder.bind(EventBridge.class).toProvider(EventBridgeProvider.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/982b1541/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 54831de..7fe4763 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
@@ -73,7 +73,7 @@ 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.EventBridge;
-import org.apache.cayenne.event.EventBridgeProvider;
+import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.event.MockEventManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
@@ -197,7 +197,7 @@ public class DataDomainProviderTest {
                                
binder.bind(DataNodeFactory.class).to(DefaultDataNodeFactory.class);
                                
binder.bind(SQLTemplateProcessor.class).toInstance(mock(SQLTemplateProcessor.class));
 
-                
binder.bind(EventBridge.class).toProvider(EventBridgeProvider.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/982b1541/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
index 7f225c8..a0efc04 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
@@ -52,6 +52,7 @@ public class DataDomainView extends JPanel implements 
DomainDisplayListener {
 
     protected TextAdapter name;
     protected JCheckBox objectValidation;
+    protected JCheckBox sharedCache;
 
     public DataDomainView(ProjectController projectController) {
         this.projectController = projectController;
@@ -74,6 +75,7 @@ public class DataDomainView extends JPanel implements 
DomainDisplayListener {
         };
 
         this.objectValidation = new JCheckBox();
+        this.sharedCache = new JCheckBox();
 
         // assemble
         CellConstraints cc = new CellConstraints();
@@ -91,6 +93,9 @@ public class DataDomainView extends JPanel implements 
DomainDisplayListener {
         builder.addLabel("Object Validation:", cc.xy(1, 5));
         builder.add(objectValidation, cc.xy(3, 5));
 
+        builder.addLabel("Use Shared Cache:", cc.xy(1, 7));
+        builder.add(sharedCache, cc.xy(3, 7));
+
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
     }
@@ -110,6 +115,17 @@ public class DataDomainView extends JPanel implements 
DomainDisplayListener {
             }
         });
 
+        sharedCache.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                String value = sharedCache.isSelected() ? "true" : "false";
+                setDomainProperty(
+                        DataDomain.SHARED_CACHE_ENABLED_PROPERTY,
+                        value,
+                        
Boolean.toString(DataDomain.SHARED_CACHE_ENABLED_DEFAULT));
+            }
+        });
+
     }
 
     /**
@@ -180,6 +196,10 @@ public class DataDomainView extends JPanel implements 
DomainDisplayListener {
         objectValidation.setSelected(getDomainBooleanProperty(
                 DataDomain.VALIDATING_OBJECTS_ON_COMMIT_PROPERTY,
                 
Boolean.toString(DataDomain.VALIDATING_OBJECTS_ON_COMMIT_DEFAULT)));
+
+        sharedCache.setSelected(getDomainBooleanProperty(
+                DataDomain.SHARED_CACHE_ENABLED_PROPERTY,
+                Boolean.toString(DataDomain.SHARED_CACHE_ENABLED_DEFAULT)));
     }
 
     void setDomainName(String newName) {

Reply via email to