Repository: curator Updated Branches: refs/heads/CURATOR-397 beac06f13 -> a7d2e058e
final versioned APIs and doc Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/a7d2e058 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/a7d2e058 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/a7d2e058 Branch: refs/heads/CURATOR-397 Commit: a7d2e058e4fedb00c408694f185b54ec4259bf94 Parents: beac06f Author: randgalt <[email protected]> Authored: Wed May 10 11:58:04 2017 +0200 Committer: randgalt <[email protected]> Committed: Wed May 10 11:58:04 2017 +0200 ---------------------------------------------------------------------- .../details/CachedModeledFrameworkImpl.java | 8 +++---- .../x/async/modeled/details/ModelStage.java | 5 ---- .../modeled/details/ModeledFrameworkImpl.java | 4 ++-- .../details/VersionedModeledFrameworkImpl.java | 23 +++++++++++++++++-- .../x/async/modeled/versioned/Versioned.java | 18 +++++++++++++++ .../versioned/VersionedModeledFramework.java | 20 +++++++++++++++- .../confluence/modeled-components.confluence | 6 +++-- .../site/confluence/modeled-typed.confluence | 23 ++++++++++++++++++- .../src/site/confluence/modeled.confluence | 1 + .../x/async/modeled/TestModeledFramework.java | 24 ++++++++++++++++++++ 10 files changed, 115 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/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 9339ecc..15db3ba 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 @@ -203,14 +203,14 @@ class CachedModeledFrameworkImpl<T> implements CachedModeledFramework<T> { ZPath path = client.modelSpec().path(); Optional<ZNode<T>> data = cache.currentData(path); - return data.map(node -> completed(new ModelStage<>(), node.stat())).orElseGet(() -> completed(new ModelStage<>(), null)); + return data.map(node -> completed(new ModelStage<>(null), node.stat())).orElseGet(() -> completed(new ModelStage<>(null), null)); } @Override public AsyncStage<List<ZPath>> children() { Set<ZPath> paths = cache.currentChildren(client.modelSpec().path()).keySet(); - return completed(new ModelStage<>(), Lists.newArrayList(paths)); + return completed(new ModelStage<>(null), Lists.newArrayList(paths)); } @Override @@ -277,7 +277,7 @@ class CachedModeledFrameworkImpl<T> implements CachedModeledFramework<T> { ZPath path = client.modelSpec().path(); Optional<ZNode<T>> data = cache.currentData(path); - return data.map(node -> completed(new ModelStage<>(), resolver.apply(node))) - .orElseGet(() -> completedExceptionally(new ModelStage<>(), new KeeperException.NoNodeException(path.fullPath()))); + return data.map(node -> completed(new ModelStage<>(null), resolver.apply(node))) + .orElseGet(() -> completedExceptionally(new ModelStage<>(null), new KeeperException.NoNodeException(path.fullPath()))); } } http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java index 9be9a33..f132df5 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelStage.java @@ -27,11 +27,6 @@ class ModelStage<T> extends CompletableFuture<T> implements AsyncStage<T> { private final CompletionStage<WatchedEvent> event; - ModelStage() - { - event = null; - } - ModelStage(CompletionStage<WatchedEvent> event) { this.event = event; http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/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 855b4d4..ef8192f 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 @@ -161,7 +161,7 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> } catch ( Exception e ) { - ModelStage<String> exceptionStage = new ModelStage<>(); + ModelStage<String> exceptionStage = new ModelStage<>(null); exceptionStage.completeExceptionally(e); return exceptionStage; } @@ -207,7 +207,7 @@ public class ModeledFrameworkImpl<T> implements ModeledFramework<T> } catch ( Exception e ) { - ModelStage<Stat> exceptionStage = new ModelStage<>(); + ModelStage<Stat> exceptionStage = new ModelStage<>(null); exceptionStage.completeExceptionally(e); return exceptionStage; } http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/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 index 0f4e86a..9717cff 100644 --- 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 @@ -1,3 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.curator.x.async.modeled.details; import org.apache.curator.framework.api.transaction.CuratorOp; @@ -38,8 +56,9 @@ class VersionedModeledFrameworkImpl<T> implements VersionedModeledFramework<T> 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) -> { + AsyncStage<T> stage = client.read(localStat); + ModelStage<Versioned<T>> modelStage = new ModelStage<>(stage.event()); + stage.whenComplete((model, e) -> { if ( e != null ) { modelStage.completeExceptionally(e); http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/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 index 6f732a6..0bd723b 100644 --- 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 @@ -1,3 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.curator.x.async.modeled.versioned; /** http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/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 index a3aaf8d..c725fd3 100644 --- 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 @@ -1,3 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.curator.x.async.modeled.versioned; import org.apache.curator.framework.api.transaction.CuratorOp; @@ -32,7 +50,7 @@ public interface VersionedModeledFramework<T> AsyncStage<Stat> update(Versioned<T> model); /** - * @see org.apache.curator.x.async.modeled.ModeledFramework#updateOp(Object) + * @see org.apache.curator.x.async.modeled.ModeledFramework#updateOp(Object) */ CuratorOp updateOp(Versioned<T> model); } http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/curator-x-async/src/site/confluence/modeled-components.confluence ---------------------------------------------------------------------- diff --git a/curator-x-async/src/site/confluence/modeled-components.confluence b/curator-x-async/src/site/confluence/modeled-components.confluence index ab49750..4c3d1dc 100644 --- a/curator-x-async/src/site/confluence/modeled-components.confluence +++ b/curator-x-async/src/site/confluence/modeled-components.confluence @@ -129,5 +129,7 @@ client.getData().forPath(path).whenComplete((data, e) -> { h2. Caching and Typed Parameters -In addition to the above features, Modeled Curator supports [[Integrated Caching|modeled-typed.html]] -and [[Typed Parameters|modeled-typed.html]]. See [[Caching and Typed Parameters|modeled-typed.html]] for details. +In addition to the above features, Modeled Curator supports [[Integrated Caching|modeled-typed.html]], +[[Typed Parameters|modeled-typed.html]] and [[Versioning|modeled-typed.html]]. See +[[Caching and Typed Parameters|modeled-typed.html]] for details. + http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/curator-x-async/src/site/confluence/modeled-typed.confluence ---------------------------------------------------------------------- diff --git a/curator-x-async/src/site/confluence/modeled-typed.confluence b/curator-x-async/src/site/confluence/modeled-typed.confluence index 5a8a597..0b91854 100644 --- a/curator-x-async/src/site/confluence/modeled-typed.confluence +++ b/curator-x-async/src/site/confluence/modeled-typed.confluence @@ -1,4 +1,4 @@ -h1. Modeled Curator \- Caching and Typed Parameters +h1. Modeled Curator \- Caching, Typed Parameters and Versioning In addition to its [[main features|modeled-components.html]] Modeled Curator also supports integrated caching and typed parameters. @@ -50,3 +50,24 @@ client.set(person); {code} TypedZPath and TypedModelSpec work similarly. + +h2. Versioning + +Modeled Curator supports associating a ZNode version with a model object via +the {{Versioned}} interface and the {{VersionedModeledFramework}} APIs. To +read a model along with its ZNode version use: + +{code} +ModeledFramework<Person> client = ... + +client.versioned().read().whenComplete((value, e) -> { + if ( value != null ) { + // value's type is Versioned<Person> + Person personModel = value.model(); + int znodeVersion = value.version(); + } +}); +{code} + +{{VersionedModeledFramework}} has set/update APIs which automatically use the version +from the {{Versioned}} instance. http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/curator-x-async/src/site/confluence/modeled.confluence ---------------------------------------------------------------------- diff --git a/curator-x-async/src/site/confluence/modeled.confluence b/curator-x-async/src/site/confluence/modeled.confluence index fcb9b28..d4972b1 100644 --- a/curator-x-async/src/site/confluence/modeled.confluence +++ b/curator-x-async/src/site/confluence/modeled.confluence @@ -33,6 +33,7 @@ Additional functionality is provided by: * [[CachedModeledFramework|modeled-typed.html]] * [[Typed Parameter Templates|modeled-typed.html]] +* [[Versioning|modeled-typed.html]] h2. Example http://git-wip-us.apache.org/repos/asf/curator/blob/a7d2e058/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java index 209c463..b21c8ca 100644 --- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java +++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java @@ -31,6 +31,9 @@ import org.apache.curator.x.async.AsyncStage; import org.apache.curator.x.async.CompletableBaseClassForTests; import org.apache.curator.x.async.modeled.models.TestModel; import org.apache.curator.x.async.modeled.models.TestNewerModel; +import org.apache.curator.x.async.modeled.versioned.Versioned; +import org.apache.curator.x.async.modeled.versioned.VersionedModeledFramework; +import org.apache.zookeeper.KeeperException; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -159,4 +162,25 @@ public class TestModeledFramework extends CompletableBaseClassForTests complete(modeledSchemaClient.set(new TestModel("one", "two", "three", 4, BigInteger.ONE)), (dummy, e) -> Assert.assertNull(e)); } } + + @Test + public void testVersioned() + { + ModeledFramework<TestModel> client = ModeledFramework.wrap(async, modelSpec); + client.set(new TestModel("John", "Galt", "Galt's Gulch", 21, BigInteger.valueOf(1010101))); + + VersionedModeledFramework<TestModel> versioned = client.versioned(); + complete(versioned.read().whenComplete((v, e) -> { + Assert.assertNull(e); + Assert.assertTrue(v.version() > 0); + }).thenCompose(versioned::set).whenComplete((s, e) -> Assert.assertNull(e))); // version is correct should succeed + + complete(versioned.read().whenComplete((v, e) -> { + Assert.assertNull(e); + Assert.assertTrue(v.version() > 0); + }).thenCompose(value -> { + Versioned<TestModel> badVersion = Versioned.from(value.model(), Integer.MAX_VALUE); + return versioned.set(badVersion); + }).whenComplete((s, e) -> Assert.assertTrue(e instanceof KeeperException.BadVersionException))); + } }
