You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ca...@apache.org on 2015/08/25 06:08:53 UTC
[33/50] curator git commit: CURATOR-236: TreeCache throws
IllegalArgumentException when node is a substring of the requested path
CURATOR-236: TreeCache throws IllegalArgumentException when node is a substring of the requested path
Better path walking algorithm.
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/a63bb03e
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/a63bb03e
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/a63bb03e
Branch: refs/heads/CURATOR-167
Commit: a63bb03e590460985b729cb2fd1a4a5e7ed345ba
Parents: e71da8f
Author: Scott Blum <dr...@apache.org>
Authored: Thu Jul 16 17:50:32 2015 -0400
Committer: Scott Blum <dr...@apache.org>
Committed: Thu Jul 16 17:50:32 2015 -0400
----------------------------------------------------------------------
.../framework/recipes/cache/TreeCache.java | 45 +++++++++++---------
.../framework/recipes/cache/TestTreeCache.java | 5 +++
2 files changed, 30 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/curator/blob/a63bb03e/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
----------------------------------------------------------------------
diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
index 71efd28..7cf2267 100644
--- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
+++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
@@ -33,6 +33,7 @@ import org.apache.curator.framework.listen.ListenerContainer;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.utils.CloseableExecutorService;
+import org.apache.curator.utils.PathUtils;
import org.apache.curator.utils.ThreadUtils;
import org.apache.curator.utils.ZKPaths;
import org.apache.zookeeper.KeeperException;
@@ -44,6 +45,7 @@ import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
@@ -601,33 +603,36 @@ public class TreeCache implements Closeable
return errorListeners;
}
- private TreeNode find(String fullPath)
+ private TreeNode find(String findPath)
{
- if ( !fullPath.startsWith(root.path) )
- {
- return null;
+ PathUtils.validatePath(findPath);
+ LinkedList<String> rootElements = new LinkedList<String>(ZKPaths.split(root.path));
+ LinkedList<String> findElements = new LinkedList<String>(ZKPaths.split(findPath));
+ while (!rootElements.isEmpty()) {
+ if (findElements.isEmpty()) {
+ // Target path shorter than root path
+ return null;
+ }
+ String nextRoot = rootElements.removeFirst();
+ String nextFind = findElements.removeFirst();
+ if (!nextFind.equals(nextRoot)) {
+ // Initial root path does not match
+ return null;
+ }
}
TreeNode current = root;
- if ( fullPath.length() > root.path.length() )
- {
- if ( root.path.length() > 1 )
+ while (!findElements.isEmpty()) {
+ String nextFind = findElements.removeFirst();
+ ConcurrentMap<String, TreeNode> map = current.children.get();
+ if ( map == null )
{
- fullPath = fullPath.substring(root.path.length());
+ return null;
}
- List<String> split = ZKPaths.split(fullPath);
- for ( String part : split )
+ current = map.get(nextFind);
+ if ( current == null )
{
- ConcurrentMap<String, TreeNode> map = current.children.get();
- if ( map == null )
- {
- return null;
- }
- current = map.get(part);
- if ( current == null )
- {
- return null;
- }
+ return null;
}
}
return current;
http://git-wip-us.apache.org/repos/asf/curator/blob/a63bb03e/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
----------------------------------------------------------------------
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
index e1c61d0..0bccb54 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
@@ -395,11 +395,16 @@ public class TestTreeCache extends BaseTestTreeCache
assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test");
assertEvent(TreeCacheEvent.Type.INITIALIZED);
Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
+ Assert.assertNull(cache.getCurrentChildren("/t"));
+ Assert.assertNull(cache.getCurrentChildren("/testing"));
client.create().forPath("/test/one", "hey there".getBytes());
assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+ Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+ Assert.assertNull(cache.getCurrentChildren("/test/o"));
+ Assert.assertNull(cache.getCurrentChildren("/test/onely"));
client.setData().forPath("/test/one", "sup!".getBytes());
assertEvent(TreeCacheEvent.Type.NODE_UPDATED, "/test/one");