You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2011/12/21 14:46:07 UTC

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

Author: mduerig
Date: Wed Dec 21 13:46:06 2011
New Revision: 1221725

URL: http://svn.apache.org/viewvc?rev=1221725&view=rev
Log:
- lazy path splitting

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/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=1221725&r1=1221724&r2=1221725&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 Dec 21 13:46:06 2011
@@ -17,6 +17,8 @@
 package org.apache.jackrabbit.mk.util;
 
 import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 /**
  * Utility methods to parse a JCR path.
@@ -196,6 +198,66 @@ public class PathUtils {
     }
 
     /**
+     * Split a path into elements. The root path ("/") and the empty path ("")
+     * is zero elements.
+     *
+     * @param path the path
+     * @return an Iterable for the path elements
+     */
+    public static Iterable<String> elements(final String path) {
+        assertValid(path);
+
+        final Iterator<String> it = new Iterator<String>() {
+            int pos = PathUtils.isAbsolute(path) ? 1 : 0;
+            String next;
+
+            public boolean hasNext() {
+                if (next == null) {
+                    if (pos >= path.length()) {
+                        return false;
+                    }
+                    else {
+                        int i = path.indexOf('/', pos);
+                        if (i < 0) {
+                            next = path.substring(pos);
+                            pos = path.length();
+                        }
+                        else {
+                            next = path.substring(pos, i);
+                            pos = i + 1;
+                        }
+                        return true;
+                    }
+                }
+                else {
+                    return true;
+                }
+            }
+
+            public String next() {
+                if (hasNext()) {
+                    String next = this.next;
+                    this.next = null;
+                    return next;
+                }
+                else {
+                    throw new NoSuchElementException();
+                }
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException("remove");
+            }
+        };
+
+        return new Iterable<String>() {
+            public Iterator<String> iterator() {
+                return it;
+            }
+        };
+    }
+
+    /**
      * Concatenate path elements.
      *
      * @param parentPath the parent path

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java?rev=1221725&r1=1221724&r2=1221725&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java Wed Dec 21 13:46:06 2011
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.mk.util;
 
 import junit.framework.TestCase;
 
+import java.util.Iterator;
+
 public class PathTest extends TestCase {
 
     public void test() {
@@ -326,4 +328,28 @@ public class PathTest extends TestCase {
         }
     }
 
+    public void testPathElements() {
+        String[] paths = new String[]{"", "/", "/a", "a", "/abc/def/ghj", "abc/def/ghj"};
+        for (String path : paths) {
+            String[] elements = PathUtils.split(path);
+            Iterator<String> it = PathUtils.elements(path).iterator();
+            for (String element : elements) {
+                assertTrue(it.hasNext());
+                assertEquals(element, it.next());
+            }
+            assertFalse(it.hasNext());
+        }
+        
+        String[] invalidPaths = new String[]{"//", "/a/", "a/", "/a//", "a//b"};
+        for (String path: invalidPaths) {
+            try {
+                PathUtils.elements(path);
+                fail();
+            }
+            catch (IllegalArgumentException e) {
+                // expected
+            }
+        }
+    }
+
 }