Added Versioned facade for easy management of models with versions
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/beac06f1 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/beac06f1 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/beac06f1 Branch: refs/heads/CURATOR-397 Commit: beac06f136f26dd3dabb754dcb999876d614244b Parents: 23a1487 Author: randgalt <[email protected]> Authored: Tue May 9 23:16:54 2017 +0200 Committer: randgalt <[email protected]> Committed: Tue May 9 23:16:54 2017 +0200 ---------------------------------------------------------------------- .../x/async/modeled/ModeledFramework.java | 8 +++ .../details/CachedModeledFrameworkImpl.java | 9 ++- .../modeled/details/ModeledFrameworkImpl.java | 25 ++++---- .../details/VersionedModeledFrameworkImpl.java | 66 ++++++++++++++++++++ .../x/async/modeled/versioned/Versioned.java | 51 +++++++++++++++ .../versioned/VersionedModeledFramework.java | 38 +++++++++++ 6 files changed, 184 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java index 0a74938..cb511d3 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java @@ -23,6 +23,7 @@ import org.apache.curator.framework.api.transaction.CuratorTransactionResult; import org.apache.curator.x.async.AsyncCuratorFramework; import org.apache.curator.x.async.AsyncStage; import org.apache.curator.x.async.modeled.cached.CachedModeledFramework; +import org.apache.curator.x.async.modeled.versioned.VersionedModeledFramework; import org.apache.zookeeper.data.Stat; import java.util.List; import java.util.concurrent.ExecutorService; @@ -91,6 +92,13 @@ public interface ModeledFramework<T> CachedModeledFramework<T> cached(ExecutorService executor); /** + * Return mutator APIs that work with {@link org.apache.curator.x.async.modeled.versioned.Versioned} containers + * + * @return wrapped instance + */ + VersionedModeledFramework<T> versioned(); + + /** * Returns the client that was originally passed to {@link #wrap(org.apache.curator.x.async.AsyncCuratorFramework, ModelSpec)} or * the builder. * http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java index 8359ae0..9339ecc 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java @@ -26,11 +26,12 @@ import org.apache.curator.x.async.AsyncCuratorFramework; import org.apache.curator.x.async.AsyncStage; import org.apache.curator.x.async.modeled.ModelSpec; import org.apache.curator.x.async.modeled.ModeledFramework; +import org.apache.curator.x.async.modeled.ZNode; import org.apache.curator.x.async.modeled.ZPath; import org.apache.curator.x.async.modeled.cached.CachedModeledFramework; import org.apache.curator.x.async.modeled.cached.ModeledCache; import org.apache.curator.x.async.modeled.cached.ModeledCacheListener; -import org.apache.curator.x.async.modeled.ZNode; +import org.apache.curator.x.async.modeled.versioned.VersionedModeledFramework; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.data.Stat; import org.apache.zookeeper.server.DataTree; @@ -96,6 +97,12 @@ class CachedModeledFrameworkImpl<T> implements CachedModeledFramework<T> } @Override + public VersionedModeledFramework<T> versioned() + { + return new VersionedModeledFrameworkImpl<>(this); + } + + @Override public AsyncCuratorFramework unwrap() { return client.unwrap(); http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java index ba67a71..855b4d4 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java @@ -38,10 +38,10 @@ import org.apache.curator.x.async.modeled.ModeledFramework; import org.apache.curator.x.async.modeled.ZNode; import org.apache.curator.x.async.modeled.ZPath; import org.apache.curator.x.async.modeled.cached.CachedModeledFramework; +import org.apache.curator.x.async.modeled.versioned.VersionedModeledFramework; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.server.DataTree; import java.util.List; import java.util.Objects; import java.util.Set; @@ -114,6 +114,12 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> } @Override + public VersionedModeledFramework<T> versioned() + { + return new VersionedModeledFrameworkImpl<>(this); + } + + @Override public ModelSpec<T> modelSpec() { return modelSpec; @@ -169,25 +175,19 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> @Override public AsyncStage<T> read() { - return internalRead(ZNode::model); + return internalRead(ZNode::model, null); } @Override public AsyncStage<T> read(Stat storingStatIn) { - return internalRead(n -> { - if ( storingStatIn != null ) - { - DataTree.copyStat(n.stat(), storingStatIn); - } - return n.model(); - }); + return internalRead(ZNode::model, storingStatIn); } @Override public AsyncStage<ZNode<T>> readAsZNode() { - return internalRead(Function.identity()); + return internalRead(Function.identity(), null); } @Override @@ -349,9 +349,9 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> return modelSpec.createOptions().contains(CreateOption.compress); } - private <U> ModelStage<U> internalRead(Function<ZNode<T>, U> resolver) + private <U> ModelStage<U> internalRead(Function<ZNode<T>, U> resolver, Stat storingStatIn) { - Stat stat = new Stat(); + Stat stat = (storingStatIn != null) ? storingStatIn : new Stat(); AsyncPathable<AsyncStage<byte[]>> next = isCompressed() ? watchableClient.getData().decompressedStoringStatIn(stat) : watchableClient.getData().storingStatIn(stat); AsyncStage<byte[]> asyncStage = next.forPath(modelSpec.path().fullPath()); ModelStage<U> modelStage = new ModelStage<>(asyncStage.event()); @@ -375,4 +375,5 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> }); return modelStage; } + } http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/VersionedModeledFrameworkImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/VersionedModeledFrameworkImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/VersionedModeledFrameworkImpl.java new file mode 100644 index 0000000..0f4e86a --- /dev/null +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/VersionedModeledFrameworkImpl.java @@ -0,0 +1,66 @@ +package org.apache.curator.x.async.modeled.details; + +import org.apache.curator.framework.api.transaction.CuratorOp; +import org.apache.curator.x.async.AsyncStage; +import org.apache.curator.x.async.modeled.ModeledFramework; +import org.apache.curator.x.async.modeled.versioned.Versioned; +import org.apache.curator.x.async.modeled.versioned.VersionedModeledFramework; +import org.apache.zookeeper.data.Stat; + +class VersionedModeledFrameworkImpl<T> implements VersionedModeledFramework<T> +{ + private final ModeledFramework<T> client; + + VersionedModeledFrameworkImpl(ModeledFramework<T> client) + { + this.client = client; + } + + @Override + public AsyncStage<String> set(Versioned<T> model) + { + return client.set(model.model(), model.version()); + } + + @Override + public AsyncStage<String> set(Versioned<T> model, Stat storingStatIn) + { + return client.set(model.model(), storingStatIn, model.version()); + } + + @Override + public AsyncStage<Versioned<T>> read() + { + return read(null); + } + + @Override + public AsyncStage<Versioned<T>> read(Stat storingStatIn) + { + Stat localStat = (storingStatIn != null) ? storingStatIn : new Stat(); + ModelStage<Versioned<T>> modelStage = new ModelStage<>(); + client.read(localStat).whenComplete((model, e) -> { + if ( e != null ) + { + modelStage.completeExceptionally(e); + } + else + { + modelStage.complete(Versioned.from(model, localStat.getVersion())); + } + }); + return modelStage; + } + + @Override + public AsyncStage<Stat> update(Versioned<T> model) + { + return client.update(model.model(), model.version()); + } + + @Override + public CuratorOp updateOp(Versioned<T> model) + { + return client.updateOp(model.model(), model.version()); + } +} http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/Versioned.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/Versioned.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/Versioned.java new file mode 100644 index 0000000..6f732a6 --- /dev/null +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/Versioned.java @@ -0,0 +1,51 @@ +package org.apache.curator.x.async.modeled.versioned; + +/** + * A container for a model instance and a version. Can be used with the + * {@link org.apache.curator.x.async.modeled.ModeledFramework#versioned()} APIs + */ +@FunctionalInterface +public interface Versioned<T> +{ + /** + * Returns the contained model + * + * @return model + */ + T model(); + + /** + * Returns the version of the model when it was read + * + * @return version + */ + default int version() + { + return -1; + } + + /** + * Return a new Versioned wrapper for the given model and version + * + * @param model model + * @param version version + * @return new Versioned wrapper + */ + static <T> Versioned<T> from(T model, int version) + { + return new Versioned<T>() + { + @Override + public int version() + { + return version; + } + + @Override + public T model() + { + return model; + } + }; + } +} http://git-wip-us.apache.org/repos/asf/curator/blob/beac06f1/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/VersionedModeledFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/VersionedModeledFramework.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/VersionedModeledFramework.java new file mode 100644 index 0000000..a3aaf8d --- /dev/null +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/versioned/VersionedModeledFramework.java @@ -0,0 +1,38 @@ +package org.apache.curator.x.async.modeled.versioned; + +import org.apache.curator.framework.api.transaction.CuratorOp; +import org.apache.curator.x.async.AsyncStage; +import org.apache.zookeeper.data.Stat; + +public interface VersionedModeledFramework<T> +{ + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#set(Object) + */ + AsyncStage<String> set(Versioned<T> model); + + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#set(Object, org.apache.zookeeper.data.Stat) + */ + AsyncStage<String> set(Versioned<T> model, Stat storingStatIn); + + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#read() + */ + AsyncStage<Versioned<T>> read(); + + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#read(org.apache.zookeeper.data.Stat) + */ + AsyncStage<Versioned<T>> read(Stat storingStatIn); + + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#updateOp(Object) + */ + AsyncStage<Stat> update(Versioned<T> model); + + /** + * @see org.apache.curator.x.async.modeled.ModeledFramework#updateOp(Object) + */ + CuratorOp updateOp(Versioned<T> model); +}
