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;