You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2013/06/20 13:23:01 UTC

svn commit: r1494931 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java

Author: mduerig
Date: Thu Jun 20 11:23:01 2013
New Revision: 1494931

URL: http://svn.apache.org/r1494931
Log:
OAK-144 Implement Observation
- avoid race condition between creating changes sets and dispatching them, which could lead to bogus events

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java?rev=1494931&r1=1494930&r2=1494931&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java Thu Jun 20 11:23:01 2013
@@ -93,34 +93,26 @@ public class ChangeDispatcher {
         return listener;
     }
 
-    private void contentChanged(@Nonnull NodeState before, @Nonnull NodeState after, ContentSession contentSession) {
-        ChangeSet extChanges;
-        ChangeSet intChange;
-        synchronized (this) {
-            extChanges = externalChange(checkNotNull(before));
-            intChange = internalChange(checkNotNull(after), contentSession);
-        }
-        if (extChanges != null) {
-            add(extChanges);
-        }
-        add(intChange);
-    }
-
-    @CheckForNull
-    private synchronized ChangeSet externalChange(NodeState root) {
-        if (root != previousRoot) {
-            ChangeSet changeSet = ChangeSet.external(previousRoot, root);
+    private synchronized void contentChanged(@Nonnull NodeState before, @Nonnull NodeState after,
+            ContentSession contentSession) {
+        externalChange(checkNotNull(before));
+        internalChange(checkNotNull(after), contentSession);
+    }
+
+    private void externalChange(NodeState root) {
+        if (!root.equals(previousRoot)) {
+            add(ChangeSet.external(previousRoot, root));
             previousRoot = root;
-            return changeSet;
         }
-        return null;
     }
 
-    @Nonnull
-    private synchronized ChangeSet internalChange(NodeState root, ContentSession contentSession) {
-        ChangeSet changeSet = ChangeSet.local(previousRoot, root, contentSession);
+    private void internalChange(NodeState root, ContentSession contentSession) {
+        add(ChangeSet.local(previousRoot, root, contentSession));
         previousRoot = root;
-        return changeSet;
+    }
+
+    private synchronized void externalChange() {
+        externalChange(store.getRoot());
     }
 
     private void register(Listener listener) {
@@ -192,10 +184,7 @@ public class ChangeDispatcher {
         @CheckForNull
         public ChangeSet getChanges() {
             if (changeSets.isEmpty()) {
-                ChangeSet changeSet = externalChange(store.getRoot());
-                if (changeSet != null) {
-                    add(changeSet);
-                }
+                externalChange();
             }
             return changeSets.isEmpty() ? null : changeSets.remove();
         }