This is an automated email from the ASF dual-hosted git repository.

randgalt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/curator.git

commit 137159bb919cb7915eb1ddb3a3dfe369bd2253b9
Author: Ryan Ruel <[email protected]>
AuthorDate: Wed Aug 18 10:57:42 2021 -0400

    This commit reverts changes that altered the ZPath parse method based on  
incorrect assumptions about what a "resolved" ZPath actually is.
    
    I've added a few notes to the JavaDoc and unit tests to hopefully clear up 
confusion in this area in the future.
---
 .../org/apache/curator/x/async/modeled/ZPath.java    | 20 +++++++++++++-------
 .../curator/x/async/modeled/details/ZPathImpl.java   |  7 ++-----
 .../apache/curator/x/async/modeled/TestZPath.java    | 16 ++++++----------
 3 files changed, 21 insertions(+), 22 deletions(-)

diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
index e15a6bc..0958975 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
@@ -31,9 +31,6 @@ import static org.apache.curator.utils.ZKPaths.PATH_SEPARATOR;
  */
 public interface ZPath extends Resolvable
 {
-    String PARAMETER_OPENING_DELIMITER = "{";
-    String PARAMETER_CLOSING_DELIMITER = "}";
-
     /**
      * The root path: "/"
      */
@@ -55,11 +52,14 @@ public interface ZPath extends Resolvable
      */
     static String parameter(String name)
     {
-        return PATH_SEPARATOR + PARAMETER_OPENING_DELIMITER + name + 
PARAMETER_CLOSING_DELIMITER;
+        return PATH_SEPARATOR + "{" + name + "}";
     }
 
     /**
-     * Take a string path and return a ZPath
+     * Take a string path and return a ZPath.
+     * <p>
+     * Note: This method always produces a fully resolved path despite the 
presence of any parameter-like elements (i.e, {@code {one}}).
+     * For substituting parameter elements and for proper parameter resolution 
status checks, use {@code parseWithIds()} instead.
      *
      * @param fullPath the path to parse
      * @return ZPath
@@ -82,7 +82,7 @@ public interface ZPath extends Resolvable
      */
     static ZPath parseWithIds(String fullPath)
     {
-        return ZPathImpl.parse(fullPath, s -> isId(s) ? (PATH_SEPARATOR + s) : 
s); // TODO
+        return ZPathImpl.parse(fullPath, s -> isId(s) ? (PATH_SEPARATOR + s) : 
s);
     }
 
     /**
@@ -244,7 +244,13 @@ public interface ZPath extends Resolvable
     boolean isRoot();
 
     /**
-     * Return true if this path is fully resolved (i.e. has no unresolved 
parameters)
+     * Return true if this path is fully resolved (i.e. has no unresolved 
parameters).
+     * <p>
+     * Note: ZPath's returned by the {@code parse()} method are always 
considered fully resolved, despite if there are
+     * remaining elements in the path which appear to be parameters (but are 
not, i.e. {@code {one}}).
+     * <p>
+     * When working with parameters, use the {@code parseWithIds()} method, 
which returns a ZPath with a
+     * resolved state based on the presence of unresolved parameter elements 
in the ZPath.
      *
      * @return true/false
      */
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
index b04c4b4..fff742e 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
@@ -210,9 +210,7 @@ public class ZPathImpl implements ZPath
             .map(name -> {
                 if ( isParameter(name) && iterator.hasNext() )
                 {
-                    // Eliminate any leading path separator from substituted 
parameters, as ZPathImpl() will
-                    // add in all required path separators as part of it's 
build operation.
-                    return 
NodeName.nameFrom(iterator.next()).replaceAll(String.format("^%s+", 
PATH_SEPARATOR), "");
+                    return NodeName.nameFrom(iterator.next());
                 }
                 return name;
             })
@@ -228,8 +226,7 @@ public class ZPathImpl implements ZPath
 
     private static boolean isParameter(String name)
     {
-        return name.matches(String.format(".*\\%s.*\\%s", 
PARAMETER_OPENING_DELIMITER,
-            PARAMETER_CLOSING_DELIMITER));
+        return (name.length() > 1) && name.startsWith(PATH_SEPARATOR);
     }
 
     private ZPathImpl(List<String> nodes, String child)
diff --git 
a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
 
b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
index c1d4697..6dc4018 100644
--- 
a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
+++ 
b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
@@ -56,12 +56,15 @@ public class TestZPath
         assertTrue(path.startsWith(ZPath.root.child("one")));
         assertFalse(path.startsWith(ZPath.root.child("two")));
 
+        // Despite these paths containing elements which appear to be 
parameters, ZPath.parse() always returns
+        // a ZPath which is considered fully resolved.  This allows users to 
include parameter-like elements in their
+        // ZPath's that aren't treated as parameters.
         ZPath checkIdLike = ZPath.parse("/one/{two}/three");
-        assertFalse(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved(), "parse method always returns a 
fully resolved ZPath");
         checkIdLike = ZPath.parse("/one/" + ZPath.parameter() + "/three");
-        assertFalse(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved(), "parse method always returns a 
fully resolved ZPath");
         checkIdLike = ZPath.parse("/one/" + ZPath.parameter("others") + 
"/three");
-        assertFalse(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved(), "parse method always returns a 
fully resolved ZPath");
     }
 
     @Test
@@ -71,13 +74,6 @@ public class TestZPath
         assertEquals(ZPath.parse("/one/two/three"), 
ZPath.root.child("one").child("two").child("three"));
         assertEquals(ZPath.parse("/one/two/three"), ZPath.from("one", "two", 
"three"));
         assertEquals(ZPath.parseWithIds("/one/{id}/two/{id}"), 
ZPath.from("one", parameter(), "two", parameter()));
-
-        final ZPath rootPath = ZPath.parse("/root");
-        ZPath path = ZPath.parseWithIds("{root}/one/{id}/two/{id}");
-        assertFalse(path.isResolved());
-        path = path.resolved(rootPath.toString(), "foo", "bar");
-        assertEquals(ZPath.from("root", "one", "foo", "two", 
"bar").toString(), path.toString());
-        assertTrue(path.isResolved());
     }
 
     @Test

Reply via email to