You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2015/10/23 12:50:14 UTC

svn commit: r1710169 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/tree/ main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ main/java/org/apache/jackrabbit/oak/security/authorization/permission/ test/java/org/...

Author: angela
Date: Fri Oct 23 10:50:14 2015
New Revision: 1710169

URL: http://svn.apache.org/viewvc?rev=1710169&view=rev
Log:
OAK-3545 : Refactor tree type information into plugins/tree package

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeType.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProvider.java
      - copied, changed from r1710131, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProvider.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProviderTest.java
      - copied, changed from r1710131, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProviderTest.java
Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProvider.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProviderTest.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/package-info.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeType.java?rev=1710169&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeType.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeType.java Fri Oct 23 10:50:14 2015
@@ -0,0 +1,62 @@
+/*
+ * 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.plugins.tree;
+
+/**
+ * Allows to distinguish different types of trees based on their name, ancestry
+ * or primary type. Currently the following types are supported:
+ *
+ * <ul>
+ *     <li>{@link #DEFAULT}: the default type for trees that don't match any of the following types.</li>
+ *     <li>{@link #ACCESS_CONTROL}: A tree that stores access control content
+ *     and requires special access {@link org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions#READ_ACCESS_CONTROL permissions}.</li>
+ *     <li>{@link #HIDDEN}: a hidden tree whose name starts with ":".
+ *     Please note that the whole subtree of a hidden node is considered hidden.</li>
+ *     <li>{@link #INTERNAL}: repository internal content that is not hidden (e.g. permission store)</li>
+ *     <li>{@link #VERSION}: if a given tree is located within
+ *     any of the version related stores defined by JSR 283. Depending on the
+ *     permission evaluation implementation those items require special treatment.</li>
+ * </ul>
+ */
+public enum TreeType {
+
+    /**
+     * Regular trees that don't match any of the other types
+     */
+    DEFAULT,
+
+    /**
+     * Access control content
+     */
+    ACCESS_CONTROL,
+
+    /**
+     * Hidden trees starting at a tree whose name starts with ':'.
+     * @see org.apache.jackrabbit.oak.spi.state.NodeStateUtils#isHidden(String)
+     */
+    HIDDEN,
+
+    /**
+     * Repository internal content that is not hidden (e.g. permission store)
+     */
+    INTERNAL,
+
+    /**
+     * Trees within the version, activity or configuration storage
+     */
+    VERSION
+}
\ No newline at end of file

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProvider.java (from r1710131, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProvider.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProvider.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProvider.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProvider.java&r1=1710131&r2=1710169&rev=1710169&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProvider.java Fri Oct 23 10:50:14 2015
@@ -14,109 +14,109 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.oak.security.authorization.permission;
+package org.apache.jackrabbit.oak.plugins.tree;
 
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
 
-/**
- * <h3>TreeTypeProvider</h3>
- * Allows to distinguish different types of trees based on their name, ancestry
- * or primary type. Currently the following types are supported:
- *
- * <ul>
- *     <li>{@link #TYPE_HIDDEN}: a hidden tree whose name starts with ":".
- *     Please note that the whole subtree of a hidden node is considered hidden.</li>
- *     <li>{@link #TYPE_AC}: A tree that stores access control content
- *     and requires special access {@link org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions#READ_ACCESS_CONTROL permissions}.</li>
- *     <li>{@link #TYPE_VERSION}: if a given tree is located within
- *     any of the version related stores defined by JSR 283. Depending on the
- *     permission evaluation implementation those items require special treatment.</li>
- *     <li>{@link #TYPE_INTERNAL}: repository internal content that is not hidden (e.g. permission store)</li>
- *     <li>{@link #TYPE_DEFAULT}: the default type for trees that don't
- *     match any of the upper types.</li>
- * </ul>
- */
 public final class TreeTypeProvider {
 
-    // regular trees
-    public static final int TYPE_DEFAULT = 1;
-    // version store(s) content
-    public static final int TYPE_VERSION = 2;
-    // repository internal content such as e.g. permissions store
-    public static final int TYPE_INTERNAL = 4;
-    // access control content
-    public static final int TYPE_AC = 8;
-    // hidden trees
-    public static final int TYPE_HIDDEN = 16;
-
-    private final Context authorizationContext;
+    private final Context ctx;
 
     public TreeTypeProvider(@Nonnull Context authorizationContext) {
-        this.authorizationContext = authorizationContext;
+        this.ctx = authorizationContext;
     }
 
-    public int getType(@Nonnull Tree tree) {
+    public TreeType getType(@Nonnull Tree tree) {
         if (tree.isRoot()) {
-            return TYPE_DEFAULT;
+            return TreeType.DEFAULT;
         } else {
-            Tree t = tree;
-            while (!t.isRoot()) {
-                int type = getType(t.getName(), t);
-                // stop walking up the hierarchy as soon as a special type is found
-                if (TYPE_DEFAULT != type) {
-                    return type;
+            TreeType type;
+            if (tree instanceof ImmutableTree) {
+                type = ((ImmutableTree) tree).getType();
+                if (type == null) {
+                    type = internalGetType(tree);
+                    ((ImmutableTree) tree).setType(type);
                 }
-                t = t.getParent();
+            } else {
+                type = internalGetType(tree);
             }
-            return TYPE_DEFAULT;
+            return type;
         }
     }
 
-    public int getType(@Nonnull Tree tree, int parentType) {
+    public TreeType getType(@Nonnull Tree tree, @Nonnull TreeType parentType) {
         if (tree.isRoot()) {
-            return TYPE_DEFAULT;
+            return TreeType.DEFAULT;
+        }
+
+        TreeType type;
+        if (tree instanceof ImmutableTree) {
+            type = ((ImmutableTree) tree).getType();
+            if (type == null) {
+                type = internalGetType(tree, parentType);
+                ((ImmutableTree) tree).setType(type);
+            }
+        } else {
+            type = internalGetType(tree, parentType);
         }
+        return type;
+    }
+
+    private TreeType internalGetType(@Nonnull Tree tree) {
+        Tree t = tree;
+        while (!t.isRoot()) {
+            TreeType type = internalGetType(t.getName(), t);
+            // stop walking up the hierarchy as soon as a special type is found
+            if (TreeType.DEFAULT != type) {
+                return type;
+            }
+            t = t.getParent();
+        }
+        return TreeType.DEFAULT;
+    }
 
-        int type;
+    private TreeType internalGetType(@Nonnull Tree tree, @Nonnull TreeType parentType) {
+        TreeType type;
         switch (parentType) {
-            case TYPE_HIDDEN:
-                type = TYPE_HIDDEN;
+            case HIDDEN:
+                type = TreeType.HIDDEN;
                 break;
-            case TYPE_VERSION:
-                type = TYPE_VERSION;
+            case VERSION:
+                type = TreeType.VERSION;
                 break;
-            case TYPE_INTERNAL:
-                type = TYPE_INTERNAL;
+            case INTERNAL:
+                type = TreeType.INTERNAL;
                 break;
-            case TYPE_AC:
-                type = TYPE_AC;
+            case ACCESS_CONTROL:
+                type = TreeType.ACCESS_CONTROL;
                 break;
             default:
-                type = getType(tree.getName(), tree);
+                type = internalGetType(tree.getName(), tree);
         }
         return type;
     }
 
-    private int getType(@Nonnull String name, @Nonnull Tree tree) {
-        int type;
+    private TreeType internalGetType(@Nonnull String name, @Nonnull Tree tree) {
+        TreeType type;
         if (NodeStateUtils.isHidden(name)) {
-            type = TYPE_HIDDEN;
+            type = TreeType.HIDDEN;
         } else if (VersionConstants.VERSION_STORE_ROOT_NAMES.contains(name)) {
-            type = (JcrConstants.JCR_SYSTEM.equals(tree.getParent().getName())) ?  TYPE_VERSION : TYPE_DEFAULT;
+            type = (JcrConstants.JCR_SYSTEM.equals(tree.getParent().getName())) ?  TreeType.VERSION : TreeType.DEFAULT;
         } else if (PermissionConstants.REP_PERMISSION_STORE.equals(name)) {
-            type = TYPE_INTERNAL;
-        } else if (authorizationContext.definesContextRoot(tree)) {
-            type = TYPE_AC;
+            type = TreeType.INTERNAL;
+        } else if (ctx.definesContextRoot(tree)) {
+            type = TreeType.ACCESS_CONTROL;
         } else {
-            type = TYPE_DEFAULT;
+            type = TreeType.DEFAULT;
         }
         return type;
     }
-}
+}
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java?rev=1710169&r1=1710168&r2=1710169&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java Fri Oct 23 10:50:14 2015
@@ -26,6 +26,7 @@ import com.google.common.base.Objects;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder;
@@ -94,6 +95,8 @@ public final class ImmutableTree extends
 
     private String path;
 
+    private TreeType type;
+
     public ImmutableTree(@Nonnull NodeState rootState) {
         this(ParentProvider.ROOT_PROVIDER, "", rootState);
     }
@@ -108,6 +111,14 @@ public final class ImmutableTree extends
         this.parentProvider = checkNotNull(parentProvider);
     }
 
+    public TreeType getType() {
+        return type;
+    }
+
+    public void setType(TreeType type) {
+        this.type = type;
+    }
+
     //-------------------------------------------------------< AbstractTree >---
     @Override
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/package-info.java?rev=1710169&r1=1710168&r2=1710169&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/package-info.java Fri Oct 23 10:50:14 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0")
+@Version("1.1.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.tree;
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java?rev=1710169&r1=1710168&r2=1710169&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java Fri Oct 23 10:50:14 2015
@@ -39,6 +39,8 @@ import org.apache.jackrabbit.oak.api.Tre
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
+import org.apache.jackrabbit.oak.plugins.tree.TreeTypeProvider;
 import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
@@ -70,20 +72,16 @@ final class CompiledPermissionImpl imple
             Permissions.READ_PROPERTY, PrivilegeBits.BUILT_IN.get(PrivilegeConstants.REP_READ_PROPERTIES),
             Permissions.READ_ACCESS_CONTROL, PrivilegeBits.BUILT_IN.get(PrivilegeConstants.JCR_READ_ACCESS_CONTROL));
 
-    private Root root;
-
     private final String workspaceName;
-
     private final ReadPolicy readPolicy;
-
-    private PermissionStoreImpl store;
+    private final PermissionStoreImpl store;
     private final PermissionEntryProvider userStore;
     private final PermissionEntryProvider groupStore;
+    private final TreeTypeProvider typeProvider;
 
+    private Root root;
     private PrivilegeBitsProvider bitsProvider;
 
-    private final TreeTypeProvider typeProvider;
-
     private CompiledPermissionImpl(@Nonnull Set<Principal> principals,
                                    @Nonnull Root root, @Nonnull String workspaceName,
                                    @Nonnull RestrictionProvider restrictionProvider,
@@ -155,20 +153,20 @@ final class CompiledPermissionImpl imple
     @Override
     public TreePermission getTreePermission(@Nonnull Tree tree, @Nonnull TreePermission parentPermission) {
         if (tree.isRoot()) {
-            return new TreePermissionImpl(tree, TreeTypeProvider.TYPE_DEFAULT, EMPTY);
+            return new TreePermissionImpl(tree, TreeType.DEFAULT, EMPTY);
         }
-        int parentType = getParentType(parentPermission);
-        int type = typeProvider.getType(tree, parentType);
+        TreeType parentType = getParentType(parentPermission);
+        TreeType type = typeProvider.getType(tree, parentType);
         switch (type) {
-            case TreeTypeProvider.TYPE_HIDDEN:
+            case HIDDEN:
                 return ALL;
-            case TreeTypeProvider.TYPE_VERSION:
+            case VERSION:
                 String ntName = TreeUtil.getPrimaryTypeName(tree);
                 if (ntName == null) {
                     return EMPTY;
                 }
                 if (VersionConstants.VERSION_STORE_NT_NAMES.contains(ntName) || VersionConstants.NT_ACTIVITY.equals(ntName)) {
-                    return new TreePermissionImpl(tree, TreeTypeProvider.TYPE_VERSION, parentPermission);
+                    return new TreePermissionImpl(tree, TreeType.VERSION, parentPermission);
                 } else {
                     Tree versionableTree = getVersionableTree(tree);
                     if (versionableTree == null) {
@@ -184,11 +182,11 @@ final class CompiledPermissionImpl imple
                         while (!versionableTree.exists()) {
                             versionableTree = versionableTree.getParent();
                         }
-                        TreePermission pp = getParentPermission(versionableTree, TreeTypeProvider.TYPE_VERSION);
-                        return new TreePermissionImpl(versionableTree, TreeTypeProvider.TYPE_VERSION, pp);
+                        TreePermission pp = getParentPermission(versionableTree, TreeType.VERSION);
+                        return new TreePermissionImpl(versionableTree, TreeType.VERSION, pp);
                     }
                 }
-            case TreeTypeProvider.TYPE_INTERNAL:
+            case INTERNAL:
                 return EMPTY;
             default:
                 return new TreePermissionImpl(tree, type, parentPermission);
@@ -196,7 +194,7 @@ final class CompiledPermissionImpl imple
     }
 
     @Nonnull
-    private TreePermission getParentPermission(@Nonnull Tree tree, int type) {
+    private TreePermission getParentPermission(@Nonnull Tree tree, TreeType type) {
         List<Tree> trees = new ArrayList<Tree>();
         while (!tree.isRoot()) {
             tree = tree.getParent();
@@ -213,11 +211,11 @@ final class CompiledPermissionImpl imple
 
     @Override
     public boolean isGranted(@Nonnull Tree tree, @Nullable PropertyState property, long permissions) {
-        int type = typeProvider.getType(tree);
+        TreeType type = typeProvider.getType(tree);
         switch (type) {
-            case TreeTypeProvider.TYPE_HIDDEN:
+            case HIDDEN:
                 return true;
-            case TreeTypeProvider.TYPE_VERSION:
+            case VERSION:
                 Tree versionableTree = getVersionableTree(tree);
                 if (versionableTree == null) {
                     // unable to determine the location of the versionable item -> deny access.
@@ -234,7 +232,7 @@ final class CompiledPermissionImpl imple
                     }
                     return isGranted(path, permissions);
                 }
-            case TreeTypeProvider.TYPE_INTERNAL:
+            case INTERNAL:
                 return false;
             default:
                 return internalIsGranted(tree, property, permissions);
@@ -337,11 +335,11 @@ final class CompiledPermissionImpl imple
 
     @Nonnull
     private PrivilegeBits internalGetPrivileges(@Nullable Tree tree) {
-        int type = (tree == null) ? TreeTypeProvider.TYPE_DEFAULT : typeProvider.getType(tree);
+        TreeType type = (tree == null) ? TreeType.DEFAULT : typeProvider.getType(tree);
         switch (type) {
-            case TreeTypeProvider.TYPE_HIDDEN:
+            case HIDDEN:
                 return PrivilegeBits.EMPTY;
-            case TreeTypeProvider.TYPE_VERSION:
+            case VERSION:
                 Tree versionableTree = getVersionableTree(tree);
                 if (versionableTree == null || !versionableTree.exists()) {
                     // unable to determine the location of the versionable item -> deny access.
@@ -349,7 +347,7 @@ final class CompiledPermissionImpl imple
                 }  else {
                     return getPrivilegeBits(versionableTree);
                 }
-            case TreeTypeProvider.TYPE_INTERNAL:
+            case INTERNAL:
                 return PrivilegeBits.EMPTY;
             default:
                 return getPrivilegeBits(tree);
@@ -424,11 +422,11 @@ final class CompiledPermissionImpl imple
         return versionStoreTree;
     }
 
-    private static int getParentType(@Nonnull TreePermission parentPermission) {
+    private static TreeType getParentType(@Nonnull TreePermission parentPermission) {
         if (parentPermission instanceof TreePermissionImpl) {
             return ((TreePermissionImpl) parentPermission).type;
         } else if (parentPermission == TreePermission.EMPTY) {
-            return TreeTypeProvider.TYPE_DEFAULT;
+            return TreeType.DEFAULT;
         } else {
             throw new IllegalArgumentException("Illegal TreePermission implementation.");
         }
@@ -439,7 +437,7 @@ final class CompiledPermissionImpl imple
         private final Tree tree;
         private final TreePermissionImpl parent;
 
-        private final int type;
+        private final TreeType type;
         private final boolean readableTree;
 
         private Collection<PermissionEntry> userEntries;
@@ -448,15 +446,15 @@ final class CompiledPermissionImpl imple
         private boolean skipped;
         private ReadStatus readStatus;
 
-        private TreePermissionImpl(Tree tree, int treeType, TreePermission parentPermission) {
+        private TreePermissionImpl(Tree tree, TreeType type, TreePermission parentPermission) {
             this.tree = tree;
+            this.type = type;
             if (parentPermission instanceof TreePermissionImpl) {
                 parent = (TreePermissionImpl) parentPermission;
             } else {
                 parent = null;
             }
             readableTree = readPolicy.isReadableTree(tree, parent);
-            type = treeType;
         }
 
         //-------------------------------------------------< TreePermission >---
@@ -560,7 +558,7 @@ final class CompiledPermissionImpl imple
         }
 
         private boolean isAcTree() {
-            return type == TreeTypeProvider.TYPE_AC;
+            return type == TreeType.ACCESS_CONTROL;
         }
     }
 

Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProviderTest.java (from r1710131, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProviderTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProviderTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProviderTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProviderTest.java&r1=1710131&r2=1710169&rev=1710169&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/TreeTypeProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeTypeProviderTest.java Fri Oct 23 10:50:14 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.oak.security.authorization.permission;
+package org.apache.jackrabbit.oak.plugins.tree;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,6 +22,7 @@ import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
@@ -30,18 +31,14 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.junit.Test;
 
-import static org.apache.jackrabbit.oak.security.authorization.permission.TreeTypeProvider.TYPE_AC;
-import static org.apache.jackrabbit.oak.security.authorization.permission.TreeTypeProvider.TYPE_DEFAULT;
-import static org.apache.jackrabbit.oak.security.authorization.permission.TreeTypeProvider.TYPE_HIDDEN;
-import static org.apache.jackrabbit.oak.security.authorization.permission.TreeTypeProvider.TYPE_INTERNAL;
-import static org.apache.jackrabbit.oak.security.authorization.permission.TreeTypeProvider.TYPE_VERSION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
 public class TreeTypeProviderTest extends AbstractSecurityTest {
 
     private TreeTypeProvider typeProvider;
-    private List<TreeType> treeTypes;
+
+    private List<TypeTest> tests;
 
     @Override
     public void before() throws Exception {
@@ -49,51 +46,51 @@ public class TreeTypeProviderTest extend
 
         typeProvider = new TreeTypeProvider(getConfig(AuthorizationConfiguration.class).getContext());
 
-        treeTypes = new ArrayList<TreeType>();
-        treeTypes.add(new TreeType("/", TYPE_DEFAULT));
-        treeTypes.add(new TreeType("/content", TYPE_DEFAULT));
-        treeTypes.add(new TreeType('/' + JcrConstants.JCR_SYSTEM, TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH, TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:versionStorage", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:activities", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:configurations", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:AccessControllable/rep:namedChildNodeDefinitions/rep:policy", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:AccessControllable/rep:namedChildNodeDefinitions/rep:policy/rep:Policy", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:ACL/rep:residualChildNodeDefinitions/rep:ACE", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:GrantACE/rep:namedChildNodeDefinitions/rep:restrictions", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:RepoAccessControllable/rep:namedChildNodeDefinitions/rep:repoPolicy", TYPE_DEFAULT));
-        treeTypes.add(new TreeType(NodeTypeConstants.NODE_TYPES_PATH + "/rep:PermissionStore", TYPE_DEFAULT));
+        tests = new ArrayList<TypeTest>();
+        tests.add(new TypeTest("/", TreeType.DEFAULT));
+        tests.add(new TypeTest("/content", TreeType.DEFAULT));
+        tests.add(new TypeTest('/' + JcrConstants.JCR_SYSTEM, TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH, TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:versionStorage", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:activities", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:system/rep:namedChildNodeDefinitions/jcr:configurations", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:AccessControllable/rep:namedChildNodeDefinitions/rep:policy", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:AccessControllable/rep:namedChildNodeDefinitions/rep:policy/rep:Policy", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:ACL/rep:residualChildNodeDefinitions/rep:ACE", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:GrantACE/rep:namedChildNodeDefinitions/rep:restrictions", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:RepoAccessControllable/rep:namedChildNodeDefinitions/rep:repoPolicy", TreeType.DEFAULT));
+        tests.add(new TypeTest(NodeTypeConstants.NODE_TYPES_PATH + "/rep:PermissionStore", TreeType.DEFAULT));
 
-        treeTypes.add(new TreeType("/:hidden", TYPE_HIDDEN));
-        treeTypes.add(new TreeType("/:hidden/child", TYPE_HIDDEN, TYPE_HIDDEN));
+        tests.add(new TypeTest("/:hidden", TreeType.HIDDEN));
+        tests.add(new TypeTest("/:hidden/child", TreeType.HIDDEN, TreeType.HIDDEN));
 
-        treeTypes.add(new TreeType("/oak:index/nodetype/:index", TYPE_HIDDEN));
-        treeTypes.add(new TreeType("/oak:index/nodetype/:index/child", TYPE_HIDDEN, TYPE_HIDDEN));
+        tests.add(new TypeTest("/oak:index/nodetype/:index", TreeType.HIDDEN));
+        tests.add(new TypeTest("/oak:index/nodetype/:index/child", TreeType.HIDDEN, TreeType.HIDDEN));
 
         for (String versionPath : VersionConstants.SYSTEM_PATHS) {
-            treeTypes.add(new TreeType(versionPath, TYPE_VERSION));
-            treeTypes.add(new TreeType(versionPath + "/a/b/child", TYPE_VERSION, TYPE_VERSION));
+            tests.add(new TypeTest(versionPath, TreeType.VERSION));
+            tests.add(new TypeTest(versionPath + "/a/b/child", TreeType.VERSION, TreeType.VERSION));
         }
 
-        treeTypes.add(new TreeType(PermissionConstants.PERMISSIONS_STORE_PATH, TYPE_INTERNAL));
-        treeTypes.add(new TreeType(PermissionConstants.PERMISSIONS_STORE_PATH + "/a/b/child", TYPE_INTERNAL, TYPE_INTERNAL));
+        tests.add(new TypeTest(PermissionConstants.PERMISSIONS_STORE_PATH, TreeType.INTERNAL));
+        tests.add(new TypeTest(PermissionConstants.PERMISSIONS_STORE_PATH + "/a/b/child", TreeType.INTERNAL, TreeType.INTERNAL));
 
         NodeUtil testTree = new NodeUtil(root.getTree("/")).addChild("test", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
         for (String name : AccessControlConstants.POLICY_NODE_NAMES) {
             NodeUtil acl = testTree.addChild(name, AccessControlConstants.NT_REP_ACL);
-            treeTypes.add(new TreeType(acl.getTree().getPath(), TYPE_AC));
+            tests.add(new TypeTest(acl.getTree().getPath(), TreeType.ACCESS_CONTROL));
 
             NodeUtil ace = acl.addChild("ace", AccessControlConstants.NT_REP_DENY_ACE);
-            treeTypes.add(new TreeType(ace.getTree().getPath(), TYPE_AC, TYPE_AC));
+            tests.add(new TypeTest(ace.getTree().getPath(), TreeType.ACCESS_CONTROL, TreeType.ACCESS_CONTROL));
 
             NodeUtil ace2 = acl.addChild("ace2", AccessControlConstants.NT_REP_GRANT_ACE);
-            treeTypes.add(new TreeType(ace2.getTree().getPath(), TYPE_AC, TYPE_AC));
+            tests.add(new TypeTest(ace2.getTree().getPath(), TreeType.ACCESS_CONTROL, TreeType.ACCESS_CONTROL));
 
             NodeUtil rest = ace2.addChild(AccessControlConstants.REP_RESTRICTIONS, AccessControlConstants.NT_REP_RESTRICTIONS);
-            treeTypes.add(new TreeType(rest.getTree().getPath(), TYPE_AC, TYPE_AC));
+            tests.add(new TypeTest(rest.getTree().getPath(), TreeType.ACCESS_CONTROL, TreeType.ACCESS_CONTROL));
 
             NodeUtil invalid = rest.addChild("invalid", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-            treeTypes.add(new TreeType(invalid.getTree().getPath(), TYPE_AC, TYPE_AC));
+            tests.add(new TypeTest(invalid.getTree().getPath(), TreeType.ACCESS_CONTROL, TreeType.ACCESS_CONTROL));
         }
     }
 
@@ -108,41 +105,79 @@ public class TreeTypeProviderTest extend
 
     @Test
     public void testGetType() {
-        for (TreeType treeType : treeTypes) {
-            assertEquals(treeType.path, treeType.type, typeProvider.getType(root.getTree(treeType.path)));
+        for (TypeTest test : tests) {
+            assertEquals(test.path, test.type, typeProvider.getType(root.getTree(test.path)));
         }
     }
 
     @Test
     public void testGetTypeWithParentType() {
-        for (TreeType treeType : treeTypes) {
-            assertEquals(treeType.path, treeType.type, typeProvider.getType(root.getTree(treeType.path), treeType.parentType));
+        for (TypeTest test : tests) {
+            assertEquals(test.path, test.type, typeProvider.getType(root.getTree(test.path), test.parentType));
         }
     }
 
     @Test
     public void testGetTypeWithDefaultParentType() {
-        for (TreeType treeType : treeTypes) {
-            int typeIfParentDefault = typeProvider.getType(root.getTree(treeType.path), TYPE_DEFAULT);
+        for (TypeTest test : tests) {
+            TreeType typeIfParentDefault = typeProvider.getType(root.getTree(test.path), TreeType.DEFAULT);
 
-            if (TYPE_DEFAULT == treeType.parentType) {
-                assertEquals(treeType.path, treeType.type, typeIfParentDefault);
+            if (TreeType.DEFAULT == test.parentType) {
+                assertEquals(test.path, test.type, typeIfParentDefault);
             } else {
-                assertNotEquals(treeType.path, treeType.type, typeIfParentDefault);
+                assertNotEquals(test.path, test.type, typeIfParentDefault);
             }
         }
     }
+
+    @Test
+    public void testGetTypeForRootTree() {
+        Tree t = root.getTree("/");
+        assertEquals(TreeType.DEFAULT, typeProvider.getType(t));
+
+        // the type of the root tree is always 'DEFAULT' irrespective of the passed parent type.
+        assertEquals(TreeType.DEFAULT, typeProvider.getType(t, TreeType.DEFAULT));
+        assertEquals(TreeType.DEFAULT, typeProvider.getType(t, TreeType.HIDDEN));
+        assertEquals(TreeType.DEFAULT, typeProvider.getType(t, TreeType.VERSION));
+    }
+
+    @Test
+    public void testGetTypeForImmutableTree() {
+        for (String path : new String[] {"/", "/testPath"}) {
+            Tree t = RootFactory.createReadOnlyRoot(root).getTree(path);
+            assertEquals(TreeType.DEFAULT, typeProvider.getType(t));
+            // also for repeated calls
+            assertEquals(TreeType.DEFAULT, typeProvider.getType(t));
+
+            // the type of an immutable tree is set after the first call irrespective of the passed parent type.
+            assertEquals(TreeType.DEFAULT, typeProvider.getType(t, TreeType.DEFAULT));
+            assertEquals(TreeType.DEFAULT, typeProvider.getType(t, TreeType.HIDDEN));
+        }
+    }
+
+    @Test
+    public void testGetTypeForImmutableTreeWithParent() {
+        Tree t = RootFactory.createReadOnlyRoot(root).getTree("/:hidden/testPath");
+        assertEquals(TreeType.HIDDEN, typeProvider.getType(t, TreeType.HIDDEN));
+
+        // the type of an immutable tree is set after the first call irrespective of the passed parent type.
+        assertEquals(TreeType.HIDDEN, typeProvider.getType(t));
+        assertEquals(TreeType.HIDDEN, typeProvider.getType(t, TreeType.DEFAULT));
+        assertEquals(TreeType.HIDDEN, typeProvider.getType(t, TreeType.ACCESS_CONTROL));
+        assertEquals(TreeType.HIDDEN, typeProvider.getType(t, TreeType.VERSION));
+    }
     
-    private static final class TreeType {
+    private static final class TypeTest {
 
         private final String path;
-        private final int type;
-        private final int parentType;
+        private final TreeType type;
+        private final TreeType parentType;
 
-        private TreeType(@Nonnull String path, int type) {
-            this(path, type, TreeTypeProvider.TYPE_DEFAULT);
+        private TypeTest(@Nonnull String path, TreeType type) {
+            this(path, type, TreeType.DEFAULT);
         }
-        private TreeType(@Nonnull String path, int type, int parentType) {
+        
+        private TypeTest(@Nonnull String path, TreeType type, TreeType parentType) {
             this.path = path;
             this.type = type;
             this.parentType = parentType;