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 md...@apache.org on 2013/12/20 23:05:20 UTC

svn commit: r1552816 - in /jackrabbit/oak/trunk/oak-commons/src: main/java/org/apache/jackrabbit/oak/commons/PathUtils.java test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java

Author: mduerig
Date: Fri Dec 20 22:05:19 2013
New Revision: 1552816

URL: http://svn.apache.org/r1552816
Log:
OAK-1302: PathUtils.elements returns stale iterator on subsequent calls to iterator()
Return a fresh iterator instance on each call to iterator()

Modified:
    jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java
    jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java

Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java?rev=1552816&r1=1552815&r2=1552816&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java Fri Dec 20 22:05:19 2013
@@ -215,48 +215,46 @@ public final class PathUtils {
     public static Iterable<String> elements(final String path) {
         assert isValid(path) : "Invalid path ["+path+"]";
 
-        final Iterator<String> it = new Iterator<String>() {
-            int pos = PathUtils.isAbsolute(path) ? 1 : 0;
-            String next;
-
+        return new Iterable<String>() {
             @Override
-            public boolean hasNext() {
-                if (next == null) {
-                    if (pos >= path.length()) {
-                        return false;
-                    }
-                    int i = path.indexOf('/', pos);
-                    if (i < 0) {
-                        next = path.substring(pos);
-                        pos = path.length();
-                    } else {
-                        next = path.substring(pos, i);
-                        pos = i + 1;
+            public Iterator<String> iterator() {
+                return new Iterator<String>() {
+                    int pos = isAbsolute(path) ? 1 : 0;
+                    String next;
+
+                    @Override
+                    public boolean hasNext() {
+                        if (next == null) {
+                            if (pos >= path.length()) {
+                                return false;
+                            }
+                            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;
                     }
-                }
-                return true;
-            }
-
-            @Override
-            public String next() {
-                if (hasNext()) {
-                    String next = this.next;
-                    this.next = null;
-                    return next;
-                }
-                throw new NoSuchElementException();
-            }
 
-            @Override
-            public void remove() {
-                throw new UnsupportedOperationException("remove");
-            }
-        };
+                    @Override
+                    public String next() {
+                        if (hasNext()) {
+                            String next = this.next;
+                            this.next = null;
+                            return next;
+                        }
+                        throw new NoSuchElementException();
+                    }
 
-        return new Iterable<String>() {
-            @Override
-            public Iterator<String> iterator() {
-                return it;
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException("remove");
+                    }
+                };
             }
         };
     }

Modified: jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java?rev=1552816&r1=1552815&r2=1552816&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/PathUtilsTest.java Fri Dec 20 22:05:19 2013
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.common
 
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
+import org.junit.Assert;
 import org.junit.Test;
 
 /**
@@ -458,4 +459,21 @@ public class PathUtilsTest extends TestC
         }
     }
 
+    public void testElements() {
+        String path = "a/b/c";
+        String[] elementsArray = path.split("/");
+        Iterable<String> elementsIterable = PathUtils.elements(path);
+        int k = 0;
+        for (String name : elementsIterable) {
+            Assert.assertEquals(elementsArray[k++], name);
+        }
+        assertEquals(3, k);
+
+        k = 0;
+        for (String name : elementsIterable) {
+            Assert.assertEquals(elementsArray[k++], name);
+        }
+        assertEquals(3, k);
+    }
+
 }