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 )
