Author: angela
Date: Tue Apr 30 08:36:03 2019
New Revision: 1858410

URL: http://svn.apache.org/viewvc?rev=1858410&view=rev
Log:
OAK-8269 : Improve readability of CompositePermissionProvider and 
CompositeTreePermission

Added:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderAnd.java
      - copied, changed from r1858013, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderOr.java
      - copied, changed from r1858013, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java
   (with props)
Modified:
    
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/CompositePermissionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/AbstractCompositeProviderTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderCustomMixTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderGetTreePermissionTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderSupportedTest.java

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=1858410&r1=1858409&r2=1858410&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
 Tue Apr 30 08:36:03 2019
@@ -186,7 +186,7 @@ public class CompositeAuthorizationConfi
                         pp = aggrPermissionProviders.get(0);
                         break;
                     default :
-                        pp = new CompositePermissionProvider(root, 
aggrPermissionProviders, getContext(), compositionType, getRootProvider(), 
getTreeProvider());
+                        pp = CompositePermissionProvider.create(root, 
aggrPermissionProviders, getContext(), compositionType, getRootProvider(), 
getTreeProvider());
                 }
                 return pp;
         }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java?rev=1858410&r1=1858409&r2=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 Tue Apr 30 08:36:03 2019
@@ -16,9 +16,6 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.composite;
 
-import java.util.List;
-import java.util.Set;
-import java.util.function.Function;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -40,7 +37,8 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.AND;
+import java.util.List;
+import java.util.function.Function;
 
 /**
  * Permission provider implementation that aggregates a list of different
@@ -49,12 +47,11 @@ import static org.apache.jackrabbit.oak.
  * {@link 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider}
  * interface.
  */
-class CompositePermissionProvider implements AggregatedPermissionProvider {
+abstract class CompositePermissionProvider implements 
AggregatedPermissionProvider {
 
     private final Root root;
     private final AggregatedPermissionProvider[] pps;
     private final Context ctx;
-    private final CompositionType compositionType;
     private final RootProvider rootProvider;
     private final TreeProvider treeProvider;
 
@@ -65,99 +62,59 @@ class CompositePermissionProvider implem
     private TreeTypeProvider typeProvider;
 
     CompositePermissionProvider(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
-                                @NotNull Context acContext, @NotNull 
CompositionType compositionType,
-                                @NotNull RootProvider rootProvider, @NotNull 
TreeProvider treeProvider) {
+                                @NotNull Context acContext, @NotNull 
RootProvider rootProvider, @NotNull TreeProvider treeProvider) {
         this.root = root;
         this.pps = pps.toArray(new AggregatedPermissionProvider[0]);
         this.ctx = acContext;
-        this.compositionType = compositionType;
         this.rootProvider = rootProvider;
         this.treeProvider = treeProvider;
 
-        repositoryPermission = new CompositeRepositoryPermission(this.pps, 
this.compositionType);
+        repositoryPermission = createRepositoryPermission();
         immutableRoot = rootProvider.createReadOnlyRoot(root);
         privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
         typeProvider = new TreeTypeProvider(ctx);
     }
 
-    //-------------------------------------------------< PermissionProvider 
>---
-    @Override
-    public void refresh() {
-        immutableRoot = rootProvider.createReadOnlyRoot(root);
-        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
-
-        for (PermissionProvider pp : pps) {
-            pp.refresh();
+    static CompositePermissionProvider create(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
+                                              @NotNull Context acContext, 
@NotNull CompositionType compositionType,
+                                              @NotNull RootProvider 
rootProvider, @NotNull TreeProvider treeProvider) {
+        if (compositionType == CompositionType.AND) {
+            return new CompositePermissionProviderAnd(root, pps, acContext, 
rootProvider, treeProvider);
+        } else {
+            return new CompositePermissionProviderOr(root, pps, acContext, 
rootProvider, treeProvider);
         }
     }
 
     @NotNull
-    @Override
-    public Set<String> getPrivileges(@Nullable Tree tree) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
immutableRoot);
+    abstract CompositionType getCompositeType();
 
-        PrivilegeBits result = PrivilegeBits.getInstance();
-        PrivilegeBits denied = PrivilegeBits.getInstance();
+    @NotNull
+    abstract RepositoryPermission createRepositoryPermission();
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, 
null).modifiable();
-            if (doEvaluate(supported)) {
-                PrivilegeBits granted = 
privilegeBitsProvider.getBits(aggregatedPermissionProvider.getPrivileges(immutableTree));
-                // add the granted privileges to the result
-                if (!granted.isEmpty()) {
-                    result.add(granted);
-                }
-                if (compositionType == AND) {
-                    // update the set of denied privs by comparing the granted 
privs
-                    // with the complete set of supported privileges
-                    denied.add(supported.diff(granted));
-                }
-            }
-        }
-        // subtract all denied privileges from the result
-        if (!denied.isEmpty()) {
-            result.diff(denied);
-        }
-        return privilegeBitsProvider.getPrivilegeNames(result);
+    @NotNull
+    Root getImmutableRoot() {
+        return immutableRoot;
     }
 
-    @Override
-    public boolean hasPrivileges(@Nullable Tree tree, @NotNull String... 
privilegeNames) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
immutableRoot);
-        PrivilegeBits privilegeBits = 
privilegeBitsProvider.getBits(privilegeNames);
-        if (privilegeBits.isEmpty()) {
-            return true;
-        }
+    @NotNull
+    PrivilegeBitsProvider getBitsProvider() {
+        return privilegeBitsProvider;
+    }
 
-        boolean hasPrivileges = false;
-        PrivilegeBits coveredPrivs = PrivilegeBits.getInstance();
+    @NotNull
+    AggregatedPermissionProvider[] getPermissionProviders() {
+        return pps;
+    }
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, privilegeBits);
-            if (doEvaluate(supported)) {
-                Set<String> supportedNames = 
privilegeBitsProvider.getPrivilegeNames(supported);
-                if (compositionType == AND) {
-                    hasPrivileges = 
aggregatedPermissionProvider.hasPrivileges(immutableTree,
-                            supportedNames.toArray(new String[0]));
-                    if (!hasPrivileges) {
-                        return false;
-                    }
-                    coveredPrivs.add(supported);
-
-                } else {
-                    // evaluate one by one so we can aggregate fragments of
-                    // supported privileges
-                    for (String p : supportedNames) {
-                        if 
(aggregatedPermissionProvider.hasPrivileges(immutableTree, p)) {
-                            PrivilegeBits granted = 
privilegeBitsProvider.getBits(p);
-                            coveredPrivs.add(granted);
-                            hasPrivileges = true;
-                        }
-                    }
-                }
-            }
+    //-------------------------------------------------< PermissionProvider 
>---
+    @Override
+    public void refresh() {
+        immutableRoot = rootProvider.createReadOnlyRoot(root);
+        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
+
+        for (PermissionProvider pp : pps) {
+            pp.refresh();
         }
-        return hasPrivileges && coveredPrivs.includes(privilegeBits);
     }
 
     @NotNull
@@ -171,7 +128,7 @@ class CompositePermissionProvider implem
     public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreePermission parentPermission) {
         Tree readOnlyTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
         if (tree.isRoot()) {
-            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
typeProvider, pps, compositionType);
+            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
typeProvider, pps, getCompositeType());
         } else if (parentPermission instanceof CompositeTreePermission) {
             return CompositeTreePermission.create(readOnlyTree, treeProvider, 
((CompositeTreePermission) parentPermission));
         } else {
@@ -180,34 +137,6 @@ class CompositePermissionProvider implem
     }
 
     @Override
-    public boolean isGranted(@NotNull Tree parent, @Nullable PropertyState 
property, long permissions) {
-        Tree immParent = PermissionUtil.getReadOnlyTree(parent, immutableRoot);
-
-        boolean isGranted = false;
-        long coveredPermissions = Permissions.NO_PERMISSION;
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(immParent, property, 
permissions);
-            if (doEvaluate(supportedPermissions)) {
-                if (compositionType == AND) {
-                    isGranted = 
aggregatedPermissionProvider.isGranted(immParent, property, 
supportedPermissions);
-                    if (!isGranted) {
-                        return false;
-                    }
-                    coveredPermissions |= supportedPermissions;
-                } else {
-                    for (long p : Permissions.aggregates(permissions)) {
-                        if (aggregatedPermissionProvider.isGranted(immParent, 
property, p)) {
-                            coveredPermissions |= p;
-                            isGranted = true;
-                        }
-                    }
-                }
-            }
-        }
-        return isGranted && coveredPermissions == permissions;
-    }
-
-    @Override
     public boolean isGranted(@NotNull String oakPath, @NotNull String 
jcrActions) {
         TreeLocation location = TreeLocation.create(immutableRoot, oakPath);
         boolean isAcContent = ctx.definesLocation(location);
@@ -216,61 +145,6 @@ class CompositePermissionProvider implem
         return isGranted(location, permissions);
     }
 
-    //------------------------------------------------------------< private 
>---
-
-    private static boolean doEvaluate(long supportedPermissions) {
-        return supportedPermissions != Permissions.NO_PERMISSION;
-    }
-
-    private static boolean doEvaluate(PrivilegeBits supportedPrivileges) {
-        return !supportedPrivileges.isEmpty();
-    }
-
-    //-----------------------------------------------< RepositoryPermission 
>---
-    /**
-     * {@code RepositoryPermission} implementation that wraps multiple 
implementations.
-     */
-    private final static class CompositeRepositoryPermission implements 
RepositoryPermission {
-
-        private final AggregatedPermissionProvider[] pps;
-
-        private final CompositionType compositionType;
-
-        CompositeRepositoryPermission(@NotNull AggregatedPermissionProvider[] 
pps,
-                                      @NotNull CompositionType 
compositionType) {
-            this.pps = pps;
-            this.compositionType = compositionType;
-        }
-
-        @Override
-        public boolean isGranted(long repositoryPermissions) {
-            boolean isGranted = false;
-            long coveredPermissions = Permissions.NO_PERMISSION;
-
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
-                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions((Tree) null, null, 
repositoryPermissions);
-                if (doEvaluate(supportedPermissions)) {
-                    RepositoryPermission rp = 
aggregatedPermissionProvider.getRepositoryPermission();
-                    if (compositionType == AND) {
-                        isGranted = rp.isGranted(supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : 
Permissions.aggregates(repositoryPermissions)) {
-                            if (rp.isGranted(p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
-                        }
-                    }
-                }
-            }
-            return isGranted && coveredPermissions == repositoryPermissions;
-        }
-    }
-
     //---------------------------------------< AggregatedPermissionProvider 
>---
 
     @NotNull
@@ -311,47 +185,13 @@ class CompositePermissionProvider implem
         return coveredPermissions;
     }
 
-    @Override
-    public boolean isGranted(@NotNull TreeLocation location, long permissions) 
{
-        PropertyState property = location.getProperty();
-        Tree tree = (property == null) ? location.getTree() : 
location.getParent().getTree();
-
-        if (tree != null) {
-            return isGranted(tree, property, permissions);
-        } else {
-            boolean isGranted = false;
-            long coveredPermissions = Permissions.NO_PERMISSION;
-
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
-                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(location, permissions);
-                if (doEvaluate(supportedPermissions)) {
-                    if (compositionType == AND) {
-                        isGranted = 
aggregatedPermissionProvider.isGranted(location, supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : Permissions.aggregates(permissions)) {
-                            if 
(aggregatedPermissionProvider.isGranted(location, p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
-                        }
-                    }
-                }
-            }
-            return isGranted && coveredPermissions == permissions;
-        }
-    }
-
     @NotNull
     @Override
     public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreeType type,
             @NotNull TreePermission parentPermission) {
         Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
         if (tree.isRoot()) {
-            return CompositeTreePermission.create(immutableTree, treeProvider, 
typeProvider, pps, compositionType);
+            return CompositeTreePermission.create(immutableTree, treeProvider, 
typeProvider, pps, getCompositeType());
         } else if (parentPermission instanceof CompositeTreePermission) {
             return CompositeTreePermission.create(immutableTree, treeProvider, 
((CompositeTreePermission) parentPermission), type);
         } else {

Copied: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderAnd.java
 (from r1858013, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderAnd.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderAnd.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java&r1=1858013&r2=1858410&rev=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderAnd.java
 Tue Apr 30 08:36:03 2019
@@ -16,115 +16,90 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.composite;
 
-import java.util.List;
-import java.util.Set;
-import java.util.function.Function;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
-import org.apache.jackrabbit.oak.plugins.tree.TreeType;
-import org.apache.jackrabbit.oak.plugins.tree.TreeTypeProvider;
 import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType;
 import 
org.apache.jackrabbit.oak.security.authorization.permission.PermissionUtil;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.RepositoryPermission;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBitsProvider;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.List;
+import java.util.Set;
+
 import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.AND;
 
 /**
  * Permission provider implementation that aggregates a list of different
  * provider implementations. Note, that the aggregated provider implementations
  * *must* implement the
- * {@link 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider}
+ * {@link AggregatedPermissionProvider}
  * interface.
  */
-class CompositePermissionProvider implements AggregatedPermissionProvider {
+final class CompositePermissionProviderAnd extends CompositePermissionProvider 
{
 
-    private final Root root;
-    private final AggregatedPermissionProvider[] pps;
-    private final Context ctx;
-    private final CompositionType compositionType;
-    private final RootProvider rootProvider;
-    private final TreeProvider treeProvider;
-
-    private final RepositoryPermission repositoryPermission;
-
-    private Root immutableRoot;
-    private PrivilegeBitsProvider privilegeBitsProvider;
-    private TreeTypeProvider typeProvider;
-
-    CompositePermissionProvider(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
-                                @NotNull Context acContext, @NotNull 
CompositionType compositionType,
-                                @NotNull RootProvider rootProvider, @NotNull 
TreeProvider treeProvider) {
-        this.root = root;
-        this.pps = pps.toArray(new AggregatedPermissionProvider[0]);
-        this.ctx = acContext;
-        this.compositionType = compositionType;
-        this.rootProvider = rootProvider;
-        this.treeProvider = treeProvider;
-
-        repositoryPermission = new CompositeRepositoryPermission(this.pps, 
this.compositionType);
-        immutableRoot = rootProvider.createReadOnlyRoot(root);
-        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
-        typeProvider = new TreeTypeProvider(ctx);
+    CompositePermissionProviderAnd(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
+                                   @NotNull Context acContext,
+                                   @NotNull RootProvider rootProvider, 
@NotNull TreeProvider treeProvider) {
+        super(root, pps, acContext, rootProvider, treeProvider);
     }
 
-    //-------------------------------------------------< PermissionProvider 
>---
-    @Override
-    public void refresh() {
-        immutableRoot = rootProvider.createReadOnlyRoot(root);
-        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
+    @NotNull
+    CompositionType getCompositeType() {
+        return AND;
+    }
 
-        for (PermissionProvider pp : pps) {
-            pp.refresh();
-        }
+    @NotNull
+    RepositoryPermission createRepositoryPermission() {
+        return new CompositeRepositoryPermission();
     }
 
+    //-------------------------------------------------< PermissionProvider 
>---
+
     @NotNull
     @Override
     public Set<String> getPrivileges(@Nullable Tree tree) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
+        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
getImmutableRoot());
 
         PrivilegeBits result = PrivilegeBits.getInstance();
         PrivilegeBits denied = PrivilegeBits.getInstance();
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        PrivilegeBitsProvider bitsProvider = getBitsProvider();
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, 
null).modifiable();
-            if (doEvaluate(supported)) {
-                PrivilegeBits granted = 
privilegeBitsProvider.getBits(aggregatedPermissionProvider.getPrivileges(immutableTree));
+            if (Util.doEvaluate(supported)) {
+                PrivilegeBits granted = 
bitsProvider.getBits(aggregatedPermissionProvider.getPrivileges(immutableTree));
                 // add the granted privileges to the result
                 if (!granted.isEmpty()) {
                     result.add(granted);
                 }
-                if (compositionType == AND) {
-                    // update the set of denied privs by comparing the granted 
privs
-                    // with the complete set of supported privileges
-                    denied.add(supported.diff(granted));
-                }
+                // update the set of denied privs by comparing the granted 
privs
+                // with the complete set of supported privileges
+                denied.add(supported.diff(granted));
             }
         }
         // subtract all denied privileges from the result
         if (!denied.isEmpty()) {
             result.diff(denied);
         }
-        return privilegeBitsProvider.getPrivilegeNames(result);
+        return bitsProvider.getPrivilegeNames(result);
     }
 
     @Override
     public boolean hasPrivileges(@Nullable Tree tree, @NotNull String... 
privilegeNames) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        PrivilegeBits privilegeBits = 
privilegeBitsProvider.getBits(privilegeNames);
+        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
getImmutableRoot());
+        PrivilegeBitsProvider bitsProvider = getBitsProvider();
+
+        PrivilegeBits privilegeBits = bitsProvider.getBits(privilegeNames);
         if (privilegeBits.isEmpty()) {
             return true;
         }
@@ -132,185 +107,42 @@ class CompositePermissionProvider implem
         boolean hasPrivileges = false;
         PrivilegeBits coveredPrivs = PrivilegeBits.getInstance();
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, privilegeBits);
-            if (doEvaluate(supported)) {
-                Set<String> supportedNames = 
privilegeBitsProvider.getPrivilegeNames(supported);
-                if (compositionType == AND) {
-                    hasPrivileges = 
aggregatedPermissionProvider.hasPrivileges(immutableTree,
-                            supportedNames.toArray(new String[0]));
-                    if (!hasPrivileges) {
-                        return false;
-                    }
-                    coveredPrivs.add(supported);
-
-                } else {
-                    // evaluate one by one so we can aggregate fragments of
-                    // supported privileges
-                    for (String p : supportedNames) {
-                        if 
(aggregatedPermissionProvider.hasPrivileges(immutableTree, p)) {
-                            PrivilegeBits granted = 
privilegeBitsProvider.getBits(p);
-                            coveredPrivs.add(granted);
-                            hasPrivileges = true;
-                        }
-                    }
+            if (Util.doEvaluate(supported)) {
+                Set<String> supportedNames = 
bitsProvider.getPrivilegeNames(supported);
+                hasPrivileges = 
aggregatedPermissionProvider.hasPrivileges(immutableTree,
+                        supportedNames.toArray(new String[0]));
+                if (!hasPrivileges) {
+                    return false;
                 }
+                coveredPrivs.add(supported);
             }
         }
         return hasPrivileges && coveredPrivs.includes(privilegeBits);
     }
 
-    @NotNull
-    @Override
-    public RepositoryPermission getRepositoryPermission() {
-        return repositoryPermission;
-    }
-
-    @NotNull
-    @Override
-    public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreePermission parentPermission) {
-        Tree readOnlyTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        if (tree.isRoot()) {
-            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
typeProvider, pps, compositionType);
-        } else if (parentPermission instanceof CompositeTreePermission) {
-            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
((CompositeTreePermission) parentPermission));
-        } else {
-            return parentPermission.getChildPermission(readOnlyTree.getName(), 
treeProvider.asNodeState(readOnlyTree));
-        }
-    }
-
     @Override
     public boolean isGranted(@NotNull Tree parent, @Nullable PropertyState 
property, long permissions) {
-        Tree immParent = PermissionUtil.getReadOnlyTree(parent, immutableRoot);
+        Tree immParent = PermissionUtil.getReadOnlyTree(parent, 
getImmutableRoot());
 
         boolean isGranted = false;
         long coveredPermissions = Permissions.NO_PERMISSION;
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(immParent, property, 
permissions);
-            if (doEvaluate(supportedPermissions)) {
-                if (compositionType == AND) {
-                    isGranted = 
aggregatedPermissionProvider.isGranted(immParent, property, 
supportedPermissions);
-                    if (!isGranted) {
-                        return false;
-                    }
-                    coveredPermissions |= supportedPermissions;
-                } else {
-                    for (long p : Permissions.aggregates(permissions)) {
-                        if (aggregatedPermissionProvider.isGranted(immParent, 
property, p)) {
-                            coveredPermissions |= p;
-                            isGranted = true;
-                        }
-                    }
+            if (Util.doEvaluate(supportedPermissions)) {
+                isGranted = aggregatedPermissionProvider.isGranted(immParent, 
property, supportedPermissions);
+                if (!isGranted) {
+                    return false;
                 }
+                coveredPermissions |= supportedPermissions;
             }
         }
         return isGranted && coveredPermissions == permissions;
     }
 
-    @Override
-    public boolean isGranted(@NotNull String oakPath, @NotNull String 
jcrActions) {
-        TreeLocation location = TreeLocation.create(immutableRoot, oakPath);
-        boolean isAcContent = ctx.definesLocation(location);
-
-        long permissions = Permissions.getPermissions(jcrActions, location, 
isAcContent);
-        return isGranted(location, permissions);
-    }
-
-    //------------------------------------------------------------< private 
>---
-
-    private static boolean doEvaluate(long supportedPermissions) {
-        return supportedPermissions != Permissions.NO_PERMISSION;
-    }
-
-    private static boolean doEvaluate(PrivilegeBits supportedPrivileges) {
-        return !supportedPrivileges.isEmpty();
-    }
-
-    //-----------------------------------------------< RepositoryPermission 
>---
-    /**
-     * {@code RepositoryPermission} implementation that wraps multiple 
implementations.
-     */
-    private final static class CompositeRepositoryPermission implements 
RepositoryPermission {
-
-        private final AggregatedPermissionProvider[] pps;
-
-        private final CompositionType compositionType;
-
-        CompositeRepositoryPermission(@NotNull AggregatedPermissionProvider[] 
pps,
-                                      @NotNull CompositionType 
compositionType) {
-            this.pps = pps;
-            this.compositionType = compositionType;
-        }
-
-        @Override
-        public boolean isGranted(long repositoryPermissions) {
-            boolean isGranted = false;
-            long coveredPermissions = Permissions.NO_PERMISSION;
-
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
-                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions((Tree) null, null, 
repositoryPermissions);
-                if (doEvaluate(supportedPermissions)) {
-                    RepositoryPermission rp = 
aggregatedPermissionProvider.getRepositoryPermission();
-                    if (compositionType == AND) {
-                        isGranted = rp.isGranted(supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : 
Permissions.aggregates(repositoryPermissions)) {
-                            if (rp.isGranted(p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
-                        }
-                    }
-                }
-            }
-            return isGranted && coveredPermissions == repositoryPermissions;
-        }
-    }
-
     //---------------------------------------< AggregatedPermissionProvider 
>---
 
-    @NotNull
-    @Override
-    public PrivilegeBits supportedPrivileges(@Nullable Tree tree, @Nullable 
PrivilegeBits privilegeBits) {
-        PrivilegeBits result = PrivilegeBits.getInstance();
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(tree, privilegeBits);
-            result.add(supported);
-        }
-        return result;
-    }
-
-    @Override
-    public long supportedPermissions(@Nullable Tree tree, @Nullable 
PropertyState property, long permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(tree, property, permissions));
-    }
-
-    @Override
-    public long supportedPermissions(@NotNull TreeLocation location, long 
permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(location, permissions));
-    }
-
-    @Override
-    public long supportedPermissions(@NotNull TreePermission treePermission, 
@Nullable PropertyState property, long permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(treePermission, property, permissions));
-    }
-
-    private long supportedPermissions(Function<AggregatedPermissionProvider, 
Long> supported) {
-        long coveredPermissions = Permissions.NO_PERMISSION;
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            long supportedPermissions = 
supported.apply(aggregatedPermissionProvider);
-            coveredPermissions |= supportedPermissions;
-        }
-        return coveredPermissions;
-    }
-
     @Override
     public boolean isGranted(@NotNull TreeLocation location, long permissions) 
{
         PropertyState property = location.getProperty();
@@ -322,40 +154,43 @@ class CompositePermissionProvider implem
             boolean isGranted = false;
             long coveredPermissions = Permissions.NO_PERMISSION;
 
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
+            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
                 long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(location, permissions);
-                if (doEvaluate(supportedPermissions)) {
-                    if (compositionType == AND) {
-                        isGranted = 
aggregatedPermissionProvider.isGranted(location, supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : Permissions.aggregates(permissions)) {
-                            if 
(aggregatedPermissionProvider.isGranted(location, p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
-                        }
+                if (Util.doEvaluate(supportedPermissions)) {
+                    isGranted = 
aggregatedPermissionProvider.isGranted(location, supportedPermissions);
+                    if (!isGranted) {
+                        return false;
                     }
+                    coveredPermissions |= supportedPermissions;
                 }
             }
             return isGranted && coveredPermissions == permissions;
         }
     }
 
-    @NotNull
-    @Override
-    public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreeType type,
-            @NotNull TreePermission parentPermission) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        if (tree.isRoot()) {
-            return CompositeTreePermission.create(immutableTree, treeProvider, 
typeProvider, pps, compositionType);
-        } else if (parentPermission instanceof CompositeTreePermission) {
-            return CompositeTreePermission.create(immutableTree, treeProvider, 
((CompositeTreePermission) parentPermission), type);
-        } else {
-            return 
parentPermission.getChildPermission(immutableTree.getName(), 
treeProvider.asNodeState(immutableTree));
+    //-----------------------------------------------< RepositoryPermission 
>---
+    /**
+     * {@code RepositoryPermission} implementation that wraps multiple 
implementations.
+     */
+    private final class CompositeRepositoryPermission implements 
RepositoryPermission {
+
+        @Override
+        public boolean isGranted(long repositoryPermissions) {
+            boolean isGranted = false;
+            long coveredPermissions = Permissions.NO_PERMISSION;
+
+            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
+                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions((Tree) null, null, 
repositoryPermissions);
+                if (Util.doEvaluate(supportedPermissions)) {
+                    RepositoryPermission rp = 
aggregatedPermissionProvider.getRepositoryPermission();
+                    isGranted = rp.isGranted(supportedPermissions);
+                    if (!isGranted) {
+                        return false;
+                    }
+                    coveredPermissions |= supportedPermissions;
+                }
+            }
+            return isGranted && coveredPermissions == repositoryPermissions;
         }
     }
 }

Copied: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderOr.java
 (from r1858013, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderOr.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderOr.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java&r1=1858013&r2=1858410&rev=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProviderOr.java
 Tue Apr 30 08:36:03 2019
@@ -16,115 +16,89 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.composite;
 
-import java.util.List;
-import java.util.Set;
-import java.util.function.Function;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
-import org.apache.jackrabbit.oak.plugins.tree.TreeType;
-import org.apache.jackrabbit.oak.plugins.tree.TreeTypeProvider;
 import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType;
 import 
org.apache.jackrabbit.oak.security.authorization.permission.PermissionUtil;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.RepositoryPermission;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBitsProvider;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.AND;
+import java.util.List;
+import java.util.Set;
+
+import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.OR;
 
 /**
  * Permission provider implementation that aggregates a list of different
  * provider implementations. Note, that the aggregated provider implementations
  * *must* implement the
- * {@link 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider}
+ * {@link AggregatedPermissionProvider}
  * interface.
  */
-class CompositePermissionProvider implements AggregatedPermissionProvider {
+final class CompositePermissionProviderOr extends CompositePermissionProvider {
 
-    private final Root root;
-    private final AggregatedPermissionProvider[] pps;
-    private final Context ctx;
-    private final CompositionType compositionType;
-    private final RootProvider rootProvider;
-    private final TreeProvider treeProvider;
-
-    private final RepositoryPermission repositoryPermission;
-
-    private Root immutableRoot;
-    private PrivilegeBitsProvider privilegeBitsProvider;
-    private TreeTypeProvider typeProvider;
-
-    CompositePermissionProvider(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
-                                @NotNull Context acContext, @NotNull 
CompositionType compositionType,
-                                @NotNull RootProvider rootProvider, @NotNull 
TreeProvider treeProvider) {
-        this.root = root;
-        this.pps = pps.toArray(new AggregatedPermissionProvider[0]);
-        this.ctx = acContext;
-        this.compositionType = compositionType;
-        this.rootProvider = rootProvider;
-        this.treeProvider = treeProvider;
-
-        repositoryPermission = new CompositeRepositoryPermission(this.pps, 
this.compositionType);
-        immutableRoot = rootProvider.createReadOnlyRoot(root);
-        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
-        typeProvider = new TreeTypeProvider(ctx);
+    CompositePermissionProviderOr(@NotNull Root root, @NotNull 
List<AggregatedPermissionProvider> pps,
+                                  @NotNull Context acContext, @NotNull 
RootProvider rootProvider,
+                                  @NotNull TreeProvider treeProvider) {
+        super(root, pps, acContext, rootProvider, treeProvider);
     }
 
-    //-------------------------------------------------< PermissionProvider 
>---
+    @NotNull
     @Override
-    public void refresh() {
-        immutableRoot = rootProvider.createReadOnlyRoot(root);
-        privilegeBitsProvider = new PrivilegeBitsProvider(immutableRoot);
+    CompositionType getCompositeType() {
+        return OR;
+    }
 
-        for (PermissionProvider pp : pps) {
-            pp.refresh();
-        }
+    @NotNull
+    @Override
+    RepositoryPermission createRepositoryPermission() {
+        return new CompositeRepositoryPermission();
     }
 
+    //-------------------------------------------------< PermissionProvider 
>---
+
     @NotNull
     @Override
     public Set<String> getPrivileges(@Nullable Tree tree) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
+        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
getImmutableRoot());
 
         PrivilegeBits result = PrivilegeBits.getInstance();
         PrivilegeBits denied = PrivilegeBits.getInstance();
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        PrivilegeBitsProvider bitsProvider = getBitsProvider();
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, 
null).modifiable();
-            if (doEvaluate(supported)) {
-                PrivilegeBits granted = 
privilegeBitsProvider.getBits(aggregatedPermissionProvider.getPrivileges(immutableTree));
+            if (Util.doEvaluate(supported)) {
+                PrivilegeBits granted = 
bitsProvider.getBits(aggregatedPermissionProvider.getPrivileges(immutableTree));
                 // add the granted privileges to the result
                 if (!granted.isEmpty()) {
                     result.add(granted);
                 }
-                if (compositionType == AND) {
-                    // update the set of denied privs by comparing the granted 
privs
-                    // with the complete set of supported privileges
-                    denied.add(supported.diff(granted));
-                }
             }
         }
         // subtract all denied privileges from the result
         if (!denied.isEmpty()) {
             result.diff(denied);
         }
-        return privilegeBitsProvider.getPrivilegeNames(result);
+        return getBitsProvider().getPrivilegeNames(result);
     }
 
     @Override
     public boolean hasPrivileges(@Nullable Tree tree, @NotNull String... 
privilegeNames) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        PrivilegeBits privilegeBits = 
privilegeBitsProvider.getBits(privilegeNames);
+        Tree immutableTree = PermissionUtil.getReadOnlyTreeOrNull(tree, 
getImmutableRoot());
+        PrivilegeBitsProvider bitsProvider = getBitsProvider();
+
+        PrivilegeBits privilegeBits = bitsProvider.getBits(privilegeNames);
         if (privilegeBits.isEmpty()) {
             return true;
         }
@@ -132,27 +106,17 @@ class CompositePermissionProvider implem
         boolean hasPrivileges = false;
         PrivilegeBits coveredPrivs = PrivilegeBits.getInstance();
 
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(immutableTree, privilegeBits);
-            if (doEvaluate(supported)) {
-                Set<String> supportedNames = 
privilegeBitsProvider.getPrivilegeNames(supported);
-                if (compositionType == AND) {
-                    hasPrivileges = 
aggregatedPermissionProvider.hasPrivileges(immutableTree,
-                            supportedNames.toArray(new String[0]));
-                    if (!hasPrivileges) {
-                        return false;
-                    }
-                    coveredPrivs.add(supported);
-
-                } else {
-                    // evaluate one by one so we can aggregate fragments of
-                    // supported privileges
-                    for (String p : supportedNames) {
-                        if 
(aggregatedPermissionProvider.hasPrivileges(immutableTree, p)) {
-                            PrivilegeBits granted = 
privilegeBitsProvider.getBits(p);
-                            coveredPrivs.add(granted);
-                            hasPrivileges = true;
-                        }
+            if (Util.doEvaluate(supported)) {
+                Set<String> supportedNames = 
bitsProvider.getPrivilegeNames(supported);
+                // evaluate one by one so we can aggregate fragments of
+                // supported privileges
+                for (String p : supportedNames) {
+                    if 
(aggregatedPermissionProvider.hasPrivileges(immutableTree, p)) {
+                        PrivilegeBits granted = bitsProvider.getBits(p);
+                        coveredPrivs.add(granted);
+                        hasPrivileges = true;
                     }
                 }
             }
@@ -160,46 +124,19 @@ class CompositePermissionProvider implem
         return hasPrivileges && coveredPrivs.includes(privilegeBits);
     }
 
-    @NotNull
-    @Override
-    public RepositoryPermission getRepositoryPermission() {
-        return repositoryPermission;
-    }
-
-    @NotNull
-    @Override
-    public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreePermission parentPermission) {
-        Tree readOnlyTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        if (tree.isRoot()) {
-            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
typeProvider, pps, compositionType);
-        } else if (parentPermission instanceof CompositeTreePermission) {
-            return CompositeTreePermission.create(readOnlyTree, treeProvider, 
((CompositeTreePermission) parentPermission));
-        } else {
-            return parentPermission.getChildPermission(readOnlyTree.getName(), 
treeProvider.asNodeState(readOnlyTree));
-        }
-    }
-
     @Override
     public boolean isGranted(@NotNull Tree parent, @Nullable PropertyState 
property, long permissions) {
-        Tree immParent = PermissionUtil.getReadOnlyTree(parent, immutableRoot);
+        Tree immParent = PermissionUtil.getReadOnlyTree(parent, 
getImmutableRoot());
 
         boolean isGranted = false;
         long coveredPermissions = Permissions.NO_PERMISSION;
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
+        for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
             long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(immParent, property, 
permissions);
-            if (doEvaluate(supportedPermissions)) {
-                if (compositionType == AND) {
-                    isGranted = 
aggregatedPermissionProvider.isGranted(immParent, property, 
supportedPermissions);
-                    if (!isGranted) {
-                        return false;
-                    }
-                    coveredPermissions |= supportedPermissions;
-                } else {
-                    for (long p : Permissions.aggregates(permissions)) {
-                        if (aggregatedPermissionProvider.isGranted(immParent, 
property, p)) {
-                            coveredPermissions |= p;
-                            isGranted = true;
-                        }
+            if (Util.doEvaluate(supportedPermissions)) {
+                for (long p : Permissions.aggregates(permissions)) {
+                    if (aggregatedPermissionProvider.isGranted(immParent, 
property, p)) {
+                        coveredPermissions |= p;
+                        isGranted = true;
                     }
                 }
             }
@@ -207,110 +144,8 @@ class CompositePermissionProvider implem
         return isGranted && coveredPermissions == permissions;
     }
 
-    @Override
-    public boolean isGranted(@NotNull String oakPath, @NotNull String 
jcrActions) {
-        TreeLocation location = TreeLocation.create(immutableRoot, oakPath);
-        boolean isAcContent = ctx.definesLocation(location);
-
-        long permissions = Permissions.getPermissions(jcrActions, location, 
isAcContent);
-        return isGranted(location, permissions);
-    }
-
-    //------------------------------------------------------------< private 
>---
-
-    private static boolean doEvaluate(long supportedPermissions) {
-        return supportedPermissions != Permissions.NO_PERMISSION;
-    }
-
-    private static boolean doEvaluate(PrivilegeBits supportedPrivileges) {
-        return !supportedPrivileges.isEmpty();
-    }
-
-    //-----------------------------------------------< RepositoryPermission 
>---
-    /**
-     * {@code RepositoryPermission} implementation that wraps multiple 
implementations.
-     */
-    private final static class CompositeRepositoryPermission implements 
RepositoryPermission {
-
-        private final AggregatedPermissionProvider[] pps;
-
-        private final CompositionType compositionType;
-
-        CompositeRepositoryPermission(@NotNull AggregatedPermissionProvider[] 
pps,
-                                      @NotNull CompositionType 
compositionType) {
-            this.pps = pps;
-            this.compositionType = compositionType;
-        }
-
-        @Override
-        public boolean isGranted(long repositoryPermissions) {
-            boolean isGranted = false;
-            long coveredPermissions = Permissions.NO_PERMISSION;
-
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
-                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions((Tree) null, null, 
repositoryPermissions);
-                if (doEvaluate(supportedPermissions)) {
-                    RepositoryPermission rp = 
aggregatedPermissionProvider.getRepositoryPermission();
-                    if (compositionType == AND) {
-                        isGranted = rp.isGranted(supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : 
Permissions.aggregates(repositoryPermissions)) {
-                            if (rp.isGranted(p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
-                        }
-                    }
-                }
-            }
-            return isGranted && coveredPermissions == repositoryPermissions;
-        }
-    }
-
     //---------------------------------------< AggregatedPermissionProvider 
>---
 
-    @NotNull
-    @Override
-    public PrivilegeBits supportedPrivileges(@Nullable Tree tree, @Nullable 
PrivilegeBits privilegeBits) {
-        PrivilegeBits result = PrivilegeBits.getInstance();
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            PrivilegeBits supported = 
aggregatedPermissionProvider.supportedPrivileges(tree, privilegeBits);
-            result.add(supported);
-        }
-        return result;
-    }
-
-    @Override
-    public long supportedPermissions(@Nullable Tree tree, @Nullable 
PropertyState property, long permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(tree, property, permissions));
-    }
-
-    @Override
-    public long supportedPermissions(@NotNull TreeLocation location, long 
permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(location, permissions));
-    }
-
-    @Override
-    public long supportedPermissions(@NotNull TreePermission treePermission, 
@Nullable PropertyState property, long permissions) {
-        return supportedPermissions((aggregatedPermissionProvider) -> 
aggregatedPermissionProvider
-                .supportedPermissions(treePermission, property, permissions));
-    }
-
-    private long supportedPermissions(Function<AggregatedPermissionProvider, 
Long> supported) {
-        long coveredPermissions = Permissions.NO_PERMISSION;
-        for (AggregatedPermissionProvider aggregatedPermissionProvider : pps) {
-            long supportedPermissions = 
supported.apply(aggregatedPermissionProvider);
-            coveredPermissions |= supportedPermissions;
-        }
-        return coveredPermissions;
-    }
-
     @Override
     public boolean isGranted(@NotNull TreeLocation location, long permissions) 
{
         PropertyState property = location.getProperty();
@@ -322,21 +157,13 @@ class CompositePermissionProvider implem
             boolean isGranted = false;
             long coveredPermissions = Permissions.NO_PERMISSION;
 
-            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
pps) {
+            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
                 long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions(location, permissions);
-                if (doEvaluate(supportedPermissions)) {
-                    if (compositionType == AND) {
-                        isGranted = 
aggregatedPermissionProvider.isGranted(location, supportedPermissions);
-                        if (!isGranted) {
-                            return false;
-                        }
-                        coveredPermissions |= supportedPermissions;
-                    } else {
-                        for (long p : Permissions.aggregates(permissions)) {
-                            if 
(aggregatedPermissionProvider.isGranted(location, p)) {
-                                coveredPermissions |= p;
-                                isGranted = true;
-                            }
+                if (Util.doEvaluate(supportedPermissions)) {
+                    for (long p : Permissions.aggregates(permissions)) {
+                        if (aggregatedPermissionProvider.isGranted(location, 
p)) {
+                            coveredPermissions |= p;
+                            isGranted = true;
                         }
                     }
                 }
@@ -345,17 +172,30 @@ class CompositePermissionProvider implem
         }
     }
 
-    @NotNull
-    @Override
-    public TreePermission getTreePermission(@NotNull Tree tree, @NotNull 
TreeType type,
-            @NotNull TreePermission parentPermission) {
-        Tree immutableTree = PermissionUtil.getReadOnlyTree(tree, 
immutableRoot);
-        if (tree.isRoot()) {
-            return CompositeTreePermission.create(immutableTree, treeProvider, 
typeProvider, pps, compositionType);
-        } else if (parentPermission instanceof CompositeTreePermission) {
-            return CompositeTreePermission.create(immutableTree, treeProvider, 
((CompositeTreePermission) parentPermission), type);
-        } else {
-            return 
parentPermission.getChildPermission(immutableTree.getName(), 
treeProvider.asNodeState(immutableTree));
+    //-----------------------------------------------< RepositoryPermission 
>---
+    /**
+     * {@code RepositoryPermission} implementation that wraps multiple 
implementations.
+     */
+    private final class CompositeRepositoryPermission implements 
RepositoryPermission {
+
+        @Override
+        public boolean isGranted(long repositoryPermissions) {
+            boolean isGranted = false;
+            long coveredPermissions = Permissions.NO_PERMISSION;
+
+            for (AggregatedPermissionProvider aggregatedPermissionProvider : 
getPermissionProviders()) {
+                long supportedPermissions = 
aggregatedPermissionProvider.supportedPermissions((Tree) null, null, 
repositoryPermissions);
+                if (Util.doEvaluate(supportedPermissions)) {
+                    RepositoryPermission rp = 
aggregatedPermissionProvider.getRepositoryPermission();
+                    for (long p : 
Permissions.aggregates(repositoryPermissions)) {
+                        if (rp.isGranted(p)) {
+                            coveredPermissions |= p;
+                            isGranted = true;
+                        }
+                    }
+                }
+            }
+            return isGranted && coveredPermissions == repositoryPermissions;
         }
     }
 }

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=1858410&r1=1858409&r2=1858410&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
 Tue Apr 30 08:36:03 2019
@@ -32,16 +32,16 @@ import org.jetbrains.annotations.Nullabl
 
 import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.AND;
 import static 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.OR;
+import static 
org.apache.jackrabbit.oak.security.authorization.composite.Util.doEvaluate;
 
 /**
  * {@code TreePermission} implementation that combines multiple {@code 
TreePermission}
  * implementations.
  */
-final class CompositeTreePermission implements TreePermission {
+abstract class CompositeTreePermission implements TreePermission {
 
     private final Tree tree;
     private final TreeType type;
-    private final CompositionType compositionType;
 
     private final TreeProvider treeProvider;
     private final TreeTypeProvider typeProvider;
@@ -53,9 +53,10 @@ final class CompositeTreePermission impl
     private Boolean canReadProperties;
 
     private CompositeTreePermission(@NotNull Tree tree, @NotNull TreeType type,
-            @NotNull TreeProvider treeProvider,
-            @NotNull TreeTypeProvider typeProvider, @NotNull 
AggregatedPermissionProvider[] providers,
-            @NotNull TreePermission[] treePermissions, int cnt, @NotNull 
CompositionType compositionType) {
+                                    @NotNull TreeProvider treeProvider,
+                                    @NotNull TreeTypeProvider typeProvider,
+                                    @NotNull AggregatedPermissionProvider[] 
providers,
+                                    @NotNull TreePermission[] treePermissions, 
int cnt) {
         this.tree = tree;
         this.type = type;
 
@@ -64,7 +65,6 @@ final class CompositeTreePermission impl
         this.providers = providers;
         this.treePermissions = treePermissions;
         this.childSize = providers.length - cnt;
-        this.compositionType = compositionType;
     }
 
     static TreePermission create(@NotNull Tree rootTree,
@@ -85,8 +85,11 @@ final class CompositeTreePermission impl
                     }
                     treePermissions[i] = tp;
                 }
-            return new CompositeTreePermission(rootTree, TreeType.DEFAULT, 
treeProvider, typeProvider, providers, treePermissions,
-                    cnt, compositionType);
+                if (compositionType == AND) {
+                    return new CompositeTreePermissionAnd(rootTree, 
TreeType.DEFAULT, treeProvider, typeProvider, providers, treePermissions, cnt);
+                } else {
+                    return new CompositeTreePermissionOr(rootTree, 
TreeType.DEFAULT, treeProvider, typeProvider, providers, treePermissions, cnt);
+                }
         }
     }
 
@@ -108,11 +111,11 @@ final class CompositeTreePermission impl
             case 1:
                 TreePermission parent = null;
                 for (TreePermission tp : parentPermission.treePermissions) {
-                        if (isValid(tp)) {
-                            parent = tp;
-                            break;
-                        }
+                    if (isValid(tp)) {
+                        parent = tp;
+                        break;
                     }
+                }
                 return (parent == null) ? TreePermission.EMPTY : 
parent.getChildPermission(childName, childState);
             default:
                 Tree tree = lazyTree.get();
@@ -139,8 +142,11 @@ final class CompositeTreePermission impl
                         j++;
                     }
                 }
-            return new CompositeTreePermission(tree, type, 
parentPermission.treeProvider, parentPermission.typeProvider, pvds, tps, cnt,
-                    parentPermission.compositionType);
+                if (parentPermission.getCompositionType() == AND) {
+                    return new CompositeTreePermissionAnd(tree, type, 
parentPermission.treeProvider, parentPermission.typeProvider, pvds, tps, cnt);
+                } else {
+                    return new CompositeTreePermissionOr(tree, type, 
parentPermission.treeProvider, parentPermission.typeProvider, pvds, tps, cnt);
+                }
         }
     }
 
@@ -172,21 +178,7 @@ final class CompositeTreePermission impl
     @Override
     public boolean canReadProperties() {
         if (canReadProperties == null) {
-            boolean readable = false;
-            for (int i = 0; i < providers.length; i++) {
-                TreePermission tp = treePermissions[i];
-                long supported = providers[i].supportedPermissions(tp, null, 
Permissions.READ_PROPERTY);
-                if (doEvaluate(supported)) {
-                    readable = tp.canReadProperties();
-                    if (!readable && compositionType == AND) {
-                        break;
-                    }
-                    if (readable && compositionType == OR) {
-                        break;
-                    }
-                }
-            }
-            canReadProperties = readable;
+            canReadProperties = grantsReadProperties();
         }
         return canReadProperties;
     }
@@ -201,23 +193,65 @@ final class CompositeTreePermission impl
         return grantsPermission(permissions, property);
     }
 
+    
//---------------------------------------------------------------------------
+    @NotNull
+    abstract CompositionType getCompositionType();
+
+    abstract boolean grantsPermission(long permissions, @Nullable 
PropertyState property);
+
+    abstract boolean grantsRead(@Nullable PropertyState property);
+
+    abstract boolean grantsReadProperties();
+
+    
//---------------------------------------------------------------------------
+
+    int length() {
+        return providers.length;
+    }
+
+    @NotNull
+    AggregatedPermissionProvider provider(int index) {
+        return providers[index];
+    }
+
+    @NotNull
+    TreePermission treePermission(int index) {
+        return treePermissions[index];
+    }
+
     //------------------------------------------------------------< private 
>---
 
-    private boolean grantsPermission(long permissions, @Nullable PropertyState 
property) {
-        boolean isGranted = false;
-        long coveredPermissions = Permissions.NO_PERMISSION;
-
-        for (int i = 0; i < providers.length; i++) {
-            TreePermission tp = treePermissions[i];
-            long supported = providers[i].supportedPermissions(tp, property, 
permissions);
-            if (doEvaluate(supported)) {
-                if (compositionType == AND) {
-                    isGranted = (property == null) ? tp.isGranted(supported) : 
tp.isGranted(supported, property);
-                    if (!isGranted) {
-                        return false;
-                    }
-                    coveredPermissions |= supported;
-                } else {
+    private static boolean isValid(@NotNull TreePermission tp) {
+        return NO_RECOURSE != tp;
+    }
+
+    private static TreeType getType(@NotNull Tree tree, @NotNull 
CompositeTreePermission parent) {
+        return parent.typeProvider.getType(tree, parent.type);
+    }
+
+    //---< OR 
>-----------------------------------------------------------------
+
+    private static final class CompositeTreePermissionOr extends 
CompositeTreePermission {
+
+        private CompositeTreePermissionOr(@NotNull Tree tree, @NotNull 
TreeType type, @NotNull TreeProvider treeProvider, @NotNull TreeTypeProvider 
typeProvider, @NotNull AggregatedPermissionProvider[] providers, @NotNull 
TreePermission[] treePermissions, int cnt) {
+            super(tree, type, treeProvider, typeProvider, providers, 
treePermissions, cnt);
+        }
+
+        @NotNull
+        @Override
+        CompositionType getCompositionType() {
+            return OR;
+        }
+
+        @Override
+        boolean grantsPermission(long permissions, @Nullable PropertyState 
property) {
+            boolean isGranted = false;
+            long coveredPermissions = Permissions.NO_PERMISSION;
+
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, 
property, permissions);
+                if (doEvaluate(supported)) {
                     for (long p : Permissions.aggregates(supported)) {
                         boolean aGrant = (property == null) ? tp.isGranted(p) 
: tp.isGranted(p, property);
                         if (aGrant) {
@@ -227,40 +261,110 @@ final class CompositeTreePermission impl
                     }
                 }
             }
+            return isGranted && coveredPermissions == permissions;
         }
-        return isGranted && coveredPermissions == permissions;
-    }
 
-    private boolean grantsRead(@Nullable PropertyState property) {
-        if (property != null && canReadProperties()) {
-            return true;
-        }
-        boolean readable = false;
-        for (int i = 0; i < providers.length; i++) {
-            TreePermission tp = treePermissions[i];
-            long supported = providers[i].supportedPermissions(tp, property, 
(property == null) ? Permissions.READ_NODE : Permissions.READ_PROPERTY);
-            if (doEvaluate(supported)) {
-                readable = (property == null) ? tp.canRead() : 
tp.canRead(property);
-                if (!readable && compositionType == AND) {
-                    return false;
+        @Override
+        boolean grantsRead(@Nullable PropertyState property) {
+            if (property != null && canReadProperties()) {
+                return true;
+            }
+            boolean readable = false;
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, 
property, (property == null) ? Permissions.READ_NODE : 
Permissions.READ_PROPERTY);
+                if (doEvaluate(supported)) {
+                    readable = (property == null) ? tp.canRead() : 
tp.canRead(property);
+                    if (readable) {
+                        return true;
+                    }
                 }
-                if (readable && compositionType == OR) {
-                    return true;
+            }
+            return readable;
+        }
+
+        @Override
+        boolean grantsReadProperties() {
+            boolean readable = false;
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, null, 
Permissions.READ_PROPERTY);
+                if (doEvaluate(supported)) {
+                    readable = tp.canReadProperties();
+                    if (readable) {
+                        break;
+                    }
                 }
             }
+            return readable;
         }
-        return readable;
     }
 
-    private static boolean doEvaluate(long supportedPermissions) {
-        return supportedPermissions != Permissions.NO_PERMISSION;
-    }
+    //---< AND 
>----------------------------------------------------------------
 
-    private static boolean isValid(@NotNull TreePermission tp) {
-        return NO_RECOURSE != tp;
-    }
+    private static final class CompositeTreePermissionAnd extends 
CompositeTreePermission {
 
-    private static TreeType getType(@NotNull Tree tree, @NotNull 
CompositeTreePermission parent) {
-        return parent.typeProvider.getType(tree, parent.type);
+        private CompositeTreePermissionAnd(@NotNull Tree tree, @NotNull 
TreeType type,
+                                           @NotNull TreeProvider treeProvider,
+                                           @NotNull TreeTypeProvider 
typeProvider, @NotNull AggregatedPermissionProvider[] providers,
+                                           @NotNull TreePermission[] 
treePermissions, int cnt) {
+            super(tree, type, treeProvider, typeProvider, providers, 
treePermissions, cnt);
+        }
+
+        @NotNull
+        CompositeAuthorizationConfiguration.CompositionType 
getCompositionType() {
+            return AND;
+        }
+
+        boolean grantsPermission(long permissions, @Nullable PropertyState 
property) {
+            boolean isGranted = false;
+            long coveredPermissions = Permissions.NO_PERMISSION;
+
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, 
property, permissions);
+                if (doEvaluate(supported)) {
+                    isGranted = (property == null) ? tp.isGranted(supported) : 
tp.isGranted(supported, property);
+                    if (!isGranted) {
+                        return false;
+                    }
+                    coveredPermissions |= supported;
+                }
+            }
+            return isGranted && coveredPermissions == permissions;
+        }
+
+        boolean grantsRead(@Nullable PropertyState property) {
+            if (property != null && canReadProperties()) {
+                return true;
+            }
+            boolean readable = false;
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, 
property, (property == null) ? Permissions.READ_NODE : 
Permissions.READ_PROPERTY);
+                if (doEvaluate(supported)) {
+                    readable = (property == null) ? tp.canRead() : 
tp.canRead(property);
+                    if (!readable) {
+                        return false;
+                    }
+                }
+            }
+            return readable;
+        }
+
+        boolean grantsReadProperties() {
+            boolean readable = false;
+            for (int i = 0; i < length(); i++) {
+                TreePermission tp = treePermission(i);
+                long supported = provider(i).supportedPermissions(tp, null, 
Permissions.READ_PROPERTY);
+                if (doEvaluate(supported)) {
+                    readable = tp.canReadProperties();
+                    if (!readable) {
+                        break;
+                    }
+                }
+            }
+            return readable;
+        }
     }
 }

Added: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java?rev=1858410&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java
 Tue Apr 30 08:36:03 2019
@@ -0,0 +1,38 @@
+/*
+ * 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.security.authorization.composite;
+
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class Util {
+
+    private static final Logger log = LoggerFactory.getLogger(Util.class);
+
+    private Util() {}
+
+    static boolean doEvaluate(long supportedPermissions) {
+        return supportedPermissions != Permissions.NO_PERMISSION;
+    }
+
+    static boolean doEvaluate(@NotNull PrivilegeBits supportedPrivileges) {
+        return !supportedPrivileges.isEmpty();
+    }
+}
\ No newline at end of file

Propchange: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/Util.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/AbstractCompositeProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/AbstractCompositeProviderTest.java?rev=1858410&r1=1858409&r2=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/AbstractCompositeProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/AbstractCompositeProviderTest.java
 Tue Apr 30 08:36:03 2019
@@ -30,7 +30,6 @@ import org.apache.jackrabbit.oak.api.Tre
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
-import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
@@ -252,8 +251,8 @@ public abstract class AbstractCompositeP
     CompositePermissionProvider createPermissionProvider(Set<Principal> 
principals) {
         String workspaceName = root.getContentSession().getWorkspaceName();
         AuthorizationConfiguration config = 
getConfig(AuthorizationConfiguration.class);
-        return new CompositePermissionProvider(root, 
getAggregatedProviders(workspaceName, config, principals),
-                config.getContext(), CompositionType.AND, getRootProvider(), 
getTreeProvider());
+        return new CompositePermissionProviderAnd(root, 
getAggregatedProviders(workspaceName, config, principals),
+                config.getContext(), getRootProvider(), getTreeProvider());
     }
 
     CompositePermissionProvider createPermissionProviderOR(Principal... 
principals) {
@@ -263,8 +262,8 @@ public abstract class AbstractCompositeP
     CompositePermissionProvider createPermissionProviderOR(Set<Principal> 
principals) {
         String workspaceName = root.getContentSession().getWorkspaceName();
         AuthorizationConfiguration config = 
getConfig(AuthorizationConfiguration.class);
-        return new CompositePermissionProvider(root, 
getAggregatedProviders(workspaceName, config, principals),
-                config.getContext(), CompositionType.OR, getRootProvider(), 
getTreeProvider());
+        return new CompositePermissionProviderOr(root, 
getAggregatedProviders(workspaceName, config, principals),
+                config.getContext(), getRootProvider(), getTreeProvider());
     }
 
     @Test

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderCustomMixTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderCustomMixTest.java?rev=1858410&r1=1858409&r2=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderCustomMixTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderCustomMixTest.java
 Tue Apr 30 08:36:03 2019
@@ -234,7 +234,7 @@ public class CompositeProviderCustomMixT
 
         AuthorizationConfiguration config = 
getConfig(AuthorizationConfiguration.class);
         List<AggregatedPermissionProvider> composite = ImmutableList.of(a1, 
a2);
-        return new CompositePermissionProvider(root, composite, 
config.getContext(), type, getRootProvider(), getTreeProvider());
+        return CompositePermissionProvider.create(root, composite, 
config.getContext(), type, getRootProvider(), getTreeProvider());
     }
 
     private static class CustomProvider implements 
AggregatedPermissionProvider {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderGetTreePermissionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderGetTreePermissionTest.java?rev=1858410&r1=1858409&r2=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderGetTreePermissionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderGetTreePermissionTest.java
 Tue Apr 30 08:36:03 2019
@@ -47,7 +47,7 @@ public class CompositeProviderGetTreePer
 
     private CompositePermissionProvider createProvider(@NotNull 
CompositeAuthorizationConfiguration.CompositionType compositionType,
                                                        @NotNull 
AggregatedPermissionProvider... providers) {
-        return new CompositePermissionProvider(root, 
ImmutableList.copyOf(providers), Context.DEFAULT, compositionType, 
getRootProvider(), getTreeProvider());
+        return CompositePermissionProvider.create(root, 
ImmutableList.copyOf(providers), Context.DEFAULT, compositionType, 
getRootProvider(), getTreeProvider());
     }
 
     @Test

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderSupportedTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderSupportedTest.java?rev=1858410&r1=1858409&r2=1858410&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderSupportedTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeProviderSupportedTest.java
 Tue Apr 30 08:36:03 2019
@@ -89,7 +89,7 @@ public class CompositeProviderSupportedT
     }
 
     private CompositePermissionProvider createProvider(@NotNull 
CompositeAuthorizationConfiguration.CompositionType compositionType, @NotNull 
AggregatedPermissionProvider... aggregated) {
-        return new CompositePermissionProvider(root, 
ImmutableList.copyOf(aggregated), Context.DEFAULT, compositionType, 
getRootProvider(), getTreeProvider());
+        return CompositePermissionProvider.create(root, 
ImmutableList.copyOf(aggregated), Context.DEFAULT, compositionType, 
getRootProvider(), getTreeProvider());
     }
 
     @Test


Reply via email to