You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2017/05/09 21:17:05 UTC
[6/6] curator git commit: Added Versioned facade for easy management
of models with versions
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 <ra...@apache.org>
Authored: Tue May 9 23:16:54 2017 +0200
Committer: randgalt <ra...@apache.org>
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);
+}