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