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/02/25 18:10:16 UTC

svn commit: r1571748 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/

Author: mduerig
Date: Tue Feb 25 17:10:16 2014
New Revision: 1571748

URL: http://svn.apache.org/r1571748
Log:
OAK-1459: Many extra events are dispatched from a move event
Split FatTreeFilter into AddSubtreeFilter and DeleteSubtreeFilter for filtering individual events of added and removed sub-trees, respectively

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/AddSubtreeFilter.java
      - copied, changed from r1571723, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/DeleteSubtreeFilter.java
      - copied, changed from r1571723, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java
Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterBuilder.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/AddSubtreeFilter.java (from r1571723, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/AddSubtreeFilter.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/AddSubtreeFilter.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java&r1=1571723&r2=1571748&rev=1571748&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/AddSubtreeFilter.java Tue Feb 25 17:10:16 2014
@@ -25,21 +25,20 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
- * This {@code EventFilter} implementation excludes fat sub trees.
- * That is, it excludes events for child nodes of added or removed
- * nodes.
+ * This {@code EventFilter} implementation excludes events for child nodes
+ * of added nodes.
  */
-public class FatTreeFilter implements EventFilter {
-    private static final FatTreeFilter INCLUDE = new FatTreeFilter(true);
-    private static final FatTreeFilter EXCLUDE = new FatTreeFilter(false);
+public class AddSubtreeFilter implements EventFilter {
+    private static final AddSubtreeFilter INCLUDE_ADD = new AddSubtreeFilter(true);
+    private static final AddSubtreeFilter EXCLUDE_ADD = new AddSubtreeFilter(false);
 
     private final boolean include;
 
     public static EventFilter getInstance() {
-        return INCLUDE;
+        return INCLUDE_ADD;
     }
 
-    private FatTreeFilter(boolean include) {
+    private AddSubtreeFilter(boolean include) {
         this.include = include;
     }
 
@@ -65,7 +64,7 @@ public class FatTreeFilter implements Ev
 
     @Override
     public boolean includeDelete(String name, NodeState before) {
-        return include;
+        return true;
     }
 
     @Override
@@ -80,12 +79,12 @@ public class FatTreeFilter implements Ev
 
     @Override
     public EventFilter create(String name, NodeState before, NodeState after) {
-        if (this == EXCLUDE) {
+        if (this == EXCLUDE_ADD) {
             return null;
-        } else if (before == MISSING_NODE || after == MISSING_NODE) {
-            return EXCLUDE;
+        } else if (before == MISSING_NODE) {
+            return EXCLUDE_ADD;
         } else {
-            return INCLUDE;
+            return INCLUDE_ADD;
         }
     }
 }

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/DeleteSubtreeFilter.java (from r1571723, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/DeleteSubtreeFilter.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/DeleteSubtreeFilter.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java&r1=1571723&r2=1571748&rev=1571748&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/DeleteSubtreeFilter.java Tue Feb 25 17:10:16 2014
@@ -25,21 +25,20 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
- * This {@code EventFilter} implementation excludes fat sub trees.
- * That is, it excludes events for child nodes of added or removed
- * nodes.
+ * This {@code EventFilter} implementation excludes events for child nodes
+ * of removed nodes.
  */
-public class FatTreeFilter implements EventFilter {
-    private static final FatTreeFilter INCLUDE = new FatTreeFilter(true);
-    private static final FatTreeFilter EXCLUDE = new FatTreeFilter(false);
+public class DeleteSubtreeFilter implements EventFilter {
+    private static final DeleteSubtreeFilter INCLUDE_DELETE = new DeleteSubtreeFilter(true);
+    private static final DeleteSubtreeFilter EXCLUDE_DELETE = new DeleteSubtreeFilter(false);
 
     private final boolean include;
 
     public static EventFilter getInstance() {
-        return INCLUDE;
+        return INCLUDE_DELETE;
     }
 
-    private FatTreeFilter(boolean include) {
+    private DeleteSubtreeFilter(boolean include) {
         this.include = include;
     }
 
@@ -60,7 +59,7 @@ public class FatTreeFilter implements Ev
 
     @Override
     public boolean includeAdd(String name, NodeState after) {
-        return include;
+        return true;
     }
 
     @Override
@@ -80,12 +79,12 @@ public class FatTreeFilter implements Ev
 
     @Override
     public EventFilter create(String name, NodeState before, NodeState after) {
-        if (this == EXCLUDE) {
+        if (this == EXCLUDE_DELETE) {
             return null;
-        } else if (before == MISSING_NODE || after == MISSING_NODE) {
-            return EXCLUDE;
+        } else if (after == MISSING_NODE) {
+            return EXCLUDE_DELETE;
         } else {
-            return INCLUDE;
+            return INCLUDE_DELETE;
         }
     }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterBuilder.java?rev=1571748&r1=1571747&r2=1571748&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterBuilder.java Tue Feb 25 17:10:16 2014
@@ -243,13 +243,19 @@ public final class FilterBuilder {
     }
 
     /**
-     * A condition that holds for fat sub trees. That is, for child nodes
-     * of added nodes or removed nodes.
-     * @return fat tree condition
+     * @return a condition that holds for children of added nodes.
      */
     @Nonnull
-    public Condition fatTree() {
-        return new FatTreeCondition();
+    public Condition addSubtree() {
+        return new AddSubtreeTreeCondition();
+    }
+
+    /**
+     * @return a condition that holds for children of deleted nodes.
+     */
+    @Nonnull
+    public Condition deleteSubtree() {
+        return new DeleteSubtreeTreeCondition();
     }
 
     //------------------------------------------------------------< Compound conditions >---
@@ -417,12 +423,21 @@ public final class FilterBuilder {
         }
     }
 
-    protected static class FatTreeCondition implements Condition {
+    protected static class AddSubtreeTreeCondition implements Condition {
+        @Nonnull
+        @Override
+        public EventFilter createFilter(@Nonnull NodeState before, @Nonnull NodeState after,
+                String basePath) {
+            return AddSubtreeFilter.getInstance();
+        }
+    }
+
+    protected static class DeleteSubtreeTreeCondition implements Condition {
         @Nonnull
         @Override
         public EventFilter createFilter(@Nonnull NodeState before, @Nonnull NodeState after,
                 String basePath) {
-            return FatTreeFilter.getInstance();
+            return DeleteSubtreeFilter.getInstance();
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java?rev=1571748&r1=1571747&r2=1571748&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java Tue Feb 25 17:10:16 2014
@@ -465,7 +465,7 @@ public class ObservationTest extends Abs
 
         ExpectationListener listener = new ExpectationListener();
         observationManager.addEventListener(listener, NODE_MOVED, "/", true, null, null, false);
-        listener.expect(new Expectation("orderBefore"){
+        listener.expect(new Expectation("orderBefore") {
             @Override
             public boolean onEvent(Event event) throws Exception {
                 if (event.getType() != NODE_MOVED || event.getInfo() == null) {
@@ -475,10 +475,10 @@ public class ObservationTest extends Abs
                 Map<?, ?> info = event.getInfo();
                 if (PathUtils.concat(TEST_PATH, "a").equals(event.getPath())) {
                     return "a".equals(info.get("srcChildRelPath")) &&
-                           "b".equals(info.get("destChildRelPath"));
+                            "b".equals(info.get("destChildRelPath"));
                 } else if (PathUtils.concat(TEST_PATH, "b").equals(event.getPath())) {
                     return "b".equals(info.get("srcChildRelPath")) &&
-                           "a".equals(info.get("destChildRelPath"));
+                            "a".equals(info.get("destChildRelPath"));
                 } else {
                     return false;
                 }
@@ -595,14 +595,14 @@ public class ObservationTest extends Abs
     }
 
     @Test
-    public void fatTreeFilter() throws RepositoryException, ExecutionException, InterruptedException {
+    public void addSubtreeFilter() throws RepositoryException, ExecutionException, InterruptedException {
         assumeTrue(observationManager instanceof ObservationManagerImpl);
         ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
         ExpectationListener listener = new ExpectationListener();
         FilterBuilder builder = new FilterBuilder();
 
-        // Only generate events for the root of added or removed sub trees
-        builder.condition(builder.fatTree());
+        // Only generate events for the root of added sub trees
+        builder.condition(builder.addSubtree());
         oManager.addEventListener(listener, builder.build());
 
         Node testNode = getNode(TEST_PATH);
@@ -614,13 +614,30 @@ public class ObservationTest extends Abs
         assertTrue("Missing events: " + missing, missing.isEmpty());
         List<Event> unexpected = listener.getUnexpected();
         assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
+    }
+
+    @Test
+    public void removeSubtreeFilter() throws RepositoryException, ExecutionException, InterruptedException {
+        assumeTrue(observationManager instanceof ObservationManagerImpl);
 
-        listener.expectRemove(a).remove();
+        Node testNode = getNode(TEST_PATH);
+        testNode.addNode("a").addNode("c");
         testNode.getSession().save();
 
-        missing = listener.getMissing(2, TimeUnit.SECONDS);
+        ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+        ExpectationListener listener = new ExpectationListener();
+        FilterBuilder builder = new FilterBuilder();
+
+        // Only generate events for the root of deleted sub trees
+        builder.condition(builder.deleteSubtree());
+        oManager.addEventListener(listener, builder.build());
+
+        listener.expectRemove(testNode.getNode("a")).remove();
+        testNode.getSession().save();
+
+        List<Expectation> missing = listener.getMissing(2, TimeUnit.SECONDS);
         assertTrue("Missing events: " + missing, missing.isEmpty());
-        unexpected = listener.getUnexpected();
+        List<Event> unexpected = listener.getUnexpected();
         assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
     }