Author: angela
Date: Wed Nov 11 16:23:20 2015
New Revision: 1713884

URL: http://svn.apache.org/viewvc?rev=1713884&view=rev
Log:
OAK-1268 : Add support for composite authorization setup (WIP)

Added:
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugTest.java
Modified:
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractTreePermission.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContext.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermission.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtil.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermission.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermissionTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/HiddenTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeAuthorizationConfiguration.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContextTest.java
    jackrabbit/oak/trunk/oak-run/pom.xml
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractTreePermission.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractTreePermission.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractTreePermission.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractTreePermission.java
 Wed Nov 11 16:23:20 2015
@@ -25,9 +25,9 @@ import org.apache.jackrabbit.oak.spi.sta
 
 abstract class AbstractTreePermission implements TreePermission {
 
-    private final Tree tree;
-    private final TreeType type;
-    private final CugPermissionProvider permissionProvider;
+    final Tree tree;
+    final TreeType type;
+    final CugPermissionProvider permissionProvider;
 
     AbstractTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, 
@Nonnull CugPermissionProvider permissionProvider) {
         this.tree = tree;
@@ -35,12 +35,6 @@ abstract class AbstractTreePermission im
         this.permissionProvider = permissionProvider;
     }
 
-    AbstractTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, 
@Nonnull AbstractTreePermission parent) {
-        this.tree = tree;
-        this.type = type;
-        this.permissionProvider = parent.permissionProvider;
-    }
-
     @Nonnull
     @Override
     public TreePermission getChildPermission(@Nonnull String childName, 
@Nonnull NodeState childState) {

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContext.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContext.java
 Wed Nov 11 16:23:20 2015
@@ -50,9 +50,9 @@ final class CugContext implements Contex
 
     @Override
     public boolean definesLocation(@Nonnull TreeLocation location) {
-        Tree tree = location.getTree();
-        if (tree != null && location.exists()) {
-            PropertyState p = location.getProperty();
+        PropertyState p = location.getProperty();
+        Tree tree = (p == null) ? location.getTree() : 
location.getParent().getTree();
+        if (tree != null) {
             return (p == null) ? definesTree(tree) : definesProperty(tree, p);
         } else {
             String path = location.getPath();

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
 Wed Nov 11 16:23:20 2015
@@ -95,6 +95,20 @@ class CugPermissionProvider implements A
         return getTreePermission(t, type, parentPermission);
     }
 
+    boolean isAllow(@Nonnull Tree cugTree) {
+        PropertyState princNamesState = 
cugTree.getProperty(REP_PRINCIPAL_NAMES);
+        if (princNamesState != null) {
+            for (String pName : princNamesState.getValue(Type.STRINGS)) {
+                for (String pN : principalNames) {
+                    if (pName.equals(pN)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
     //-------------------------------------------------< PermissionProvider 
>---
     @Override
     public void refresh() {
@@ -213,7 +227,7 @@ class CugPermissionProvider implements A
     @Override
     public long supportedPermissions(@Nonnull TreePermission treePermission, 
@Nullable PropertyState propertyState, long permissions) {
         long supported = permissions & Permissions.READ;
-        if (supported != Permissions.NO_PERMISSION && (treePermission 
instanceof CugTreePermission)) {
+        if (supported != Permissions.NO_PERMISSION && (treePermission 
instanceof CugTreePermission) && ((CugTreePermission) 
treePermission).isInCug()) {
             return supported;
         } else {
             return Permissions.NO_PERMISSION;
@@ -242,14 +256,14 @@ class CugPermissionProvider implements A
         if (TreeType.VERSION == type) {
             tp = createVersionStorePermission(immutableTree, type, 
parentPermission, parentIsCugPermission);
         } else {
-            if (parentIsCugPermission || 
isKnownSupportedPath(parentPermission)) {
-                tp = createCugPermission(immutableTree, type, 
parentPermission, true);
+            if (parentIsCugPermission) {
+                tp = new CugTreePermission(immutableTree, type, 
parentPermission, this);
             } else {
                 String path = immutableTree.getPath();
                 if (supportedPaths.includes(path)) {
-                    tp =  createCugPermission(immutableTree, type, 
parentPermission, true);
+                    tp =  new CugTreePermission(immutableTree, type, 
parentPermission, this);
                 } else if (supportedPaths.mayContainCug(path) || 
isJcrSystemPath(immutableTree)) {
-                    tp =  new EmptyCugTreePermission(immutableTree, type, 
this, false);
+                    tp =  new EmptyCugTreePermission(immutableTree, type, 
this);
                 } else {
                     tp = TreePermission.NO_RECOURSE;
                 }
@@ -263,22 +277,10 @@ class CugPermissionProvider implements A
         return JcrConstants.JCR_SYSTEM.equals(tree.getName());
     }
 
-    private static boolean isKnownSupportedPath(@Nonnull TreePermission 
parentPermission) {
-        if (parentPermission instanceof EmptyCugTreePermission) {
-           return ((EmptyCugTreePermission) 
parentPermission).isSupportedPath();
-        } else {
-            return false;
-        }
-    }
-
     private static boolean isRead(long permission) {
         return permission == Permissions.READ_NODE || permission == 
Permissions.READ_PROPERTY || permission == Permissions.READ;
     }
 
-    private static boolean hasCug(@Nonnull Tree tree) {
-        return tree.exists() && tree.hasChild(REP_CUG_POLICY);
-    }
-
     private static boolean isSupportedType(@Nonnull TreeType type) {
         return type == TreeType.DEFAULT || type == TreeType.VERSION;
     }
@@ -318,7 +320,7 @@ class CugPermissionProvider implements A
         if (!supportedPaths.includes(p)) {
             return null;
         }
-        if (hasCug(tree)) {
+        if (CugUtil.hasCug(tree)) {
             return tree;
         }
         String parentPath;
@@ -328,7 +330,7 @@ class CugPermissionProvider implements A
                 break;
             }
             tree = tree.getParent();
-            if (hasCug(tree)) {
+            if (CugUtil.hasCug(tree)) {
                 return tree;
             }
         }
@@ -342,7 +344,13 @@ class CugPermissionProvider implements A
             return false;
         }
         Tree cugRoot = getCugRoot(immutableTree, type);
-        return cugRoot != null && createCugPermission(cugRoot, type, null, 
true).canRead();
+        if (cugRoot != null) {
+            Tree cugTree = CugUtil.getCug(cugRoot);
+            if (cugTree != null) {
+                return isAllow(cugTree);
+            }
+        }
+        return false;
     }
 
     @Nonnull
@@ -360,46 +368,13 @@ class CugPermissionProvider implements A
         return tree;
     }
 
-    private boolean isAllow(@Nonnull Tree cugTree) {
-        PropertyState princNamesState = 
cugTree.getProperty(REP_PRINCIPAL_NAMES);
-        if (princNamesState != null) {
-            for (String pName : princNamesState.getValue(Type.STRINGS)) {
-                for (String pN : principalNames) {
-                    if (pName.equals(pN)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    @Nonnull
-    private TreePermission createCugPermission(@Nonnull Tree tree, @Nonnull 
TreeType type, @Nullable TreePermission parent, boolean isSupportedPath) {
-        TreePermission tp;
-
-        Tree cugTree = (hasCug(tree)) ? tree.getChild(REP_CUG_POLICY) : null;
-        if (cugTree != null && CugUtil.definesCug(cugTree)) {
-            // a new (possibly nested) cug starts off here
-            tp = new CugTreePermission(tree, type, isAllow(cugTree), this);
-        } else if (parent instanceof CugTreePermission) {
-            // still within the parents CUG
-            tp = new CugTreePermission(tree, type, (CugTreePermission) parent);
-        } else if (parent instanceof EmptyCugTreePermission) {
-            tp = new EmptyCugTreePermission(tree, type, 
(EmptyCugTreePermission) parent, isSupportedPath);
-        } else {
-            tp = new EmptyCugTreePermission(tree, type, this, isSupportedPath);
-        }
-        return tp;
-    }
-
     @Nonnull
     private TreePermission createVersionStorePermission(@Nonnull Tree tree, 
@Nonnull TreeType type, @Nonnull TreePermission parent, boolean 
parentIsCugPermission) {
         if (ReadOnlyVersionManager.isVersionStoreTree(tree)) {
             if (parentIsCugPermission) {
-                return createCugPermission(tree, type, parent, true);
+                return new CugTreePermission(tree, type, parent, this);
             } else {
-                return new EmptyCugTreePermission(tree, type,  this, false);
+                return new EmptyCugTreePermission(tree, type, this);
             }
         } else {
             Tree versionableTree = getVersionManager().getVersionable(tree, 
workspaceName);
@@ -410,22 +385,27 @@ class CugPermissionProvider implements A
             TreePermission tp;
             String path = versionableTree.getPath();
             if (parentIsCugPermission) {
-                boolean canRead = (hasCug(versionableTree)) ? 
createCugPermission(versionableTree, type, null, true).canRead() : 
parent.canRead();
-                tp = new CugTreePermission(tree, type, canRead, this);
+                CugTreePermission delegatee;
+                if (CugUtil.hasCug(versionableTree)) {
+                    delegatee = new CugTreePermission(versionableTree, type, 
parent, this);
+                } else {
+                    delegatee = (CugTreePermission) parent;
+                };
+                tp = new CugTreePermission(tree, type, parent, this, 
delegatee.isInCug(), delegatee.isAllow());
             } else if (supportedPaths.includes(path)) {
                 // look for cug in the hierarchy
                 Tree cugRoot = getCugRoot(versionableTree, 
typeProvider.getType(versionableTree));
                 if (cugRoot == null) {
                     // no cug present so far -> continue looking for cugs for 
frozen children
-                    tp = new EmptyCugTreePermission(tree, type, this, true);
+                    tp = new CugTreePermission(tree, type, parent, this, 
false, false);
                 } else {
                     // retrieve read-access from the cug and apply it to the
                     // tree permissions of the target tree located in the 
version storage
-                    boolean canRead = createCugPermission(cugRoot, type, null, 
true).canRead();
-                    tp = new CugTreePermission(tree, type, canRead, this);
+                    CugTreePermission delegatee = new 
CugTreePermission(cugRoot, type, parent, this);
+                    tp = new CugTreePermission(tree, type, parent, this, 
delegatee.isInCug(), delegatee.isAllow());
                 }
             } else  if (supportedPaths.mayContainCug(path)) {
-                tp = new EmptyCugTreePermission(tree, type, this, false);
+                tp = new EmptyCugTreePermission(tree, type, this);
             } else {
                 tp = TreePermission.NO_RECOURSE;
             }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermission.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermission.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermission.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermission.java
 Wed Nov 11 16:23:20 2015
@@ -22,34 +22,70 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.tree.TreeType;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 
 /**
- * {@code TreePermission} implementation for all items located with a CUG.
+ * {@code TreePermission} implementation for all tree located within one of the
+ * supported paths which may or may not contain a CUG.
  */
-final class CugTreePermission extends AbstractTreePermission {
+final class CugTreePermission extends AbstractTreePermission implements 
CugConstants {
 
-    private final boolean allow;
+    private final TreePermission parent;
+    private Boolean inCug;
+    private Boolean allow;
 
-    CugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, boolean 
allow, @Nonnull CugPermissionProvider permissionProvider) {
+    CugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, @Nonnull 
TreePermission parent,
+                      @Nonnull CugPermissionProvider permissionProvider) {
         super(tree, type, permissionProvider);
-        this.allow = allow;
+        this.parent = parent;
     }
 
-    CugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, @Nonnull 
CugTreePermission parent) {
-        super(tree, type, parent);
-        this.allow = parent.allow;
+    CugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, @Nonnull 
TreePermission parent,
+                      @Nonnull CugPermissionProvider permissionProvider, 
boolean inCug, boolean canRead) {
+        super(tree, type, permissionProvider);
+        this.parent = parent;
+        this.inCug = inCug;
+        this.allow = canRead;
+    }
+
+    boolean isInCug() {
+        if (inCug == null) {
+            loadCug();
+        }
+        return inCug;
+    }
+
+    boolean isAllow() {
+        if (allow == null) {
+            loadCug();
+        }
+        return allow;
+    }
+
+    private void loadCug() {
+        Tree cugTree = CugUtil.getCug(tree);
+        if (cugTree != null) {
+            inCug = true;
+            allow = permissionProvider.isAllow(cugTree);
+        } else if (parent instanceof CugTreePermission) {
+            inCug = ((CugTreePermission) parent).isInCug();
+            allow = ((CugTreePermission) parent).isAllow();
+        } else {
+            inCug = false;
+            allow = false;
+        }
     }
 
     //-----------------------------------------------------< TreePermission 
>---
 
     @Override
     public boolean canRead() {
-        return allow;
+        return isAllow();
     }
 
     @Override
     public boolean canRead(@Nonnull PropertyState property) {
-        return allow;
+        return isAllow();
     }
 
     @Override
@@ -59,16 +95,16 @@ final class CugTreePermission extends Ab
 
     @Override
     public boolean canReadProperties() {
-        return allow;
+        return isAllow();
     }
 
     @Override
     public boolean isGranted(long permissions) {
-        return allow && permissions == Permissions.READ_NODE;
+        return permissions == Permissions.READ_NODE && isAllow();
     }
 
     @Override
     public boolean isGranted(long permissions, @Nonnull PropertyState 
property) {
-        return allow && permissions == Permissions.READ_PROPERTY;
+        return permissions == Permissions.READ_PROPERTY && isAllow();
     }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtil.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtil.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtil.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtil.java
 Wed Nov 11 16:23:20 2015
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.spi.se
 
 import java.io.IOException;
 import java.io.InputStream;
+import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.RepositoryException;
@@ -41,6 +42,20 @@ final class CugUtil implements CugConsta
 
     private CugUtil(){}
 
+    public static boolean hasCug(@Nonnull Tree tree) {
+        return tree.exists() && tree.hasChild(REP_CUG_POLICY);
+    }
+
+    @CheckForNull
+    public static Tree getCug(@Nonnull Tree tree) {
+        Tree cugTree = (CugUtil.hasCug(tree)) ? tree.getChild(REP_CUG_POLICY) 
: null;
+        if (cugTree != null && 
NT_REP_CUG_POLICY.equals(TreeUtil.getPrimaryTypeName(cugTree))) {
+            return cugTree;
+        } else {
+            return null;
+        }
+    }
+
     public static boolean definesCug(@Nonnull Tree tree) {
         return tree.exists() && REP_CUG_POLICY.equals(tree.getName()) && 
NT_REP_CUG_POLICY.equals(TreeUtil.getPrimaryTypeName(tree));
     }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermission.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermission.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermission.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermission.java
 Wed Nov 11 16:23:20 2015
@@ -32,20 +32,8 @@ import org.apache.jackrabbit.oak.plugins
  */
 final class EmptyCugTreePermission extends AbstractTreePermission {
 
-    private final boolean isSupportedPath;
-
-    EmptyCugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, 
@Nonnull CugPermissionProvider permissionProvider, boolean isSupportedPath) {
+    EmptyCugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, 
@Nonnull CugPermissionProvider permissionProvider) {
         super(tree, type, permissionProvider);
-        this.isSupportedPath = isSupportedPath;
-    }
-
-    EmptyCugTreePermission(@Nonnull Tree tree, @Nonnull TreeType type, 
@Nonnull EmptyCugTreePermission parent, boolean isSupportedPath) {
-        super(tree, type, parent);
-        this.isSupportedPath = isSupportedPath;
-    }
-
-    boolean isSupportedPath() {
-        return isSupportedPath;
     }
 
     //-----------------------------------------------------< TreePermission 
>---

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 Wed Nov 11 16:23:20 2015
@@ -40,10 +40,13 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
 import org.apache.jackrabbit.oak.spi.security.authorization.cug.CugPolicy;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 
+import static org.junit.Assert.assertTrue;
+
 /**
  * Base class for CUG related test that setup the authorization configuration
  * to expose the CUG specific implementations of {@code AccessControlManager}
@@ -181,4 +184,12 @@ public class AbstractCugTest extends Abs
     ContentSession createTestSession2() throws Exception {
         return login(new SimpleCredentials(TEST_USER2_ID, 
TEST_USER2_ID.toCharArray()));
     }
+
+    static void assertCugPermission(@Nonnull TreePermission tp, boolean 
isSupportedPath) {
+        if (isSupportedPath) {
+            assertTrue(tp instanceof CugTreePermission);
+        } else {
+            assertTrue(tp instanceof EmptyCugTreePermission);
+        }
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
 Wed Nov 11 16:23:20 2015
@@ -133,6 +133,7 @@ public class CugContextTest extends Abst
         for (String path : nonExistingCug) {
             assertTrue(path, 
CugContext.INSTANCE.definesLocation(TreeLocation.create(root, path)));
             assertTrue(path, 
CugContext.INSTANCE.definesLocation(TreeLocation.create(root, path + "/" + 
CugConstants.REP_PRINCIPAL_NAMES)));
+            assertFalse(path, 
CugContext.INSTANCE.definesLocation(TreeLocation.create(root, path + "/" + 
JcrConstants.JCR_PRIMARYTYPE)));
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 Wed Nov 11 16:23:20 2015
@@ -497,7 +497,7 @@ public class CugPermissionProviderTest e
         assertTrue(rootTp instanceof EmptyCugTreePermission);
 
         TreePermission contentTp = 
cugPermProvider.getTreePermission(root.getTree(SUPPORTED_PATH), rootTp);
-        assertTrue(contentTp instanceof EmptyCugTreePermission);
+        assertTrue(contentTp instanceof CugTreePermission);
 
         TreePermission aTp = 
cugPermProvider.getTreePermission(root.getTree("/content/a"), contentTp);
         assertTrue(aTp instanceof CugTreePermission);
@@ -509,7 +509,7 @@ public class CugPermissionProviderTest e
         assertTrue(cTp instanceof CugTreePermission);
 
         TreePermission aaTp = 
cugPermProvider.getTreePermission(root.getTree("/content/aa"), contentTp);
-        assertTrue(aaTp instanceof EmptyCugTreePermission);
+        assertTrue(aaTp instanceof CugTreePermission);
 
         TreePermission bbTp = 
cugPermProvider.getTreePermission(root.getTree("/content/aa/bb"), aaTp);
         assertTrue(bbTp instanceof CugTreePermission);
@@ -521,7 +521,7 @@ public class CugPermissionProviderTest e
         Tree aaTree = root.getTree("/content/aa");
         new NodeUtil(aaTree).addChild(CugConstants.REP_CUG_POLICY, 
NT_OAK_UNSTRUCTURED);
         TreePermission aaTp2 = 
cugPermProvider.getTreePermission(root.getTree("/content/aa"), contentTp);
-        assertTrue(aaTp2 instanceof EmptyCugTreePermission);
+        assertTrue(aaTp2 instanceof CugTreePermission);
 
         TreePermission falseCugTp = 
cugPermProvider.getTreePermission(root.getTree("/content/aa/rep:cugPolicy"), 
aaTp2);
         assertNotSame(TreePermission.EMPTY, falseCugTp);

Added: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java?rev=1713884&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
 Wed Nov 11 16:23:20 2015
@@ -0,0 +1,104 @@
+/*
+ * 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.spi.security.authorization.cug.impl;
+
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.util.NodeUtil;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class CugUtilTest extends AbstractCugTest {
+
+    @Override
+    public void before() throws Exception {
+        super.before();
+
+        createCug(SUPPORTED_PATH, EveryonePrincipal.getInstance());
+    }
+
+    @Override
+    public void after() throws Exception {
+        try {
+            root.refresh();
+        } finally {
+            super.after();
+        }
+    }
+
+    @Test
+    public void testHasCug() throws Exception {
+        assertFalse(CugUtil.hasCug(root.getTree("/")));
+        assertFalse(CugUtil.hasCug(root.getTree(INVALID_PATH)));
+        assertFalse(CugUtil.hasCug(root.getTree(UNSUPPORTED_PATH)));
+        assertFalse(CugUtil.hasCug(root.getTree(SUPPORTED_PATH + "/subtree")));
+        assertFalse(CugUtil.hasCug(root.getTree(SUPPORTED_PATH2)));
+
+        assertTrue(CugUtil.hasCug(root.getTree(SUPPORTED_PATH)));
+
+        new NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).getTree();
+        assertTrue(CugUtil.hasCug(root.getTree(SUPPORTED_PATH2)));
+    }
+
+    @Test
+    public void testGetCug() throws Exception {
+        assertNull(CugUtil.getCug(root.getTree("/")));
+        assertNull(CugUtil.getCug(root.getTree(INVALID_PATH)));
+        assertNull(CugUtil.getCug(root.getTree(UNSUPPORTED_PATH)));
+        assertNull(CugUtil.getCug(root.getTree(SUPPORTED_PATH + "/subtree")));
+        assertNull(CugUtil.getCug(root.getTree(SUPPORTED_PATH2)));
+
+        assertNotNull(CugUtil.getCug(root.getTree(SUPPORTED_PATH)));
+
+        Tree invalid = new 
NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).getTree();
+        assertNull(CugUtil.getCug(invalid));
+    }
+
+    @Test
+    public void testDefinesCug() throws Exception {
+        
assertFalse(CugUtil.definesCug(root.getTree(PathUtils.concat(INVALID_PATH, 
REP_CUG_POLICY))));
+        
assertTrue(CugUtil.definesCug(root.getTree(PathUtils.concat(SUPPORTED_PATH, 
REP_CUG_POLICY))));
+
+        Tree invalid = new 
NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).getTree();
+        assertFalse(CugUtil.definesCug(invalid));
+    }
+
+    @Test
+    public void testIsSupportedPath() {
+        assertFalse(CugUtil.isSupportedPath(null, CUG_CONFIG));
+        assertFalse(CugUtil.isSupportedPath(UNSUPPORTED_PATH, CUG_CONFIG));
+
+        assertTrue(CugUtil.isSupportedPath(SUPPORTED_PATH, CUG_CONFIG));
+        assertTrue(CugUtil.isSupportedPath(SUPPORTED_PATH2, CUG_CONFIG));
+        assertTrue(CugUtil.isSupportedPath(SUPPORTED_PATH + "/child", 
CUG_CONFIG));
+        assertTrue(CugUtil.isSupportedPath(SUPPORTED_PATH2 + "/child", 
CUG_CONFIG));
+    }
+
+    @Test
+    public void testGetImportBehavior() {
+        assertSame(ImportBehavior.ABORT, 
CugUtil.getImportBehavior(ConfigurationParameters.EMPTY));
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermissionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermissionTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermissionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/EmptyCugTreePermissionTest.java
 Wed Nov 11 16:23:20 2015
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authorization.cug.impl;
 
-import javax.annotation.Nonnull;
-
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -36,7 +34,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.util.Text;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
@@ -59,36 +56,29 @@ public class EmptyCugTreePermissionTest
                 getTestUser().getPrincipal(), EveryonePrincipal.getInstance());
         Root readOnlyRoot = RootFactory.createReadOnlyRoot(root);
         Tree t = readOnlyRoot.getTree("/");
-        tp = new EmptyCugTreePermission(t, TreeType.DEFAULT, pp, false);
+        tp = new EmptyCugTreePermission(t, TreeType.DEFAULT, pp);
         rootState = ((AbstractTree) t).getNodeState();
     }
 
-    private static void assertEmptyCugPermission(@Nonnull TreePermission tp, 
boolean isSupportedPath, @Nonnull String path) {
-        assertTrue(tp instanceof EmptyCugTreePermission);
-
-        EmptyCugTreePermission etp = (EmptyCugTreePermission) tp;
-        assertEquals(isSupportedPath, etp.isSupportedPath());
-    }
-
     @Test
     public void testRootPermission() throws Exception {
-        assertEmptyCugPermission(tp, false, "/");
+        assertCugPermission(tp, false);
 
         TreePermission rootTp = pp.getTreePermission(root.getTree("/"), 
TreePermission.EMPTY);
-        assertEmptyCugPermission(rootTp, false, "/");
+        assertCugPermission(rootTp, false);
     }
 
     @Test
     public void testJcrSystemPermissions() throws Exception {
         NodeState system = rootState.getChildNode(JcrConstants.JCR_SYSTEM);
         TreePermission systemTp = 
tp.getChildPermission(JcrConstants.JCR_SYSTEM, system);
-        assertEmptyCugPermission(systemTp, false, "/jcr:system");
-        
assertEmptyCugPermission(pp.getTreePermission(root.getTree("/jcr:system"), tp), 
false, "/jcr:system");
+        assertCugPermission(systemTp, false);
+        assertCugPermission(pp.getTreePermission(root.getTree("/jcr:system"), 
tp), false);
 
         NodeState versionStore = 
system.getChildNode(VersionConstants.JCR_VERSIONSTORAGE);
         TreePermission versionStoreTp = 
systemTp.getChildPermission(VersionConstants.JCR_VERSIONSTORAGE, versionStore);
-        assertEmptyCugPermission(versionStoreTp, false, 
VersionConstants.VERSION_STORE_PATH);
-        
assertEmptyCugPermission(pp.getTreePermission(root.getTree(VersionConstants.VERSION_STORE_PATH),
 systemTp), false, VersionConstants.VERSION_STORE_PATH);
+        assertCugPermission(versionStoreTp, false);
+        
assertCugPermission(pp.getTreePermission(root.getTree(VersionConstants.VERSION_STORE_PATH),
 systemTp), false);
 
         NodeState nodeTypes = 
system.getChildNode(NodeTypeConstants.JCR_NODE_TYPES);
         TreePermission nodeTypesTp = 
systemTp.getChildPermission(NodeTypeConstants.JCR_NODE_TYPES, nodeTypes);
@@ -100,13 +90,17 @@ public class EmptyCugTreePermissionTest
         String name = Text.getName(SUPPORTED_PATH2);
         NodeState ns = rootState.getChildNode(name);
         TreePermission child = tp.getChildPermission(name, ns);
-        assertEmptyCugPermission(child, true, SUPPORTED_PATH2);
+        assertCugPermission(child, true);
+        assertFalse(((CugTreePermission) child).isInCug());
 
         name = Text.getName(SUPPORTED_PATH);
         ns = rootState.getChildNode(name);
         child = tp.getChildPermission(name, ns);
-        assertFalse(child instanceof EmptyCugTreePermission);
-        assertTrue(child instanceof CugTreePermission);
+        assertCugPermission(child, true);
+        assertTrue(((CugTreePermission) child).isInCug());
+        TreePermission subtree = child.getChildPermission("subtree", 
ns.getChildNode("subtree"));
+        assertCugPermission(subtree, true);
+        assertTrue(((CugTreePermission) subtree).isInCug());
 
         name = Text.getName(UNSUPPORTED_PATH);
         ns = rootState.getChildNode(name);

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/HiddenTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/HiddenTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/HiddenTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/HiddenTest.java
 Wed Nov 11 16:23:20 2015
@@ -86,7 +86,7 @@ public class HiddenTest extends Abstract
         Tree t = readOnlyRoot.getTree("/");
         TreePermission tp = pp.getTreePermission(t, TreePermission.EMPTY);
         for (String name : PathUtils.elements(hiddenTree.getPath())) {
-            assertTrue(tp instanceof EmptyCugTreePermission);
+            assertCugPermission(tp, true);
             t = t.getChild(name);
             tp = pp.getTreePermission(t, tp);
         }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
 Wed Nov 11 16:23:20 2015
@@ -303,7 +303,7 @@ public class VersionTest extends Abstrac
             if (JCR_SYSTEM.equals(segm) || 
ReadOnlyVersionManager.isVersionStoreTree(t)) {
                 assertTrue(t.getPath(), tp instanceof EmptyCugTreePermission);
             } else {
-                assertTrue(t.getPath(), tp instanceof EmptyCugTreePermission);
+                assertTrue(t.getPath(), tp instanceof CugTreePermission);
             }
         }
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
 Wed Nov 11 16:23:20 2015
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.securi
 
 import javax.annotation.Nonnull;
 
+import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
@@ -25,10 +26,13 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import org.apache.jackrabbit.oak.util.TreeUtil;
-import org.apache.jackrabbit.util.Text;
 
 final class AuthorizationContext implements Context, AccessControlConstants, 
PermissionConstants {
 
+    private static final String[] NODE_NAMES = POLICY_NODE_NAMES.toArray(new 
String[POLICY_NODE_NAMES.size()]);
+    private static final String[] PROPERTY_NAMES = 
ACE_PROPERTY_NAMES.toArray(new String[ACE_PROPERTY_NAMES.size()]);
+    private static final String[] NT_NAMES = 
Iterables.toArray(Iterables.concat(AC_NODETYPE_NAMES, 
PERMISSION_NODETYPE_NAMES), String.class);
+
     private static final Context INSTANCE = new AuthorizationContext();
 
     private AuthorizationContext() {
@@ -47,7 +51,7 @@ final class AuthorizationContext impleme
     @Override
     public boolean definesContextRoot(@Nonnull Tree tree) {
         String name = tree.getName();
-        if (POLICY_NODE_NAMES.contains(name)) {
+        if (isNodeName(name)) {
             return NT_REP_ACL.equals(TreeUtil.getPrimaryTypeName(tree));
         } else {
             return REP_PERMISSION_STORE.equals(name);
@@ -57,20 +61,47 @@ final class AuthorizationContext impleme
     @Override
     public boolean definesTree(@Nonnull Tree tree) {
         String ntName = TreeUtil.getPrimaryTypeName(tree);
-        return AC_NODETYPE_NAMES.contains(ntName) || 
PERMISSION_NODETYPE_NAMES.contains(ntName);
+        return isNtName(ntName);
     }
 
     @Override
     public boolean definesLocation(@Nonnull TreeLocation location) {
-        Tree tree = location.getTree();
-        if (tree != null && location.exists()) {
-            PropertyState p = location.getProperty();
+        PropertyState p = location.getProperty();
+        Tree tree = (p == null) ? location.getTree() : 
location.getParent().getTree();
+        if (tree != null) {
             return (p == null) ? definesTree(tree) : definesProperty(tree, p);
         } else {
-            String path = location.getPath();
-            String name = Text.getName(location.getPath());
-            return POLICY_NODE_NAMES.contains(name) || 
ACE_PROPERTY_NAMES.contains(name) || path.startsWith(PERMISSIONS_STORE_PATH);
+            return isItemName(location.getName()) || 
location.getPath().startsWith(PERMISSIONS_STORE_PATH);
+        }
+    }
+
+    private static boolean isNodeName(@Nonnull String name) {
+        for (String n : NODE_NAMES) {
+            if (n.equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean isItemName(@Nonnull String name) {
+        if (isNodeName(name)) {
+            return true;
+        }
+        for (String n : PROPERTY_NAMES) {
+            if (n.equals(name)) {
+                return true;
+            }
         }
+        return false;
     }
 
+    private static boolean isNtName(@Nonnull String name) {
+        for (String n : NT_NAMES) {
+            if (n.equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeAuthorizationConfiguration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeAuthorizationConfiguration.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeAuthorizationConfiguration.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeAuthorizationConfiguration.java
 Wed Nov 11 16:23:20 2015
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.security.authorization.composite;
 
 import java.security.Principal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import javax.annotation.Nonnull;
@@ -70,14 +71,19 @@ public class CompositeAuthorizationConfi
     @Nonnull
     @Override
     public RestrictionProvider getRestrictionProvider() {
-        return CompositeRestrictionProvider.newInstance(
-                Lists.transform(getConfigurations(),
-                        new Function<AuthorizationConfiguration, 
RestrictionProvider>() {
-                            @Override
-                            public RestrictionProvider 
apply(AuthorizationConfiguration authorizationConfiguration) {
-                                return 
authorizationConfiguration.getRestrictionProvider();
-                            }
-                        }));
+        List<AuthorizationConfiguration> configurations = getConfigurations();
+        switch (configurations.size()) {
+            case 0: return RestrictionProvider.EMPTY;
+            case 1: return configurations.get(0).getRestrictionProvider();
+            default:
+                List<RestrictionProvider> rps = new 
ArrayList<RestrictionProvider>(configurations.size());
+                for (AuthorizationConfiguration c : configurations) {
+                    if (RestrictionProvider.EMPTY != c) {
+                        rps.add(c.getRestrictionProvider());
+                    }
+                }
+                return CompositeRestrictionProvider.newInstance(rps);
+        }
     }
 
     @Nonnull
@@ -90,7 +96,7 @@ public class CompositeAuthorizationConfi
             case 0: throw new IllegalStateException();
             case 1: return configurations.get(0).getPermissionProvider(root, 
workspaceName, principals);
             default:
-                List<AggregatedPermissionProvider> aggrPermissionProviders = 
Lists.newArrayListWithCapacity(configurations.size());
+                List<AggregatedPermissionProvider> aggrPermissionProviders = 
new ArrayList(configurations.size());
                 for (AuthorizationConfiguration conf : configurations) {
                     PermissionProvider pProvider = 
conf.getPermissionProvider(root, workspaceName, principals);
                     if (pProvider instanceof AggregatedPermissionProvider) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
 Wed Nov 11 16:23:20 2015
@@ -105,12 +105,13 @@ final class CompositeTreePermission impl
                 for (int i = 0, j = 0; i < parentPermission.providers.length; 
i++) {
                     parent = parentPermission.treePermissions[i];
                     if (isValid(parent)) {
-                        TreePermission tp = 
parent.getChildPermission(childName, childState);
+                        AggregatedPermissionProvider provider = 
parentPermission.providers[i];
+                        TreePermission tp = provider.getTreePermission(tree, 
type, parent);
                         if (!isValid(tp)) {
                             cnt++;
                         }
                         tps[j] = tp;
-                        pvds[j] = parentPermission.providers[i];
+                        pvds[j] = provider;
                         j++;
                     }
                 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProvider.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProvider.java
 Wed Nov 11 16:23:20 2015
@@ -31,7 +31,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.security.AccessControlException;
 
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import org.apache.jackrabbit.oak.api.Tree;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
@@ -42,14 +41,14 @@ import org.apache.jackrabbit.oak.spi.sec
  */
 public final class CompositeRestrictionProvider implements RestrictionProvider 
{
 
-    private final Collection<? extends RestrictionProvider> providers;
+    private final RestrictionProvider[] providers;
 
     private CompositeRestrictionProvider(@Nonnull Collection<? extends 
RestrictionProvider> providers) {
-        this.providers = ImmutableSet.copyOf(providers);
+        this.providers = providers.toArray(new 
RestrictionProvider[providers.size()]);
     }
 
     public static RestrictionProvider newInstance(@Nonnull 
RestrictionProvider... providers) {
-        return newInstance(Arrays.<RestrictionProvider>asList(providers));
+        return newInstance(Arrays.asList(providers));
     }
 
     public static RestrictionProvider newInstance(@Nonnull Collection<? 
extends RestrictionProvider> providers) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContextTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContextTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContextTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContextTest.java
 Wed Nov 11 16:23:20 2015
@@ -18,14 +18,22 @@ package org.apache.jackrabbit.oak.securi
 
 import java.util.List;
 
+import javax.annotation.Nullable;
+import javax.jcr.RepositoryException;
 import javax.jcr.security.AccessControlList;
 import javax.jcr.security.AccessControlManager;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import org.apache.jackrabbit.JcrConstants;
 import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
+import org.apache.jackrabbit.oak.spi.security.Context;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.junit.Test;
@@ -36,6 +44,25 @@ import static org.junit.Assert.assertTru
 
 public class AuthorizationContextTest extends AbstractSecurityTest {
 
+    @Override
+    public void after() throws Exception {
+        try {
+            root.refresh();
+        } finally {
+            super.after();
+        }
+    }
+
+    private void createAcl(@Nullable String path, String... privilegeNames) 
throws RepositoryException {
+        AccessControlManager acMgr = getAccessControlManager(root);
+
+        AccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, 
path);
+        assertNotNull(acl);
+
+        acl.addAccessControlEntry(EveryonePrincipal.getInstance(), 
privilegesFromNames(privilegeNames));
+        acMgr.setPolicy(path, acl);
+    }
+
     /**
      * @see <a 
href="https://issues.apache.org/jira/browse/OAK-2740";>OAK-2740</a>
      */
@@ -53,49 +80,25 @@ public class AuthorizationContextTest ex
 
     @Test
     public void testPolicyDefinesContextRoot() throws Exception {
-        AccessControlManager acMgr = getAccessControlManager(root);
-
-        AccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, 
"/");
-        assertNotNull(acl);
-
-        acl.addAccessControlEntry(EveryonePrincipal.getInstance(), 
privilegesFromNames(PrivilegeConstants.JCR_READ));
-        acMgr.setPolicy("/", acl);
+        createAcl("/", PrivilegeConstants.JCR_READ);
 
         Tree aclTree = 
root.getTree("/").getChild(AccessControlConstants.REP_POLICY);
         assertTrue(aclTree.exists());
         
assertTrue(AuthorizationContext.getInstance().definesContextRoot(aclTree));
-
-        // revert changes
-        root.refresh();
     }
 
     @Test
     public void testRepoPolicyDefinesContextRoot() throws Exception {
-        AccessControlManager acMgr = getAccessControlManager(root);
-
-        AccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, 
null);
-        assertNotNull(acl);
-
-        acl.addAccessControlEntry(EveryonePrincipal.getInstance(), 
privilegesFromNames(PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT));
-        acMgr.setPolicy(null, acl);
+        createAcl(null, PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT);
 
         Tree aclTree = 
root.getTree("/").getChild(AccessControlConstants.REP_REPO_POLICY);
         assertTrue(aclTree.exists());
         
assertTrue(AuthorizationContext.getInstance().definesContextRoot(aclTree));
-
-        // revert changes
-        root.refresh();
     }
 
     @Test
     public void testAceDefinesContextRoot() throws Exception {
-        AccessControlManager acMgr = getAccessControlManager(root);
-
-        AccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, 
"/");
-        assertNotNull(acl);
-
-        acl.addAccessControlEntry(EveryonePrincipal.getInstance(), 
privilegesFromNames(PrivilegeConstants.JCR_READ));
-        acMgr.setPolicy("/", acl);
+        createAcl("/", PrivilegeConstants.JCR_READ);
 
         Tree aclTree = 
root.getTree("/").getChild(AccessControlConstants.REP_POLICY);
         assertTrue(aclTree.exists());
@@ -103,9 +106,39 @@ public class AuthorizationContextTest ex
         for (Tree child : aclTree.getChildren()) {
             
assertFalse(AuthorizationContext.getInstance().definesContextRoot(child));
         }
+    }
+
+    @Test
+    public void testLocation() throws Exception {
+        createAcl("/", PrivilegeConstants.JCR_READ);
+
+        Context ctx = AuthorizationContext.getInstance();
 
-        // revert changes
-        root.refresh();
+        String policyPath = "/rep:policy";
+        assertTrue(ctx.definesLocation(TreeLocation.create(root, policyPath + 
"/allow")));
+        assertTrue(ctx.definesLocation(TreeLocation.create(root, policyPath + 
"/allow/" + AccessControlConstants.REP_PRINCIPAL_NAME)));
+        assertTrue(ctx.definesLocation(TreeLocation.create(root, policyPath + 
"/allow/" + AccessControlConstants.REP_PRIVILEGES)));
+
+        List<String> existingRegular = ImmutableList.of(
+                "/",
+                "/jcr:system"
+        );
+        for (String path : existingRegular) {
+            assertFalse(path, ctx.definesLocation(TreeLocation.create(root, 
path)));
+            assertFalse(path, ctx.definesLocation(TreeLocation.create(root, 
PathUtils.concat(path, JcrConstants.JCR_PRIMARYTYPE))));
+        }
+
+        List<String> nonExistingItem = ImmutableList.of(
+                '/' + AccessControlConstants.REP_REPO_POLICY,
+                "/content/" + AccessControlConstants.REP_POLICY,
+                "/content/" + AccessControlConstants.REP_PRIVILEGES,
+                "/content/" + AccessControlConstants.REP_REPO_POLICY,
+                "/jcr:system/" + AccessControlConstants.REP_POLICY,
+                PermissionConstants.PERMISSIONS_STORE_PATH + "/nonexisting");
+        for (String path : nonExistingItem) {
+            assertTrue(path, ctx.definesLocation(TreeLocation.create(root, 
path)));
+            assertTrue(path, ctx.definesLocation(TreeLocation.create(root, 
PathUtils.concat(path, AccessControlConstants.REP_PRIVILEGES))));
+        }
     }
 
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-run/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/pom.xml?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-run/pom.xml Wed Nov 11 16:23:20 2015
@@ -240,11 +240,16 @@
       <artifactId>oak-http</artifactId>
       <version>${project.version}</version>
     </dependency>
-      <dependency>
+    <dependency>
         <groupId>org.apache.jackrabbit</groupId>
         <artifactId>oak-remote</artifactId>
         <version>${project.version}</version>
-      </dependency>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-authorization-cug</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.jackrabbit</groupId>
       <artifactId>oak-lucene</artifactId>

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Wed Nov 11 16:23:20 2015
@@ -119,7 +119,12 @@ public class BenchmarkRunner {
                 .withOptionalArg().ofType(Integer.class).defaultsTo(10000);
         OptionSpec<Boolean> setScope = parser.accepts("setScope", "Whether to 
use include setScope in the user query.")
                         .withOptionalArg().ofType(Boolean.class)
-                        .defaultsTo(Boolean.FALSE);
+                .defaultsTo(Boolean.FALSE);
+        OptionSpec<Boolean> reverseOrder = parser.accepts("reverseOrder", 
"Invert order of configurations in composite setup.")
+                .withOptionalArg().ofType(Boolean.class)
+                .defaultsTo(Boolean.FALSE);
+        OptionSpec<String> supportedPaths = parser.accepts("supportedPaths", 
"Supported paths in composite setup.")
+                
.withOptionalArg().ofType(String.class).withValuesSeparatedBy(',');
         OptionSpec<String> nonOption = parser.nonOptions();
         OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show 
help").forHelp();
         OptionSet options = parser.parse(args);
@@ -233,7 +238,17 @@ public class BenchmarkRunner {
                     report.value(options)),
             new CompositeAuthorizationTest(
                         runAsAdmin.value(options),
-                        itemsToRead.value(options)), // TODO: is currently the 
no of configurations (hack)
+                        itemsToRead.value(options)), // NOTE: this is 
currently the no of configurations
+            new CugTest(runAsAdmin.value(options),
+                        itemsToRead.value(options),
+                        randomUser.value(options),
+                        supportedPaths.values(options),
+                        reverseOrder.value(options)),
+            new CugOakTest(runAsAdmin.value(options),
+                        itemsToRead.value(options),
+                        randomUser.value(options),
+                        supportedPaths.values(options),
+                        reverseOrder.value(options)),
             new ConcurrentReadDeepTreeTest(
                     runAsAdmin.value(options),
                     itemsToRead.value(options),

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java?rev=1713884&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
 Wed Nov 11 16:23:20 2015
@@ -0,0 +1,137 @@
+/*
+ * 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.benchmark;
+
+import java.security.PrivilegedAction;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Nonnull;
+import javax.jcr.Credentials;
+import javax.jcr.GuestCredentials;
+import javax.jcr.Repository;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
+
+/**
+ * Test the effect of multiple authorization configurations on the general read
+ * operations.
+ *
+ * TODO: setup configured number of cugs.
+ */
+public class CugOakTest extends CugTest {
+
+    private ContentRepository contentRepository;
+    private ContentSession cs;
+    private Subject subject;
+
+    protected CugOakTest(boolean runAsAdmin, int itemsToRead, boolean 
singleSession, @Nonnull List<String> supportedPaths, boolean reverseOrder) {
+        super(runAsAdmin, itemsToRead, singleSession, supportedPaths, 
reverseOrder);
+    }
+
+    @Override
+    protected Repository[] createRepository(RepositoryFixture fixture) throws 
Exception {
+        if (fixture instanceof OakRepositoryFixture) {
+            return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
+                @Override
+                public Jcr customize(Oak oak) {
+                    Jcr jcr = new Jcr(oak).with(createSecurityProvider());
+                    contentRepository = jcr.createContentRepository();
+                    return jcr;
+                }
+            });
+        } else {
+            throw new IllegalArgumentException("Fixture " + fixture + " not 
supported for this benchmark.");
+        }
+    }
+
+    @Override
+    protected void beforeSuite() throws Exception {
+        super.beforeSuite();
+        Credentials creds = (runAsAdmin) ? getCredentials() : new 
GuestCredentials();
+        cs = contentRepository.login(creds, null);
+        subject = new Subject(true, cs.getAuthInfo().getPrincipals(), 
Collections.emptySet(), Collections.emptySet());
+    }
+
+    @Override
+    protected void afterSuite() throws Exception {
+        super.afterSuite();
+        cs.close();
+    }
+
+    @Override
+    protected void runTest() throws Exception {
+        boolean logout = false;
+        ContentSession readSession;
+        if (singleSession) {
+            readSession = cs;
+        } else {
+            readSession = Subject.doAs(subject, new 
PrivilegedAction<ContentSession>() {
+                @Override
+                public ContentSession run() {
+                    try {
+                        return contentRepository.login(null, null);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            });
+            logout = true;
+        }
+        Root root = readSession.getLatestRoot();
+        try {
+            int nodeCnt = 0;
+            int propertyCnt = 0;
+            int noAccess = 0;
+            int size = allPaths.size();
+            long start = System.currentTimeMillis();
+            for (int i = 0; i < itemsToRead; i++) {
+                double rand = size * Math.random();
+                int index = (int) Math.floor(rand);
+                String path = allPaths.get(index);
+                TreeLocation treeLocation = TreeLocation.create(root, path);
+                if (treeLocation.exists()) {
+                    PropertyState ps = treeLocation.getProperty();
+                    if (ps != null) {
+                        propertyCnt++;
+                    } else {
+                        nodeCnt++;
+                    }
+                } else {
+                    noAccess++;
+                }
+            }
+            long end = System.currentTimeMillis();
+            if (doReport) {
+                System.out.println("ContentSession " + 
cs.getAuthInfo().getUserID() + " reading " + (itemsToRead - noAccess) + " 
(Tree: " + nodeCnt + "; PropertyState: " + propertyCnt + ") completed in " + 
(end - start));
+            }
+        } finally {
+            if (logout) {
+                readSession.close();
+            }
+        }
+    }
+}
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugTest.java?rev=1713884&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CugTest.java
 Wed Nov 11 16:23:20 2015
@@ -0,0 +1,100 @@
+/*
+ * 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.benchmark;
+
+import java.util.List;
+import javax.annotation.Nonnull;
+import javax.jcr.Repository;
+
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.cug.impl.CugConfiguration;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Test the effect of multiple authorization configurations on the general read
+ * operations.
+ *
+ * TODO: setup configured number of cugs.
+ */
+public class CugTest extends ReadDeepTreeTest {
+
+    private final ConfigurationParameters params;
+    private final boolean reverseOrder;
+
+    protected CugTest(boolean runAsAdmin, int itemsToRead, boolean 
singleSession, @Nonnull List<String> supportedPaths, boolean reverseOrder) {
+        super(runAsAdmin, itemsToRead, false, singleSession);
+        this.params = 
ConfigurationParameters.of(AuthorizationConfiguration.NAME, 
ConfigurationParameters.of(
+                    "cugSupportedPaths", supportedPaths.toArray(new 
String[supportedPaths.size()]),
+                    "cugEnabled", true));
+        this.reverseOrder = reverseOrder;
+    }
+
+    @Override
+    protected Repository[] createRepository(RepositoryFixture fixture) throws 
Exception {
+        if (fixture instanceof OakRepositoryFixture) {
+            return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
+                @Override
+                public Jcr customize(Oak oak) {
+                    return new Jcr(oak).with(createSecurityProvider());
+                }
+            });
+        } else {
+            throw new IllegalArgumentException("Fixture " + fixture + " not 
supported for this benchmark.");
+        }
+    }
+
+    @Override
+    protected String getImportFileName() {
+        return "deepTree_everyone.xml";
+    }
+
+    @Override
+    protected String getTestNodeName() {
+        return "CugTest";
+    }
+
+    protected SecurityProvider createSecurityProvider() {
+        return new TmpSecurityProvider(params, reverseOrder);
+    }
+
+    private static final class TmpSecurityProvider extends 
SecurityProviderImpl {
+
+        private TmpSecurityProvider(@Nonnull ConfigurationParameters params, 
boolean reverseOrder) {
+            super(params);
+
+            AuthorizationConfiguration authorizationConfiguration = 
getConfiguration(AuthorizationConfiguration.class);
+            AuthorizationConfiguration defaultAuthorization = 
checkNotNull(((CompositeAuthorizationConfiguration) 
authorizationConfiguration).getDefaultConfig());
+            if (reverseOrder) {
+                bindAuthorizationConfiguration(defaultAuthorization);
+                bindAuthorizationConfiguration(new CugConfiguration(this));
+            } else {
+                bindAuthorizationConfiguration(new CugConfiguration(this));
+                bindAuthorizationConfiguration(defaultAuthorization);
+            }
+        }
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java?rev=1713884&r1=1713883&r2=1713884&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java
 Wed Nov 11 16:23:20 2015
@@ -69,7 +69,7 @@ public class ReadDeepTreeTest extends Ab
         Node rn = adminSession.getRootNode();
         allPaths.clear();
 
-        String testNodeName = getClass().getSimpleName() + TEST_ID;
+        String testNodeName = getTestNodeName();
         long start = System.currentTimeMillis();
         if (!rn.hasNode(testNodeName)) {
             testRoot = adminSession.getRootNode().addNode(testNodeName, 
"nt:unstructured");
@@ -101,6 +101,10 @@ public class ReadDeepTreeTest extends Ab
         return "deepTree.xml";
     }
 
+    protected String getTestNodeName() {
+        return getClass().getSimpleName() + TEST_ID;
+    }
+
     protected void visitingNode(Node node, int i) throws RepositoryException {
         allPaths.add(node.getPath());
     }


Reply via email to