Author: mduerig
Date: Mon Feb 24 16:30:29 2014
New Revision: 1571337
URL: http://svn.apache.org/r1571337
Log:
OAK-1459: Many extra events are dispatched from a move event
Implement filter for excluding fat trees.
Added:
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
Added:
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/FatTreeFilter.java?rev=1571337&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FatTreeFilter.java
Mon Feb 24 16:30:29 2014
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.observation.filter;
+
+import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.MISSING_NODE;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+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.
+ */
+public class FatTreeFilter implements EventFilter {
+ private static final FatTreeFilter INCLUDE = new FatTreeFilter(true);
+ private static final FatTreeFilter EXCLUDE = new FatTreeFilter(false);
+
+ private final boolean include;
+
+ public static EventFilter getInstance() {
+ return INCLUDE;
+ }
+
+ private FatTreeFilter(boolean include) {
+ this.include = include;
+ }
+
+ @Override
+ public boolean includeAdd(PropertyState after) {
+ return true;
+ }
+
+ @Override
+ public boolean includeChange(PropertyState before, PropertyState after) {
+ return true;
+ }
+
+ @Override
+ public boolean includeDelete(PropertyState before) {
+ return true;
+ }
+
+ @Override
+ public boolean includeAdd(String name, NodeState after) {
+ return include;
+ }
+
+ @Override
+ public boolean includeDelete(String name, NodeState before) {
+ return include;
+ }
+
+ @Override
+ public boolean includeMove(String sourcePath, String name, NodeState
moved) {
+ return true;
+ }
+
+ @Override
+ public boolean includeReorder(String destName, String name, NodeState
reordered) {
+ return true;
+ }
+
+ @Override
+ public EventFilter create(String name, NodeState before, NodeState after) {
+ if (this == EXCLUDE) {
+ return null;
+ } else if (before == MISSING_NODE || after == MISSING_NODE) {
+ return EXCLUDE;
+ } else {
+ return INCLUDE;
+ }
+ }
+}
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=1571337&r1=1571336&r2=1571337&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
Mon Feb 24 16:30:29 2014
@@ -37,7 +37,6 @@ import javax.annotation.Nonnull;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
-
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate;
@@ -56,7 +55,7 @@ public final class FilterBuilder {
private boolean includeSessionLocal;
private boolean includeClusterExternal;
private String basePath = "/";
- private Condition condition;
+ private Condition condition = includeAll();
public interface Condition {
@Nonnull
@@ -243,6 +242,16 @@ public final class FilterBuilder {
return new UniversalCondition(checkNotNull(selector),
checkNotNull(predicate));
}
+ /**
+ * A condition that holds for fat sub trees. That is, for child nodes
+ * of added nodes or removed nodes.
+ * @return fat tree condition
+ */
+ @Nonnull
+ public Condition fatTree() {
+ return new FatTreeCondition();
+ }
+
//------------------------------------------------------------< Compound
conditions >---
/**
@@ -408,6 +417,15 @@ public final class FilterBuilder {
}
}
+ protected static class FatTreeCondition implements Condition {
+ @Nonnull
+ @Override
+ public EventFilter createFilter(@Nonnull NodeState before, @Nonnull
NodeState after,
+ String basePath) {
+ return FatTreeFilter.getInstance();
+ }
+ }
+
private static class AnyCondition implements Condition {
private final Condition[] conditions;
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=1571337&r1=1571336&r2=1571337&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 Feb 24 16:30:29 2014
@@ -594,6 +594,36 @@ public class ObservationTest extends Abs
assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
}
+ @Test
+ public void fatTreeFilter() 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());
+ oManager.addEventListener(listener, builder.build());
+
+ Node testNode = getNode(TEST_PATH);
+ Node a = listener.expectAdd(testNode.addNode("a"));
+ a.addNode("c");
+ testNode.getSession().save();
+
+ List<Expectation> missing = listener.getMissing(2, TimeUnit.SECONDS);
+ assertTrue("Missing events: " + missing, missing.isEmpty());
+ List<Event> unexpected = listener.getUnexpected();
+ assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
+
+ listener.expectRemove(a).remove();
+ testNode.getSession().save();
+
+ missing = listener.getMissing(2, TimeUnit.SECONDS);
+ assertTrue("Missing events: " + missing, missing.isEmpty());
+ unexpected = listener.getUnexpected();
+ assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
+ }
+
//------------------------------------------------------------< private
>---
private Node getNode(String path) throws RepositoryException {