Author: angela
Date: Wed May 29 12:21:58 2019
New Revision: 1860338
URL: http://svn.apache.org/viewvc?rev=1860338&view=rev
Log:
OAK-8370 : Simplify o.a.j.oak.security.user.Utils.getOrAddTree
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/Utils.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UtilsTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/Utils.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/Utils.java?rev=1860338&r1=1860337&r2=1860338&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/Utils.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/Utils.java
Wed May 29 12:21:58 2019
@@ -16,24 +16,21 @@
*/
package org.apache.jackrabbit.oak.security.user;
-import javax.jcr.AccessDeniedException;
-
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
import org.apache.jackrabbit.oak.spi.security.user.util.UserUtil;
-import org.apache.jackrabbit.util.Text;
import org.jetbrains.annotations.NotNull;
+import javax.jcr.AccessDeniedException;
+
final class Utils {
private Utils() {}
/**
- * TODO: clean up. workaround for OAK-426
- * <p>
* Create the tree at the specified relative path including all missing
* intermediate trees using the specified {@code primaryTypeName}. This
* method treats ".." parent element and "." as current element and
@@ -58,25 +55,14 @@ final class Utils {
} else if (relativePath.indexOf('/') == -1) {
return TreeUtil.getOrAddChild(tree, relativePath, primaryTypeName);
} else {
- Tree t = TreeUtil.getTree(tree, relativePath);
- if (t == null || !t.exists()) {
- Tree target = tree;
- for (String segment : Text.explode(relativePath, '/')) {
- if (PathUtils.denotesParent(segment)) {
- target = target.getParent();
- } else if (target.hasChild(segment)) {
- target = target.getChild(segment);
- } else if (!PathUtils.denotesCurrent(segment)) {
- target = TreeUtil.addChild(target, segment,
primaryTypeName);
- }
- }
- if (!target.exists()) {
- throw new AccessDeniedException();
- }
- return target;
- } else {
- return t;
+ for (String element : PathUtils.elements(relativePath)) {
+ if (PathUtils.denotesParent(element)) {
+ tree = tree.getParent();
+ } else if (!PathUtils.denotesCurrent(element)) {
+ tree = TreeUtil.getOrAddChild(tree, element,
primaryTypeName);
+ } // else . -> skip to next element
}
+ return tree;
}
}
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UtilsTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UtilsTest.java?rev=1860338&r1=1860337&r2=1860338&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UtilsTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UtilsTest.java
Wed May 29 12:21:58 2019
@@ -25,8 +25,12 @@ import org.apache.jackrabbit.oak.spi.nod
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
+import javax.jcr.AccessDeniedException;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class UtilsTest extends AbstractSecurityTest {
@@ -53,16 +57,31 @@ public class UtilsTest extends AbstractS
}
@Test
- public void testGetOrAddTree() throws Exception {
+ public void testGetOrAddTreeCurrentElement() throws Exception {
Tree result = Utils.getOrAddTree(tree, ".",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
assertSame(tree, result);
+ }
+ @Test
+ public void testGetOrAddTreeParentElement() throws Exception {
Tree child = Utils.getOrAddTree(tree, "child",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
- assertEqualPath(root.getTree("/child"), child);
-
Tree parent = Utils.getOrAddTree(child, "..",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
assertEqualPath(tree, parent);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testGetOrAddTreeParentElementFromRoot() throws Exception {
+ Utils.getOrAddTree(tree, "..", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+ }
+ @Test
+ public void testGetOrAddTreeSingleElement() throws Exception {
+ Tree child = Utils.getOrAddTree(tree, "child",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+ assertEqualPath(root.getTree("/child"), child);
+ }
+
+ @Test
+ public void testGetOrAddTree() throws Exception {
Map<String, String> map = ImmutableMap.of(
"a/b/c", "/a/b/c",
"a/../b/c", "/b/c",
@@ -74,4 +93,24 @@ public class UtilsTest extends AbstractS
assertEqualPath(root.getTree(map.get(relPath)), t);
}
}
+
+ @Test(expected = IllegalStateException.class)
+ public void testGetOrAddTreeReachesParentOfRoot() throws Exception {
+ Utils.getOrAddTree(tree, "a/../../b",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+ }
+
+ @Test(expected = AccessDeniedException.class)
+ public void testGetOrAddTreeTargetNotAccessible() throws Exception {
+ Tree nonExisting = mock(Tree.class);
+ when(nonExisting.exists()).thenReturn(false);
+
+ Tree t = mock(Tree.class);
+ when(t.exists()).thenReturn(true);
+ when(t.getParent()).thenReturn(t);
+ when(t.getChild("a")).thenReturn(t);
+ when(t.getChild("b")).thenReturn(nonExisting);
+ when(t.addChild("b")).thenReturn(nonExisting);
+
+ Utils.getOrAddTree(t, "a/a/b", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+ }
}