Author: mduerig
Date: Tue Nov 19 16:37:34 2013
New Revision: 1543483
URL: http://svn.apache.org/r1543483
Log:
OAK-1133: Observation listener PLUS
Evaluate trivial filters on instantiation
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/Filters.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java?rev=1543483&r1=1543482&r2=1543483&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
Tue Nov 19 16:37:34 2013
@@ -19,8 +19,18 @@
package org.apache.jackrabbit.oak.plugins.observation;
import static com.google.common.base.Objects.toStringHelper;
+import static javax.jcr.observation.Event.NODE_ADDED;
+import static javax.jcr.observation.Event.NODE_MOVED;
+import static javax.jcr.observation.Event.NODE_REMOVED;
+import static javax.jcr.observation.Event.PERSIST;
+import static javax.jcr.observation.Event.PROPERTY_ADDED;
+import static javax.jcr.observation.Event.PROPERTY_CHANGED;
+import static javax.jcr.observation.Event.PROPERTY_REMOVED;
+
+import java.util.List;
import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
import org.apache.jackrabbit.oak.core.ImmutableTree;
import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
import
org.apache.jackrabbit.oak.plugins.observation.filter.EventGenerator.Filter;
@@ -35,6 +45,10 @@ import org.apache.jackrabbit.oak.spi.com
* Provider for a filter filtering observation events according to a certain
criterion.
*/
public class FilterProvider {
+ private static final int ALL_EVENTS = NODE_ADDED | NODE_REMOVED |
NODE_MOVED | PROPERTY_ADDED |
+ PROPERTY_REMOVED | PROPERTY_CHANGED | PERSIST;
+
+
private final ReadOnlyNodeTypeManager ntManager;
private final int eventTypes;
private final String path;
@@ -79,12 +93,33 @@ public class FilterProvider {
}
public Filter getFilter(ImmutableTree afterTree) {
- return Filters.all(
- // TODO add filter based on access rights of the reading
session. See OAK-1163
- new PathFilter(afterTree, path, deep),
- new EventTypeFilter(eventTypes),
- new UuidFilter(afterTree.getNodeState(), uuids),
- new NodeTypeFilter(afterTree, ntManager, ntNames));
+ List<Filter> filters = Lists.<Filter>newArrayList(
+ new PathFilter(afterTree, path, deep));
+
+ if ((ALL_EVENTS & eventTypes) == 0) {
+ return Filters.excludeAll();
+ } else {
+ filters.add(new EventTypeFilter(eventTypes));
+ }
+
+ if (uuids != null) {
+ if (uuids.length == 0) {
+ return Filters.excludeAll();
+ } else {
+ filters.add(new UuidFilter(afterTree.getNodeState(), uuids));
+ }
+ }
+
+ if (ntNames != null) {
+ if (ntNames.length == 0) {
+ return Filters.excludeAll();
+ } else {
+ filters.add(new NodeTypeFilter(afterTree, ntManager, ntNames));
+ }
+ }
+
+ // TODO add filter based on access rights of the reading session. See
OAK-1163
+ return Filters.all(filters.toArray(new Filter[filters.size()]));
}
public String getPath() {
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/Filters.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/Filters.java?rev=1543483&r1=1543482&r2=1543483&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/Filters.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/Filters.java
Tue Nov 19 16:37:34 2013
@@ -57,6 +57,20 @@ public final class Filters {
return all(Lists.newArrayList(checkNotNull(filters)));
}
+ /**
+ * @return Filter that includes everything
+ */
+ public static Filter includeAll() {
+ return new ConstantFilter(true);
+ }
+
+ /**
+ * @return Filter that excludes everything
+ */
+ public static Filter excludeAll() {
+ return new ConstantFilter(false);
+ }
+
private static Filter any(final List<Filter> filters) {
return new Filter() {
@Override
@@ -230,4 +244,52 @@ public final class Filters {
}
};
}
+
+ private static class ConstantFilter implements Filter {
+ private final boolean include;
+
+ private ConstantFilter(boolean include) {
+ this.include = include;
+ }
+
+ @Override
+ public boolean includeAdd(PropertyState after) {
+ return include;
+ }
+
+ @Override
+ public boolean includeChange(PropertyState before, PropertyState
after) {
+ return include;
+ }
+
+ @Override
+ public boolean includeDelete(PropertyState before) {
+ return include;
+ }
+
+ @Override
+ public boolean includeAdd(String name, NodeState after) {
+ return include;
+ }
+
+ @Override
+ public boolean includeChange(String name, NodeState before, NodeState
after) {
+ return include;
+ }
+
+ @Override
+ public boolean includeDelete(String name, NodeState before) {
+ return include;
+ }
+
+ @Override
+ public boolean includeMove(String sourcePath, String destPath,
NodeState moved) {
+ return include;
+ }
+
+ @Override
+ public Filter create(String name, NodeState before, NodeState after) {
+ return include ? this : null;
+ }
+ }
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java?rev=1543483&r1=1543482&r2=1543483&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
Tue Nov 19 16:37:34 2013
@@ -19,6 +19,10 @@
package org.apache.jackrabbit.oak.plugins.observation.filter;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nonnull;
+
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.core.ImmutableTree;
import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
@@ -34,10 +38,11 @@ public class NodeTypeFilter implements F
private final ReadOnlyNodeTypeManager ntManager;
private final String[] ntNames;
- public NodeTypeFilter(ImmutableTree afterTree, ReadOnlyNodeTypeManager
ntManager, String[] ntNames) {
- this.afterTree = afterTree;
- this.ntManager = ntManager;
- this.ntNames = ntNames;
+ public NodeTypeFilter(@Nonnull ImmutableTree afterTree,
+ @Nonnull ReadOnlyNodeTypeManager ntManager, @Nonnull String[]
ntNames) {
+ this.afterTree = checkNotNull(afterTree);
+ this.ntManager = checkNotNull(ntManager);
+ this.ntNames = checkNotNull(ntNames);
}
@Override
@@ -90,16 +95,12 @@ public class NodeTypeFilter implements F
* parent node.
*/
private boolean includeByType() {
- if (ntNames == null) {
- return true;
- } else {
- for (String ntName : ntNames) {
- if (ntManager.isNodeType(afterTree, ntName)) {
- return true;
- }
+ for (String ntName : ntNames) {
+ if (ntManager.isNodeType(afterTree, ntName)) {
+ return true;
}
- return false;
}
+ return false;
}
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java?rev=1543483&r1=1543482&r2=1543483&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
Tue Nov 19 16:37:34 2013
@@ -19,6 +19,10 @@
package org.apache.jackrabbit.oak.plugins.observation.filter;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nonnull;
+
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
@@ -33,9 +37,9 @@ public class UuidFilter implements Filte
private final NodeState after;
private final String[] uuids;
- public UuidFilter(NodeState after, String[] uuids) {
- this.after = after;
- this.uuids = uuids;
+ public UuidFilter(@Nonnull NodeState after, @Nonnull String[] uuids) {
+ this.after = checkNotNull(after);
+ this.uuids = checkNotNull(uuids);
}
@Override
@@ -81,9 +85,6 @@ public class UuidFilter implements Filte
//------------------------------------------------------------< private
>---
private boolean includeByUuid() {
- if (uuids == null) {
- return true;
- }
if (uuids.length == 0) {
return false;
}