Added getChildren
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/6188fe6c Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/6188fe6c Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/6188fe6c Branch: refs/heads/CURATOR-397 Commit: 6188fe6cee6b2a433f1c686adc660216a0aa1648 Parents: e512b5e Author: randgalt <randg...@apache.org> Authored: Tue Apr 18 09:43:48 2017 -0500 Committer: randgalt <randg...@apache.org> Committed: Tue Apr 18 09:43:48 2017 -0500 ---------------------------------------------------------------------- .../async/modeled/ModeledCuratorFramework.java | 23 +++++++++----- .../x/async/modeled/details/ModelStage.java | 21 ++++++++++++- .../details/ModeledCuratorFrameworkImpl.java | 32 ++++++++++++++------ .../modeled/TestModeledCuratorFramework.java | 15 +++++++++ 4 files changed, 74 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/6188fe6c/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java index 249e505..00335d4 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java @@ -24,6 +24,7 @@ import org.apache.curator.x.async.AsyncStage; import org.apache.curator.x.async.api.CreateOption; import org.apache.curator.x.async.api.DeleteOption; import org.apache.zookeeper.data.Stat; +import java.util.List; import java.util.Set; public interface ModeledCuratorFramework<T> @@ -140,27 +141,35 @@ public interface ModeledCuratorFramework<T> AsyncStage<Stat> update(T model, int version); /** - * Check to see if the ZNode at this instance's path exists + * Delete the ZNode at this instance's path passing -1 for the delete version * * @return AsyncStage * @see org.apache.curator.x.async.AsyncStage */ - AsyncStage<Stat> checkExists(); + AsyncStage<Void> delete(); /** - * Delete the ZNode at this instance's path passing -1 for the delete version + * Delete the ZNode at this instance's path passing the given delete version * + * @param version update version to use * @return AsyncStage * @see org.apache.curator.x.async.AsyncStage */ - AsyncStage<Void> delete(); + AsyncStage<Void> delete(int version); /** - * Delete the ZNode at this instance's path passing the given delete version + * Check to see if the ZNode at this instance's path exists * - * @param version update version to use * @return AsyncStage * @see org.apache.curator.x.async.AsyncStage */ - AsyncStage<Void> delete(int version); + AsyncStage<Stat> checkExists(); + + /** + * Return the child paths of this instance's paths (in no particular order) + * + * @return AsyncStage + * @see org.apache.curator.x.async.AsyncStage + */ + AsyncStage<List<ZPath>> getChildren(); } http://git-wip-us.apache.org/repos/asf/curator/blob/6188fe6c/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java index 077bbb0..41523cc 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java @@ -19,8 +19,27 @@ package org.apache.curator.x.async.modeled.details; import org.apache.curator.x.async.AsyncStage; +import org.apache.zookeeper.WatchedEvent; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; -abstract class ModelStage<T> extends CompletableFuture<T> implements AsyncStage<T> +class ModelStage<T> extends CompletableFuture<T> implements AsyncStage<T> { + private final CompletionStage<WatchedEvent> event; + + ModelStage() + { + this(null); + } + + ModelStage(CompletionStage<WatchedEvent> event) + { + this.event = event; + } + + @Override + public CompletionStage<WatchedEvent> event() + { + return event; + } } http://git-wip-us.apache.org/repos/asf/curator/blob/6188fe6c/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledCuratorFrameworkImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledCuratorFrameworkImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledCuratorFrameworkImpl.java index 1dd04db..6898b2d 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledCuratorFrameworkImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledCuratorFrameworkImpl.java @@ -34,6 +34,7 @@ import org.apache.curator.x.async.api.DeleteOption; import org.apache.curator.x.async.api.WatchableAsyncCuratorFramework; import org.apache.curator.x.async.modeled.ModelSerializer; import org.apache.curator.x.async.modeled.ModeledCuratorFramework; +import org.apache.curator.x.async.modeled.ZPath; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.data.ACL; @@ -42,14 +43,15 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.concurrent.CompletionStage; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; public class ModeledCuratorFrameworkImpl<T> implements ModeledCuratorFramework<T> { private final AsyncCuratorFramework client; private final WatchableAsyncCuratorFramework watchableClient; private final String path; + private final ZPath zPath; private final ModelSerializer<T> serializer; private final WatchMode watchMode; private final UnaryOperator<WatchedEvent> watcherFilter; @@ -79,6 +81,7 @@ public class ModeledCuratorFrameworkImpl<T> implements ModeledCuratorFramework<T dslClient = this.client.with(this.watchMode, unhandledErrorListener, resultFilter, watcherFilter); watchableClient = localIsWatched ? dslClient.watched() : dslClient; + zPath = ZPath.parse(path); } @Override @@ -119,14 +122,7 @@ public class ModeledCuratorFrameworkImpl<T> implements ModeledCuratorFramework<T next = (storingStatIn != null) ? watchableClient.getData().storingStatIn(storingStatIn) : watchableClient.getData(); } AsyncStage<byte[]> asyncStage = next.forPath(path); - ModelStage<T> modelStage = new ModelStage<T>() - { - @Override - public CompletionStage<WatchedEvent> event() - { - return asyncStage.event(); - } - }; + ModelStage<T> modelStage = new ModelStage<>(asyncStage.event()); asyncStage.whenComplete((value, e) -> { if ( e != null ) { @@ -173,6 +169,24 @@ public class ModeledCuratorFrameworkImpl<T> implements ModeledCuratorFramework<T } @Override + public AsyncStage<List<ZPath>> getChildren() + { + AsyncStage<List<String>> asyncStage = watchableClient.getChildren().forPath(path); + ModelStage<List<ZPath>> modelStage = new ModelStage<>(asyncStage.event()); + asyncStage.whenComplete((children, e) -> { + if ( e != null ) + { + modelStage.completeExceptionally(e); + } + else + { + modelStage.complete(children.stream().map(zPath::at).collect(Collectors.toList())); + } + }); + return modelStage; + } + + @Override public ModeledCuratorFramework<T> at(String child) { String childPath = ZKPaths.makePath(path, child); http://git-wip-us.apache.org/repos/asf/curator/blob/6188fe6c/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledCuratorFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledCuratorFramework.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledCuratorFramework.java index 8e76536..ac4c607 100644 --- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledCuratorFramework.java +++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledCuratorFramework.java @@ -18,6 +18,7 @@ */ package org.apache.curator.x.async.modeled; +import com.google.common.collect.Sets; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.RetryOneTime; @@ -31,6 +32,7 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.math.BigInteger; +import java.util.Set; import java.util.concurrent.CountDownLatch; public class TestModeledCuratorFramework extends CompletableBaseClassForTests @@ -99,4 +101,17 @@ public class TestModeledCuratorFramework extends CompletableBaseClassForTests client.create(new TestModel()); Assert.assertTrue(timing.awaitLatch(latch)); } + + @Test + public void testGetChildren() + { + TestModel model = new TestModel("John", "Galt", "1 Galt's Gulch", 42, BigInteger.valueOf(1)); + ModeledCuratorFramework<TestModel> client = ModeledCuratorFramework.builder(rawClient, path, serializer).build(); + complete(client.at("one").create(model)); + complete(client.at("two").create(model)); + complete(client.at("three").create(model)); + + Set<ZPath> expected = Sets.newHashSet(path.at("one"), path.at("two"), path.at("three")); + complete(client.getChildren(), (children, e) -> Assert.assertEquals(Sets.newHashSet(children), expected)); + } }