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)));
+    }
 }

Reply via email to