Support setting the version when doing a create or set operation

Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/1110ab3b
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/1110ab3b
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/1110ab3b

Branch: refs/heads/CURATOR-397
Commit: 1110ab3bbc55748c053adcd909cc0d82be84309d
Parents: c187839
Author: randgalt <[email protected]>
Authored: Sun May 7 09:55:28 2017 +0200
Committer: randgalt <[email protected]>
Committed: Sun May 7 09:55:28 2017 +0200

----------------------------------------------------------------------
 .../framework/imps/CreateBuilderImpl.java       | 10 +++++--
 .../curator/x/async/api/AsyncCreateBuilder.java | 28 ++++++++++++++++++++
 .../x/async/details/AsyncCreateBuilderImpl.java | 21 +++++++++++++++
 .../x/async/modeled/ModeledFramework.java       | 23 ++++++++++++++++
 .../details/CachedModeledFrameworkImpl.java     | 12 +++++++++
 .../modeled/details/ModeledFrameworkImpl.java   | 16 +++++++++--
 6 files changed, 106 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index fdd1e15..60f49c5 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
@@ -52,6 +52,7 @@ public class CreateBuilderImpl implements CreateBuilder, 
CreateBuilder2, Backgro
     private boolean doProtected;
     private boolean compress;
     private boolean setDataIfExists;
+    private int setDataIfExistsVersion = -1;
     private String protectedId;
     private ACLing acling;
     private Stat storingStat;
@@ -95,6 +96,11 @@ public class CreateBuilderImpl implements CreateBuilder, 
CreateBuilder2, Backgro
         this.ttl = ttl;
     }
 
+    public void setSetDataIfExistsVersion(int version)
+    {
+        this.setDataIfExistsVersion = version;
+    }
+
     @Override
     public CreateBuilder2 orSetData()
     {
@@ -751,7 +757,7 @@ public class CreateBuilderImpl implements CreateBuilder, 
CreateBuilder2, Backgro
             {
                 try
                 {
-                    client.getZooKeeper().setData(path, 
mainOperationAndData.getData().getData(), -1, statCallback, 
backgrounding.getContext());
+                    client.getZooKeeper().setData(path, 
mainOperationAndData.getData().getData(), setDataIfExistsVersion, statCallback, 
backgrounding.getContext());
                 }
                 catch ( KeeperException e )
                 {
@@ -1078,7 +1084,7 @@ public class CreateBuilderImpl implements CreateBuilder, 
CreateBuilder2, Backgro
                             {
                                 if ( setDataIfExists )
                                 {
-                                    client.getZooKeeper().setData(path, data, 
-1);
+                                    client.getZooKeeper().setData(path, data, 
setDataIfExistsVersion);
                                     createdPath = path;
                                 }
                                 else

http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/curator-x-async/src/main/java/org/apache/curator/x/async/api/AsyncCreateBuilder.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/api/AsyncCreateBuilder.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/api/AsyncCreateBuilder.java
index e5f2d8c..7ed934e 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/api/AsyncCreateBuilder.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/api/AsyncCreateBuilder.java
@@ -67,6 +67,15 @@ public interface AsyncCreateBuilder extends 
AsyncPathAndBytesable<AsyncStage<Str
     AsyncPathAndBytesable<AsyncStage<String>> withTtl(long ttl);
 
     /**
+     * Specify the setData expected matching version when using option
+     * {@link org.apache.curator.x.async.api.CreateOption#setDataIfExists}. By 
default -1 is used.
+     *
+     * @param version setData expected matching version
+     * @return this for chaining
+     */
+    AsyncPathAndBytesable<AsyncStage<String>> withSetDataVersion(int version);
+
+    /**
      * Options to change how the ZNode is created
      *
      * @param options options
@@ -141,4 +150,23 @@ public interface AsyncCreateBuilder extends 
AsyncPathAndBytesable<AsyncStage<Str
      * @return this
      */
     AsyncPathAndBytesable<AsyncStage<String>> withOptions(Set<CreateOption> 
options, CreateMode createMode, List<ACL> aclList, Stat stat, long ttl);
+
+    /**
+     * set options, mode, ACLs, and stat
+     *
+     * @param options options
+     * @param createMode mode to use
+     * @param aclList the ACL list to use
+     * @param stat the stat to have filled in
+     * @param ttl the ttl or 0
+     * @param setDataVersion the setData matching version or -1
+     * @see #withOptions(java.util.Set)
+     * @see #withMode(org.apache.zookeeper.CreateMode)
+     * @see #withACL(java.util.List)
+     * @see #storingStatIn(org.apache.zookeeper.data.Stat)
+     * @see #withTtl(long)
+     * @see #withSetDataVersion(long)
+     * @return this
+     */
+    AsyncPathAndBytesable<AsyncStage<String>> withOptions(Set<CreateOption> 
options, CreateMode createMode, List<ACL> aclList, Stat stat, long ttl, int 
setDataVersion);
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
index e8b1d30..c27639e 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
@@ -44,6 +44,7 @@ class AsyncCreateBuilderImpl implements AsyncCreateBuilder
     private Set<CreateOption> options = Collections.emptySet();
     private Stat stat = null;
     private long ttl = -1;
+    private int setDataVersion = -1;
 
     AsyncCreateBuilderImpl(CuratorFrameworkImpl client, Filters filters)
     {
@@ -80,6 +81,13 @@ class AsyncCreateBuilderImpl implements AsyncCreateBuilder
     }
 
     @Override
+    public AsyncPathAndBytesable<AsyncStage<String>> withSetDataVersion(int 
version)
+    {
+        this.setDataVersion = version;
+        return this;
+    }
+
+    @Override
     public AsyncPathAndBytesable<AsyncStage<String>> 
withOptions(Set<CreateOption> options)
     {
         this.options = Objects.requireNonNull(options, "options cannot be 
null");
@@ -133,6 +141,18 @@ class AsyncCreateBuilderImpl implements AsyncCreateBuilder
     }
 
     @Override
+    public AsyncPathAndBytesable<AsyncStage<String>> 
withOptions(Set<CreateOption> options, CreateMode createMode, List<ACL> 
aclList, Stat stat, long ttl, int setDataVersion)
+    {
+        this.options = Objects.requireNonNull(options, "options cannot be 
null");
+        this.aclList = aclList;
+        this.createMode = Objects.requireNonNull(createMode, "createMode 
cannot be null");
+        this.stat = stat;
+        this.ttl = ttl;
+        this.setDataVersion = setDataVersion;
+        return this;
+    }
+
+    @Override
     public AsyncStage<String> forPath(String path)
     {
         return internalForPath(path, null, false);
@@ -159,6 +179,7 @@ class AsyncCreateBuilderImpl implements AsyncCreateBuilder
             stat,
             ttl
         );
+        builder.setSetDataIfExistsVersion(setDataVersion);
         return safeCall(common.internalCallback, () -> useData ? 
builder.forPath(path, data) : builder.forPath(path));
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/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 b475712..0a74938 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
@@ -143,6 +143,17 @@ public interface ModeledFramework<T>
 
     /**
      * Create (or update depending on build options) a ZNode at this 
instance's path with a serialized
+     * version of the given model
+     *
+     * @param model model to write
+     * @param version if data is being set instead of creating the node, the 
data version to use
+     * @return AsyncStage
+     * @see org.apache.curator.x.async.AsyncStage
+     */
+    AsyncStage<String> set(T model, int version);
+
+    /**
+     * Create (or update depending on build options) a ZNode at this 
instance's path with a serialized
      * form of the given model
      *
      * @param model model to write
@@ -153,6 +164,18 @@ public interface ModeledFramework<T>
     AsyncStage<String> set(T model, Stat storingStatIn);
 
     /**
+     * Create (or update depending on build options) a ZNode at this 
instance's path with a serialized
+     * form of the given model
+     *
+     * @param model model to write
+     * @param version if data is being set instead of creating the node, the 
data version to use
+     * @param storingStatIn the stat for the new ZNode is stored here
+     * @return AsyncStage
+     * @see org.apache.curator.x.async.AsyncStage
+     */
+    AsyncStage<String> set(T model, Stat storingStatIn, int version);
+
+    /**
      * Read the ZNode at this instance's path and deserialize into a model
      *
      * @return AsyncStage

http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/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 9ef88e8..8359ae0 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
@@ -132,6 +132,18 @@ class CachedModeledFrameworkImpl<T> implements 
CachedModeledFramework<T>
     }
 
     @Override
+    public AsyncStage<String> set(T model, Stat storingStatIn, int version)
+    {
+        return client.set(model, storingStatIn, version);
+    }
+
+    @Override
+    public AsyncStage<String> set(T model, int version)
+    {
+        return client.set(model, version);
+    }
+
+    @Override
     public AsyncStage<T> read()
     {
         return internalRead(ZNode::model);

http://git-wip-us.apache.org/repos/asf/curator/blob/1110ab3b/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 3bb1b73..ba67a71 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
@@ -128,17 +128,29 @@ public class ModeledFrameworkImpl<T> implements 
ModeledFramework<T>
     @Override
     public AsyncStage<String> set(T item)
     {
-        return set(item, null);
+        return set(item, null, -1);
     }
 
     @Override
     public AsyncStage<String> set(T item, Stat storingStatIn)
     {
+        return set(item, storingStatIn, -1);
+    }
+
+    @Override
+    public AsyncStage<String> set(T item, int version)
+    {
+        return set(item, null, -1);
+    }
+
+    @Override
+    public AsyncStage<String> set(T item, Stat storingStatIn, int version)
+    {
         try
         {
             byte[] bytes = modelSpec.serializer().serialize(item);
             return dslClient.create()
-                .withOptions(modelSpec.createOptions(), 
modelSpec.createMode(), fixAclList(modelSpec.aclList()), storingStatIn, 
modelSpec.ttl())
+                .withOptions(modelSpec.createOptions(), 
modelSpec.createMode(), fixAclList(modelSpec.aclList()), storingStatIn, 
modelSpec.ttl(), version)
                 .forPath(modelSpec.path().fullPath(), bytes);
         }
         catch ( Exception e )

Reply via email to