Repository: curator Updated Branches: refs/heads/CURATOR-397 019caeea6 -> e8c68188d
doc Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/e8c68188 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/e8c68188 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/e8c68188 Branch: refs/heads/CURATOR-397 Commit: e8c68188d04df30eb91751f09360bb267fbe1c25 Parents: 019caee Author: randgalt <randg...@apache.org> Authored: Sat Apr 8 22:35:33 2017 -0500 Committer: randgalt <randg...@apache.org> Committed: Sat Apr 8 22:35:33 2017 -0500 ---------------------------------------------------------------------- .../curator/x/async/modeled/ModeledDetails.java | 3 + .../details/recipes/ModeledNodeCacheImpl.java | 6 +- .../recipes/ModeledPathChildrenCacheImpl.java | 4 +- .../details/recipes/ModeledTreeCacheImpl.java | 15 ++- .../modeled/recipes/ModeledCacheEvent.java | 13 +++ .../modeled/recipes/ModeledCacheListener.java | 3 + .../modeled/recipes/ModeledCachedNode.java | 102 +++++-------------- .../async/modeled/recipes/ModeledNodeCache.java | 40 +++++++- .../recipes/ModeledPathChildrenCache.java | 66 +++++++++++- .../async/modeled/recipes/ModeledTreeCache.java | 44 ++++++++ 10 files changed, 209 insertions(+), 87 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledDetails.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledDetails.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledDetails.java index 65afc94..c9579d7 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledDetails.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledDetails.java @@ -21,6 +21,9 @@ package org.apache.curator.x.async.modeled; import org.apache.curator.x.async.api.CreateOption; import java.util.Set; +/** + * Modeling options + */ public interface ModeledDetails<T> { /** http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java index 991119f..8270b78 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledNodeCacheImpl.java @@ -42,7 +42,7 @@ public class ModeledNodeCacheImpl<T> implements ModeledNodeCache<T> } @Override - public NodeCache upwrap() + public NodeCache unwrap() { return cache; } @@ -108,9 +108,9 @@ public class ModeledNodeCacheImpl<T> implements ModeledNodeCache<T> } if ( (data == null) || (data.length == 0) ) { - return Optional.of(new ModeledCachedNode<T>(modeled.getPath(), null, stat)); + return Optional.of(new ModeledCachedNodeImpl<T>(modeled.getPath(), null, stat)); } - return Optional.of(new ModeledCachedNode<>(modeled.getPath(), modeled.getSerializer().deserialize(data), stat)); + return Optional.of(new ModeledCachedNodeImpl<>(modeled.getPath(), modeled.getSerializer().deserialize(data), stat)); } @Override http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java index d0ee681..c8b569d 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java @@ -47,7 +47,7 @@ public class ModeledPathChildrenCacheImpl<T> implements ModeledPathChildrenCache private final PathChildrenCache cache; private final Map<ModeledCacheListener, PathChildrenCacheListener> listenerMap = new ConcurrentHashMap<>(); - public ModeledPathChildrenCacheImpl(PathChildrenCache cache, ModeledDetails<T> modeled) + public ModeledPathChildrenCacheImpl(ModeledDetails<T> modeled, PathChildrenCache cache) { this.modeled = Objects.requireNonNull(modeled, "modeled cannot be null"); this.cache = Objects.requireNonNull(cache, "cache cannot be null"); @@ -216,7 +216,7 @@ public class ModeledPathChildrenCacheImpl<T> implements ModeledPathChildrenCache return null; } T model = (data.getData() != null) ? modeled.getSerializer().deserialize(data.getData()) : null; - return new ModeledCachedNode<>(ZPath.parse(data.getPath()), model, data.getStat()); + return new ModeledCachedNodeImpl<>(ZPath.parse(data.getPath()), model, data.getStat()); } @VisibleForTesting http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java index 542ad23..20a1bc7 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java @@ -21,6 +21,7 @@ package org.apache.curator.x.async.modeled.details.recipes; import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.MoreExecutors; import org.apache.curator.framework.listen.Listenable; +import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.TreeCache; import org.apache.curator.framework.recipes.cache.TreeCacheEvent; import org.apache.curator.framework.recipes.cache.TreeCacheListener; @@ -33,6 +34,7 @@ import org.apache.curator.x.async.modeled.recipes.ModeledCacheListener; import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode; import org.apache.curator.x.async.modeled.recipes.ModeledTreeCache; import java.util.AbstractMap; +import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -55,6 +57,12 @@ public class ModeledTreeCacheImpl<T> implements ModeledTreeCache<T> } @Override + public TreeCache unwrap() + { + return cache; + } + + @Override public void start() { try @@ -122,7 +130,12 @@ public class ModeledTreeCacheImpl<T> implements ModeledTreeCache<T> @Override public Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath) { - return cache.getCurrentChildren(fullPath.fullPath()).entrySet().stream() + Map<String, ChildData> currentChildren = cache.getCurrentChildren(fullPath.fullPath()); + if ( currentChildren == null ) + { + return Collections.emptyMap(); + } + return currentChildren.entrySet().stream() .map(entry -> new AbstractMap.SimpleEntry<>(ZPath.parse(entry.getKey()), from(modeled, entry.getValue()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java index 442e31c..b84b1c3 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheEvent.java @@ -20,9 +20,22 @@ package org.apache.curator.x.async.modeled.recipes; import java.util.Optional; +/** + * Abstracts a cache event + */ public interface ModeledCacheEvent<T> { + /** + * The event type + * + * @return event type + */ ModeledCacheEventType getType(); + /** + * Cached node if appropriate for the event + * + * @return node + */ Optional<ModeledCachedNode<T>> getNode(); } http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java index 88c7de0..71a035f 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCacheListener.java @@ -18,6 +18,9 @@ */ package org.apache.curator.x.async.modeled.recipes; +/** + * Event listener + */ public interface ModeledCacheListener<T> { void event(ModeledCacheEvent<T> event); http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCachedNode.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCachedNode.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCachedNode.java index 8982396..3808029 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCachedNode.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCachedNode.java @@ -20,85 +20,31 @@ package org.apache.curator.x.async.modeled.recipes; import org.apache.curator.x.async.modeled.ZPath; import org.apache.zookeeper.data.Stat; -import java.util.Objects; import java.util.Optional; -public class ModeledCachedNode<T> +/** + * Abstracts a cached node + */ +public interface ModeledCachedNode<T> { - private final ZPath path; - private final Stat stat; - private final Optional<T> data; - - public ModeledCachedNode(ZPath path) - { - this(path, null, new Stat()); - } - - public ModeledCachedNode(ZPath path, T data) - { - this(path, data, new Stat()); - } - - public ModeledCachedNode(ZPath path, T data, Stat stat) - { - this.path = Objects.requireNonNull(path, "path cannot be null"); - this.data = Optional.ofNullable(data); - this.stat = Objects.requireNonNull(stat, "stat cannot be null"); - } - - public ZPath getPath() - { - return path; - } - - public Stat getStat() - { - return stat; - } - - public Optional<T> getData() - { - return data; - } - - @Override - public boolean equals(Object o) - { - if ( this == o ) - { - return true; - } - if ( o == null || getClass() != o.getClass() ) - { - return false; - } - - ModeledCachedNode<?> that = (ModeledCachedNode<?>)o; - - if ( !path.equals(that.path) ) - { - return false; - } - //noinspection SimplifiableIfStatement - if ( !stat.equals(that.stat) ) - { - return false; - } - return data.equals(that.data); - } - - @Override - public int hashCode() - { - int result = path.hashCode(); - result = 31 * result + stat.hashCode(); - result = 31 * result + data.hashCode(); - return result; - } - - @Override - public String toString() - { - return "ModeledCachedNode{" + "stat=" + stat + ", data=" + data + '}'; - } + /** + * The path of the node + * + * @return path + */ + ZPath getPath(); + + /** + * The node's last known stat if available + * + * @return stat + */ + Stat getStat(); + + /** + * The node's current data + * + * @return data + */ + Optional<T> getData(); } http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java index d5650b3..0a7064a 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java @@ -26,24 +26,62 @@ import org.apache.curator.x.async.modeled.details.recipes.ModeledNodeCacheImpl; import java.io.Closeable; import java.util.Optional; +/** + * Wraps a {@link org.apache.curator.framework.recipes.cache.NodeCache} so that + * node data can be viewed as strongly typed models. + */ public interface ModeledNodeCache<T> extends Closeable { + /** + * Return a newly wrapped cache + * + * @param modeled modeling options + * @param cache the cache to wrap + * @return new wrapped cache + */ static <T> ModeledNodeCache wrap(ModeledDetails<T> modeled, NodeCache cache) { return new ModeledNodeCacheImpl<>(modeled, cache); } - NodeCache upwrap(); + /** + * Return the original cache that was wrapped + * + * @return cache + */ + NodeCache unwrap(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.NodeCache#start()} + */ void start(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.NodeCache#start(boolean)} + */ void start(boolean buildInitial); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.NodeCache#rebuild()} + */ void rebuild(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.NodeCache#getListenable()} + */ Listenable<NodeCacheListener> getListenable(); + /** + * Return the modeled current data. There are no guarantees of accuracy. This is + * merely the most recent view of the data. If the node does not exist, + * this returns {@link java.util.Optional#empty()} is returned + * + * @return node data + */ Optional<ModeledCachedNode<T>> getCurrentData(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.NodeCache#close()} + */ void close(); } http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java index fd27c12..f192dbf 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledPathChildrenCache.java @@ -27,36 +27,98 @@ import java.io.Closeable; import java.util.List; import java.util.Optional; +/** + * Wraps a {@link org.apache.curator.framework.recipes.cache.PathChildrenCache} so that + * node data can be viewed as strongly typed models. + */ public interface ModeledPathChildrenCache<T> extends Closeable { - static <T> ModeledPathChildrenCache<T> wrap(PathChildrenCache cache, ModeledDetails<T> modeled) + /** + * Return a newly wrapped cache + * + * @param modeled modeling options + * @param cache the cache to wrap + * @return new wrapped cache + */ + static <T> ModeledPathChildrenCache<T> wrap(ModeledDetails<T> modeled, PathChildrenCache cache) { - return new ModeledPathChildrenCacheImpl<>(cache, modeled); + return new ModeledPathChildrenCacheImpl<>(modeled, cache); } + /** + * Return the original cache that was wrapped + * + * @return cache + */ PathChildrenCache unwrap(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#start()} + */ void start(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#start(org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode)} + */ void start(PathChildrenCache.StartMode mode); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#rebuild()} + */ void rebuild(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#rebuildNode(String)} + */ void rebuildNode(ZPath fullPath); + /** + * Return the listener container so that you can add/remove listeners + * + * @return listener container + */ Listenable<ModeledCacheListener<T>> getListenable(); + /** + * Return the modeled current data. There are no guarantees of accuracy. This is + * merely the most recent view of the data. The data is returned in sorted order. + * + * @return list of children and data + */ List<ModeledCachedNode> getCurrentData(); + /** + * Return the modeled current data for the given path. There are no guarantees of accuracy. This is + * merely the most recent view of the data. If there is no child with that path + * {@link java.util.Optional#empty()} is returned. + * + * @param fullPath full path to the node to check + * @return data or null + */ Optional<ModeledCachedNode> getCurrentData(String fullPath); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#clearDataBytes(String)} + */ void clearDataBytes(ZPath fullPath); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#clearDataBytes(String, int)} + */ boolean clearDataBytes(ZPath fullPath, int ifVersion); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#clearAndRefresh()} + */ void clearAndRefresh(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#clear()} + */ void clear(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.PathChildrenCache#close()} + */ void close(); } http://git-wip-us.apache.org/repos/asf/curator/blob/e8c68188/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java index ec49b8b..2b6c817 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java @@ -27,20 +27,64 @@ import java.io.Closeable; import java.util.Map; import java.util.Optional; +/** + * Wraps a {@link org.apache.curator.framework.recipes.cache.TreeCache} so that + * node data can be viewed as strongly typed models. + */ public interface ModeledTreeCache<T> extends Closeable { + /** + * Return a newly wrapped cache + * + * @param modeled modeling options + * @param cache the cache to wrap + * @return new wrapped cache + */ static <T> ModeledTreeCache<T> wrap(ModeledDetails<T> modeled, TreeCache cache) { return new ModeledTreeCacheImpl<>(modeled, cache); } + /** + * Return the original cache that was wrapped + * + * @return cache + */ + TreeCache unwrap(); + + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.TreeCache#start()} + */ void start(); + /** + * Forwards to {@link org.apache.curator.framework.recipes.cache.TreeCache#close()} + */ void close(); + /** + * Return the listener container so that you can add/remove listeners + * + * @return listener container + */ Listenable<ModeledCacheListener<T>> getListenable(); + /** + * Return the modeled current set of children at the given path, mapped by child name. There are no + * guarantees of accuracy; this is merely the most recent view of the data. + * + * @param fullPath full path to the node to check + * @return a possibly-empty list of children if the node is alive, or null + */ Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath); + /** + * Return the modeled current data for the given path. There are no guarantees of accuracy. This is + * merely the most recent view of the data. If there is no node at the given path, + * {@link java.util.Optional#empty()} is returned. + * + * @param fullPath full path to the node to check + * @return data if the node is alive, or null + */ Optional<ModeledCachedNode<T>> getCurrentData(ZPath fullPath); }