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/29 11:47:38 UTC

svn commit: r1546533 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/obse...

Author: mduerig
Date: Fri Nov 29 10:47:38 2013
New Revision: 1546533

URL: http://svn.apache.org/r1546533
Log:
OAK-1133: Observation listener PLUS
Pass permission provider to JcrFilterProvider instead of passing individual tree permission around

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/JcrFilterProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterProvider.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.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=1546533&r1=1546532&r2=1546533&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 Fri Nov 29 10:47:38 2013
@@ -34,7 +34,6 @@ import org.apache.jackrabbit.api.jmx.Eve
 import org.apache.jackrabbit.commons.iterator.EventIteratorAdapter;
 import org.apache.jackrabbit.commons.observation.ListenerTracker;
 import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.core.ImmutableRoot;
 import org.apache.jackrabbit.oak.core.ImmutableTree;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
@@ -43,8 +42,6 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observable;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
-import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
-import org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -63,7 +60,6 @@ public class ChangeProcessor implements 
     private static final Logger log = LoggerFactory.getLogger(ChangeProcessor.class);
 
     private final ContentSession contentSession;
-    private final PermissionProvider permissionProvider;
     private final NamePathMapper namePathMapper;
     private final ListenerTracker tracker;
     private final EventListener eventListener;
@@ -76,12 +72,10 @@ public class ChangeProcessor implements 
 
     public ChangeProcessor(
             ContentSession contentSession,
-            PermissionProvider permissionProvider,
             NamePathMapper namePathMapper,
             ListenerTracker tracker, FilterProvider filter) {
         checkArgument(contentSession instanceof Observable);
         this.contentSession = contentSession;
-        this.permissionProvider = permissionProvider;
         this.namePathMapper = namePathMapper;
         this.tracker = tracker;
         eventListener = tracker.getTrackedListener();
@@ -135,10 +129,9 @@ public class ChangeProcessor implements 
                 if (provider.includeCommit(contentSession.toString(), info)) {
                     ImmutableTree beforeTree = getTree(previousRoot, provider.getPath());
                     ImmutableTree afterTree = getTree(root, provider.getPath());
-                    TreePermission treePermission = getTreePermission(afterTree);
                     EventIterator<Event> events = new EventIterator<Event>(
                             beforeTree.getNodeState(), afterTree.getNodeState(), provider.getPath(),
-                            provider.getFilter(beforeTree, afterTree, treePermission),
+                            provider.getFilter(beforeTree, afterTree),
                             new JcrListener(beforeTree, afterTree, namePathMapper, info));
                     if (events.hasNext()) {
                         synchronized (this) {
@@ -159,7 +152,4 @@ public class ChangeProcessor implements 
         return new ImmutableRoot(nodeState).getTree(path);
     }
 
-    private TreePermission getTreePermission(Tree tree) {
-        return permissionProvider.getTreePermission(tree, TreePermission.EMPTY);
-    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrFilterProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrFilterProvider.java?rev=1546533&r1=1546532&r2=1546533&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrFilterProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrFilterProvider.java Fri Nov 29 10:47:38 2013
@@ -33,6 +33,7 @@ import java.util.List;
 
 import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
+import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.core.ImmutableTree;
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
@@ -45,6 +46,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.observation.filter.NodeTypeFilter;
 import org.apache.jackrabbit.oak.plugins.observation.filter.UuidFilter;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 
 /**
@@ -63,6 +65,7 @@ public class JcrFilterProvider implement
     private final String[] ntNames;
     private final boolean includeSessionLocal;
     private final boolean includeClusterExternal;
+    private final PermissionProvider permissionProvider;
 
     /**
      * Create a new instance of a {@code JcrFilterProvider} for certain criteria
@@ -78,11 +81,12 @@ public class JcrFilterProvider implement
      *                                  Exclude otherwise.
      * @param includeClusterExternal    include cluster external events if {@code true}.
      *                                  Exclude otherwise.
-     *
+     * @param permissionProvider        permission provider to evaluate events against
      * @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener, int, String, boolean, String[], String[], boolean) */
     public JcrFilterProvider(ReadOnlyNodeTypeManager ntManager, int eventTypes, String path,
             boolean deep, String[] uuids, String[] nodeTypeName,
-            boolean includeSessionLocal, boolean includeClusterExternal) {
+            boolean includeSessionLocal, boolean includeClusterExternal,
+            PermissionProvider permissionProvider) {
         this.ntManager = ntManager;
         this.eventTypes = eventTypes;
         this.path = path;
@@ -91,6 +95,7 @@ public class JcrFilterProvider implement
         this.ntNames = nodeTypeName;
         this.includeSessionLocal = includeSessionLocal;
         this.includeClusterExternal = includeClusterExternal;
+        this.permissionProvider = permissionProvider;
     }
 
     @Override
@@ -100,9 +105,7 @@ public class JcrFilterProvider implement
     }
 
     @Override
-    public Filter getFilter(ImmutableTree beforeTree, ImmutableTree afterTree,
-            TreePermission treePermission) {
-
+    public Filter getFilter(ImmutableTree beforeTree, ImmutableTree afterTree) {
         String relPath = PathUtils.relativize(afterTree.getPath(), path);
         String pathPattern = deep
             ? PathUtils.concat(relPath, STAR_STAR)
@@ -135,7 +138,7 @@ public class JcrFilterProvider implement
             }
         }
 
-        filters.add(new ACFilter(beforeTree, afterTree, treePermission));
+        filters.add(new ACFilter(beforeTree, afterTree, getTreePermission(afterTree)));
         return Filters.all(filters.toArray(new Filter[filters.size()]));
     }
 
@@ -159,6 +162,12 @@ public class JcrFilterProvider implement
 
     //------------------------------------------------------------< private >---
 
+    private TreePermission getTreePermission(Tree tree) {
+        return tree.isRoot()
+                ? permissionProvider.getTreePermission(tree, TreePermission.EMPTY)
+                : permissionProvider.getTreePermission(tree, getTreePermission(tree.getParent()));
+    }
+
     private static boolean isLocal(String sessionId, CommitInfo info) {
         return info != null && Objects.equal(info.getSessionId(), sessionId);
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterProvider.java?rev=1546533&r1=1546532&r2=1546533&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/FilterProvider.java Fri Nov 29 10:47:38 2013
@@ -25,7 +25,6 @@ import javax.annotation.Nonnull;
 import org.apache.jackrabbit.oak.core.ImmutableTree;
 import org.apache.jackrabbit.oak.plugins.observation.filter.EventGenerator.Filter;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
-import org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 
 /**
  * Instance of this class provide a {@link Filter} for observation
@@ -52,16 +51,14 @@ public interface FilterProvider {
      *
      * @param beforeTree  before state
      * @param afterTree   after state
-     * @param treePermission  tree permission of the corresponding tree of the reading session
      * @return new {@code Filter} instance
      */
     @Nonnull
-    Filter getFilter(@Nonnull ImmutableTree beforeTree, @Nonnull ImmutableTree afterTree,
-            @Nonnull TreePermission treePermission);
+    Filter getFilter(@Nonnull ImmutableTree beforeTree, @Nonnull ImmutableTree afterTree);
 
     /**
      * Path of the subtree to which the the filter returned by
-     * {@link #getFilter(ImmutableTree, ImmutableTree, TreePermission)} applies.
+     * {@link #getFilter(ImmutableTree, ImmutableTree)} applies.
      * @return path to which the filter applies.
      */
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1546533&r1=1546532&r2=1546533&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java Fri Nov 29 10:47:38 2013
@@ -113,7 +113,7 @@ public class ObservationManagerImpl impl
         boolean includeExternal = !(listener instanceof ExcludeExternal);
         String oakPath = namePathMapper.getOakPath(absPath);
         FilterProvider filterProvider = new JcrFilterProvider(ntMgr, eventTypes, oakPath, isDeep,
-                uuid, validateNodeTypeNames(nodeTypeName), !noLocal, includeExternal);
+                uuid, validateNodeTypeNames(nodeTypeName), !noLocal, includeExternal, permissionProvider);
         ChangeProcessor processor = processors.get(listener);
         if (processor == null) {
             log.info(OBSERVATION, "Registering event listener {} with filter {}", listener, filterProvider);
@@ -130,7 +130,7 @@ public class ObservationManagerImpl impl
                 }
             };
             processor = new ChangeProcessor(
-                    sessionDelegate.getContentSession(), permissionProvider, namePathMapper, tracker, filterProvider);
+                    sessionDelegate.getContentSession(), namePathMapper, tracker, filterProvider);
             processors.put(listener, processor);
             processor.start(whiteboard);
         } else {