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 2014/07/16 11:34:58 UTC

svn commit: r1610952 - in /jackrabbit/oak/branches/1.0: ./ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Author: mduerig
Date: Wed Jul 16 09:34:57 2014
New Revision: 1610952

URL: http://svn.apache.org/r1610952
Log:
OAK-1969: merged revision 1610658

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    jackrabbit/oak/branches/1.0/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1610658

Modified: jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1610952&r1=1610951&r2=1610952&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java Wed Jul 16 09:34:57 2014
@@ -28,6 +28,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
@@ -39,6 +40,7 @@ import javax.jcr.observation.EventListen
 import javax.jcr.observation.EventListenerIterator;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.jackrabbit.api.observation.JackrabbitEventFilter;
 import org.apache.jackrabbit.api.observation.JackrabbitObservationManager;
 import org.apache.jackrabbit.commons.iterator.EventListenerIteratorAdapter;
@@ -208,7 +210,7 @@ public class ObservationManagerImpl impl
         boolean noLocal = filter.getNoLocal();
         boolean noExternal = filter.getNoExternal() || listener instanceof ExcludeExternal;
         boolean noInternal = false; // FIXME OAK-1618 filter.getNoInternal(); once JCR-3759 is resolved
-        List<String> absPaths = Lists.newArrayList(filter.getAdditionalPaths());
+        Set<String> absPaths = Sets.newHashSet(filter.getAdditionalPaths());
         String absPath = filter.getAbsPath();
         if (absPath != null) {
             absPaths.add(absPath);

Modified: jackrabbit/oak/branches/1.0/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java?rev=1610952&r1=1610951&r2=1610952&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java Wed Jul 16 09:34:57 2014
@@ -673,6 +673,31 @@ public class ObservationTest extends Abs
     }
 
     @Test
+    public void noDuplicates() throws ExecutionException, InterruptedException, RepositoryException {
+        assumeTrue(observationManager instanceof JackrabbitObservationManager);
+        JackrabbitObservationManager oManager = (JackrabbitObservationManager) observationManager;
+        ExpectationListener listener = new ExpectationListener();
+        JackrabbitEventFilter filter = new JackrabbitEventFilter()
+                .setAdditionalPaths(TEST_PATH + "/a", TEST_PATH + "/a")
+                .setEventTypes(NODE_ADDED);
+        oManager.addEventListener(listener, filter);
+
+        Node testNode = getNode(TEST_PATH);
+        Node b = testNode.addNode("a").addNode("b");
+        b.addNode("c");
+        Node y = testNode.addNode("x").addNode("y");
+        y.addNode("z");
+
+        listener.expect(b.getPath(), NODE_ADDED);
+        testNode.getSession().save();
+
+        List<Expectation> missing = listener.getMissing(TIME_OUT, TimeUnit.SECONDS);
+        assertTrue("Missing events: " + missing, missing.isEmpty());
+        List<Event> unexpected = listener.getUnexpected();
+        assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
+    }
+
+    @Test
     public void filterPropertyOfParent()
             throws RepositoryException, ExecutionException, InterruptedException {
         assumeTrue(observationManager instanceof ObservationManagerImpl);
@@ -831,6 +856,10 @@ public class ObservationTest extends Abs
             future.set(event);
         }
 
+        public boolean isComplete() {
+            return future.isDone();
+        }
+
         public void fail(Exception e) {
             future.setException(e);
         }
@@ -951,7 +980,7 @@ public class ObservationTest extends Abs
                     Event event = events.nextEvent();
                     boolean found = false;
                     for (Expectation exp : expected) {
-                        if (exp.isEnabled() && exp.onEvent(event)) {
+                        if (exp.isEnabled() && !exp.isComplete() && exp.onEvent(event)) {
                             found = true;
                             exp.complete(event);
                         }