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


Reply via email to