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 st...@apache.org on 2016/10/31 14:47:02 UTC

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

Author: stefanegli
Date: Mon Oct 31 14:47:01 2016
New Revision: 1767295

URL: http://svn.apache.org/viewvc?rev=1767295&view=rev
Log:
OAK-5022 : introducing withIncludeSubtreeOnRemove to the OakEventFilter which causes events to be sent for the subtree that got removed - basically does not exclude the subtree via deleteSubtree() as is otherwise the default

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/OakEventFilterImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/filter/OakEventFilter.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/OakEventFilterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/OakEventFilterImpl.java?rev=1767295&r1=1767294&r2=1767295&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/OakEventFilterImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/OakEventFilterImpl.java Mon Oct 31 14:47:01 2016
@@ -51,6 +51,9 @@ public class OakEventFilterImpl extends
     /** whether or not includeAncestorsRemove feature is enabled */
     private boolean includeAncestorRemove;
 
+    /** whether or not includeSubTreeOnRemove feature is enabled */
+    private boolean includeSubtreeOnRemove;
+
     public OakEventFilterImpl(@Nonnull JackrabbitEventFilter delegate) {
         checkNotNull(delegate);
         this.delegate = delegate;
@@ -249,4 +252,14 @@ public class OakEventFilterImpl extends
                         );
     }
 
+    @Override
+    public OakEventFilter withIncludeSubtreeOnRemove() {
+        this.includeSubtreeOnRemove = true;
+        return this;
+    }
+    
+    boolean getIncludeSubtreeOnRemove() {
+        return includeSubtreeOnRemove;
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1767295&r1=1767294&r2=1767295&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java Mon Oct 31 14:47:01 2016
@@ -251,16 +251,23 @@ public class ObservationManagerImpl impl
         List<Condition> excludeConditions = createExclusions(filterBuilder, excludedPaths);
 
         Selector nodeTypeSelector = Selectors.PARENT;
+        boolean deleteSubtree = true;
         if (oakEventFilter != null) {
             if (oakEventFilter.getApplyNodeTypeOnSelf()) {
                 nodeTypeSelector = Selectors.THIS;
             }
+            if (oakEventFilter.getIncludeSubtreeOnRemove()) {
+                deleteSubtree = false;
+            }
+        }
+        if (deleteSubtree) {
+            excludeConditions.add(filterBuilder.deleteSubtree());
         }
 
         Condition condition = filterBuilder.all(
                     filterBuilder.all(excludeConditions),
                     filterBuilder.any(includeConditions),
-                    filterBuilder.deleteSubtree(),
+//                    filterBuilder.deleteSubtree(),     // moved depending on deleteSubtree on excludeConditions
                     filterBuilder.moveSubtree(),
                     filterBuilder.eventType(eventTypes),
                     filterBuilder.uuid(Selectors.PARENT, uuids),

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/filter/OakEventFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/filter/OakEventFilter.java?rev=1767295&r1=1767294&r2=1767295&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/filter/OakEventFilter.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/filter/OakEventFilter.java Mon Oct 31 14:47:01 2016
@@ -66,4 +66,13 @@ public abstract class OakEventFilter ext
      */
     public abstract OakEventFilter withIncludeAncestorsRemove();
 
+    /**
+     * This flag causes remove events to be sent for all nodes and properties
+     * of an entire subtree (hence use with care!).
+     * <p>
+     * It is only applied when a parent node is actually removed. For 
+     * a parent node move this is not applied.
+     * @return this filter with the filter change applied
+     */
+    public abstract OakEventFilter withIncludeSubtreeOnRemove();
 }

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=1767295&r1=1767294&r2=1767295&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 Mon Oct 31 14:47:01 2016
@@ -1346,5 +1346,34 @@ public class ObservationTest extends Abs
         assertTrue("Missing events: " + missing, missing.isEmpty());
     }
 
+    @Test
+    public void includeRemovedSubtree() throws RepositoryException, ExecutionException, InterruptedException {
+        assumeTrue(observationManager instanceof ObservationManagerImpl);
+
+        Node testNode = getNode(TEST_PATH);
+        testNode.addNode("a").addNode("c");
+        testNode.getSession().save();
+
+        ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+        ExpectationListener listener = new ExpectationListener();
+        
+        JackrabbitEventFilter filter = new JackrabbitEventFilter();
+        filter.setEventTypes(ALL_EVENTS);
+        filter.setAbsPath("/");
+        filter.setIsDeep(true);
+        filter = FilterFactory.wrap(filter).withIncludeSubtreeOnRemove();
+
+        oManager.addEventListener(listener, filter);
+
+        listener.expectRemove(testNode.getNode("a").getNode("c"));
+        listener.expectRemove(testNode.getNode("a")).remove();
+        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());
+    }
+    
 
 }