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());
+ }
+
}