You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/06/22 19:21:30 UTC

svn commit: r1138557 - in /jackrabbit/sandbox/microkernel/src: main/java/org/apache/jackrabbit/mk/util/PathUtils.java test/java/org/apache/jackrabbit/mk/PathTest.java

Author: thomasm
Date: Wed Jun 22 17:21:29 2011
New Revision: 1138557

URL: http://svn.apache.org/viewvc?rev=1138557&view=rev
Log:
Improve path utils (better support weird paths)

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/PathTest.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java?rev=1138557&r1=1138556&r2=1138557&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java Wed Jun 22 17:21:29 2011
@@ -36,11 +36,17 @@ public class PathUtils {
     }
 
     public static String getParentPath(String path) {
-        int pos = getPreviousSlash(path, path.length() - 1);
+        int end = path.length() - 1;
+        while (end >= 0 && path.charAt(end) == '/') {
+            end--;
+        }
+        int pos = getPreviousSlash(path, end);
         if (pos > 0) {
             return path.substring(0, pos);
+        } else if (pos < 0 && !path.startsWith("/")) {
+            return "";
         }
-        return "/";
+        return path.length() > 0 ? "/" : path;
     }
 
     /**
@@ -50,12 +56,16 @@ public class PathUtils {
      * @return the last element
      */
     public static String getName(String path) {
-        if (path.endsWith("/")) {
-            path = path.substring(0, path.length() - 1);
+        int end = path.length() - 1;
+        while (end >= 0 && path.charAt(end) == '/') {
+            end--;
+            if (end < 0) {
+                return "";
+            }
         }
-        int pos = getPreviousSlash(path, path.length() - 1);
+        int pos = getPreviousSlash(path, end);
         if (pos != -1) {
-            return path.substring(pos + 1);
+            return path.substring(pos + 1, end + 1);
         }
         return path;
     }
@@ -107,12 +117,15 @@ public class PathUtils {
         if (nameOrRelativePath.startsWith("/")) {
             throw new IllegalArgumentException("can't append absolute path");
         }
-        StringBuilder buf = new StringBuilder(parentPath);
-        if (buf.charAt(buf.length() - 1) != '/') {
-            buf.append('/');
+        int parentLen = parentPath.length();
+        StringBuilder buff = new StringBuilder(
+                parentLen + 1 + nameOrRelativePath.length());
+        buff.append(parentPath);
+        if (parentLen > 0 && !parentPath.endsWith("/")) {
+            buff.append('/');
         }
-        buf.append(nameOrRelativePath);
-        return buf.toString();
+        buff.append(nameOrRelativePath);
+        return buff.toString();
     }
 
     /**

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/PathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/PathTest.java?rev=1138557&r1=1138556&r2=1138557&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/PathTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/PathTest.java Wed Jun 22 17:21:29 2011
@@ -50,15 +50,27 @@ public class PathTest extends TestCase {
 
     public void testMore() {
         String[] paths = {
+            "",
+            "/",
             "/foo",
             "/foo/",
             "/foo//",
             "/foo///",
             "foo",
+            "/foo",
+            "/foo/bar",
+            "/foo/bar/",
+            "/foo/bar//",
         };
 
         for (String path : paths) {
-            assertEquals(path, PathUtils.concat(PathUtils.getParentPath(path), PathUtils.getName(path)));
+            String parent = PathUtils.getParentPath(path);
+            String name = PathUtils.getName(path);
+            String concat = PathUtils.concat(parent, name);
+            while (path.endsWith("/") && path.length() > 1) {
+                path = path.substring(0, path.length() - 1);
+            }
+            assertEquals(path, concat);
         }
     }