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);
+    }
 }


Reply via email to