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 2013/11/19 18:20:14 UTC

svn commit: r1543508 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation: ChangeProcessor.java FilterProvider.java filter/NodeTypeFilter.java filter/PathFilter.java filter/UuidFilter.java

Author: mduerig
Date: Tue Nov 19 17:20:13 2013
New Revision: 1543508

URL: http://svn.apache.org/r1543508
Log:
OAK-1133: Observation listener PLUS
Correct calculation of associated parent node

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
    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/NodeTypeFilter.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.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/ChangeProcessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java Tue Nov 19 17:20:13 2013
@@ -128,7 +128,7 @@ public class ChangeProcessor implements 
                     ImmutableTree afterTree = getTree(root, path);
                     EventIterator<Event> events = new EventIterator<Event>(
                             beforeTree.getNodeState(), afterTree.getNodeState(),
-                            provider.getFilter(afterTree),
+                            provider.getFilter(beforeTree, afterTree),
                             new JcrListener(beforeTree, afterTree, namePathMapper, info));
                     if (events.hasNext()) {
                         eventListener.onEvent(new EventIteratorAdapter(events));

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=1543508&r1=1543507&r2=1543508&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 17:20:13 2013
@@ -92,9 +92,9 @@ public class FilterProvider {
             && (includeClusterExternal || !isExternal(info));
     }
 
-    public Filter getFilter(ImmutableTree afterTree) {
+    public Filter getFilter(ImmutableTree beforeTree, ImmutableTree afterTree) {
         List<Filter> filters = Lists.<Filter>newArrayList(
-                new PathFilter(afterTree, path, deep));
+                new PathFilter(beforeTree, afterTree, path, deep));
 
         if ((ALL_EVENTS & eventTypes) == 0) {
             return Filters.excludeAll();
@@ -106,7 +106,8 @@ public class FilterProvider {
             if (uuids.length == 0) {
                 return Filters.excludeAll();
             } else {
-                filters.add(new UuidFilter(afterTree.getNodeState(), uuids));
+                filters.add(new UuidFilter(
+                        beforeTree.getNodeState(), afterTree.getNodeState(), uuids));
             }
         }
 
@@ -114,7 +115,7 @@ public class FilterProvider {
             if (ntNames.length == 0) {
                 return Filters.excludeAll();
             } else {
-                filters.add(new NodeTypeFilter(afterTree, ntManager, ntNames));
+                filters.add(new NodeTypeFilter(beforeTree, afterTree, ntManager, ntNames));
             }
         }
 

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=1543508&r1=1543507&r2=1543508&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 17:20:13 2013
@@ -34,12 +34,14 @@ import org.apache.jackrabbit.oak.spi.sta
  * TODO Clarify: filter applies to parent
  */
 public class NodeTypeFilter implements Filter {
+    private final ImmutableTree beforeTree;
     private final ImmutableTree afterTree;
     private final ReadOnlyNodeTypeManager ntManager;
     private final String[] ntNames;
 
-    public NodeTypeFilter(@Nonnull ImmutableTree afterTree,
+    public NodeTypeFilter(@Nonnull ImmutableTree beforeTree, @Nonnull ImmutableTree afterTree,
             @Nonnull ReadOnlyNodeTypeManager ntManager, @Nonnull String[] ntNames) {
+        this.beforeTree = checkNotNull(beforeTree);
         this.afterTree = checkNotNull(afterTree);
         this.ntManager = checkNotNull(ntManager);
         this.ntNames = checkNotNull(ntNames);
@@ -82,7 +84,8 @@ public class NodeTypeFilter implements F
 
     @Override
     public Filter create(String name, NodeState before, NodeState after) {
-        return new NodeTypeFilter(afterTree.getChild(name), ntManager, ntNames);
+        return new NodeTypeFilter(
+                beforeTree.getChild(name), afterTree.getChild(name), ntManager, ntNames);
     }
 
     //------------------------------------------------------------< private >---
@@ -95,8 +98,12 @@ public class NodeTypeFilter implements F
      *         parent node.
      */
     private boolean includeByType() {
+        ImmutableTree associatedParent = afterTree.exists()
+            ? afterTree
+            : beforeTree;
+
         for (String ntName : ntNames) {
-            if (ntManager.isNodeType(afterTree, ntName)) {
+            if (ntManager.isNodeType(associatedParent, ntName)) {
                 return true;
             }
         }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java Tue Nov 19 17:20:13 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.commons.PathUtils;
 import org.apache.jackrabbit.oak.core.ImmutableTree;
@@ -30,55 +34,58 @@ import org.apache.jackrabbit.oak.spi.sta
  * TODO Clarify: filter applies to parent
  */
 public class PathFilter implements Filter {
+    private final ImmutableTree beforeTree;
     private final ImmutableTree afterTree;
     private final String path;
     private final boolean deep;
 
-    public PathFilter(ImmutableTree afterTree, String path, boolean deep) {
-        this.afterTree = afterTree;
-        this.path = path;
+    public PathFilter(@Nonnull ImmutableTree beforeTree, @Nonnull ImmutableTree afterTree,
+            @Nonnull String path, boolean deep) {
+        this.beforeTree = checkNotNull(beforeTree);
+        this.afterTree = checkNotNull(afterTree);
+        this.path = checkNotNull(path);
         this.deep = deep;
     }
 
     @Override
     public boolean includeAdd(PropertyState after) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeChange(PropertyState before, PropertyState after) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeDelete(PropertyState before) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeAdd(String name, NodeState after) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeChange(String name, NodeState before, NodeState after) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeDelete(String name, NodeState before) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public boolean includeMove(String sourcePath, String destPath, NodeState moved) {
-        return includeByPath(afterTree.getPath());
+        return includeByPath();
     }
 
     @Override
     public Filter create(String name, NodeState before, NodeState after) {
-        if (includeChildren(PathUtils.concat(afterTree.getPath(), name))) {
-            return new PathFilter(afterTree.getChild(name), path, deep);
+        if (includeChildren(name)) {
+            return new PathFilter(beforeTree, afterTree.getChild(name), path, deep);
         } else {
             return null;
         }
@@ -86,7 +93,11 @@ public class PathFilter implements Filte
 
     //------------------------------------------------------------< private >---
 
-    private boolean includeByPath(String path) {
+    private boolean includeByPath() {
+        String path = afterTree.exists()
+            ? afterTree.getPath()
+            : beforeTree.getPath();
+
         boolean equalPaths = this.path.equals(path);
         if (!deep && !equalPaths) {
             return false;
@@ -98,12 +109,11 @@ public class PathFilter implements Filte
         return true;
     }
 
-    /**
-     * Determine whether the children of a {@code path} would be matched by this filter
-     * @param path  path whose children to test
-     * @return  {@code true} if the children of {@code path} could be matched by this filter
-     */
-    public boolean includeChildren(String path) {
+    private boolean includeChildren(String name) {
+        String path = afterTree.exists()
+            ? PathUtils.concat(afterTree.getPath(), name)
+            : PathUtils.concat(beforeTree.getPath(), name);
+
         return PathUtils.isAncestor(path, this.path) ||
                 path.equals((this.path)) ||
                 deep && PathUtils.isAncestor(this.path, path);

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=1543508&r1=1543507&r2=1543508&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 17:20:13 2013
@@ -34,10 +34,13 @@ import org.apache.jackrabbit.oak.spi.sta
  * TODO Clarify: filter applies to parent
  */
 public class UuidFilter implements Filter {
+    private final NodeState before;
     private final NodeState after;
     private final String[] uuids;
 
-    public UuidFilter(@Nonnull NodeState after, @Nonnull String[] uuids) {
+    public UuidFilter(@Nonnull NodeState before, @Nonnull NodeState after,
+            @Nonnull String[] uuids) {
+        this.before = checkNotNull(before);
         this.after = checkNotNull(after);
         this.uuids = checkNotNull(uuids);
     }
@@ -79,7 +82,8 @@ public class UuidFilter implements Filte
 
     @Override
     public Filter create(String name, NodeState before, NodeState after) {
-        return new UuidFilter(after, uuids);
+        // FIXME shouldn't we pass the respective child node states here!?
+        return new UuidFilter(before, after, uuids);
     }
 
     //------------------------------------------------------------< private >---
@@ -89,7 +93,11 @@ public class UuidFilter implements Filte
             return false;
         }
 
-        PropertyState uuidProperty = after.getProperty(JcrConstants.JCR_UUID);
+        NodeState associatedParent = after.exists()
+            ? after
+            : before;
+
+        PropertyState uuidProperty = associatedParent.getProperty(JcrConstants.JCR_UUID);
         if (uuidProperty == null) {
             return false;
         }