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:00 UTC

[1/6] curator git commit: CURATOR-409: Fix unintentional override of getQuorumPeer in TestingQuorumPeerMain

Repository: curator
Updated Branches:
  refs/heads/CURATOR-397 e4a7e0917 -> beac06f13


CURATOR-409: Fix unintentional override of getQuorumPeer in TestingQuorumPeerMain


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

Branch: refs/heads/CURATOR-397
Commit: 956176629f5cc9d7c53b52068e4ebdcbdfb86e68
Parents: f898959
Author: Stig Rohde Døssing <st...@gmail.com>
Authored: Fri May 5 20:44:10 2017 +0200
Committer: Stig Rohde Døssing <st...@gmail.com>
Committed: Fri May 5 20:44:10 2017 +0200

----------------------------------------------------------------------
 .../apache/curator/test/TestingQuorumPeerMain.java   |  3 +--
 .../apache/curator/test/TestingZooKeeperMain.java    |  7 -------
 .../apache/curator/test/TestingZooKeeperServer.java  | 15 +++++++++++----
 .../org/apache/curator/test/ZooKeeperMainFace.java   |  3 ---
 4 files changed, 12 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/95617662/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java
index e1c1f89..3ae464c 100644
--- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java
+++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java
@@ -52,8 +52,7 @@ class TestingQuorumPeerMain extends QuorumPeerMain implements ZooKeeperMainFace
         }
     }
 
-    @Override
-    public QuorumPeer getQuorumPeer()
+    public QuorumPeer getTestingQuorumPeer()
     {
         return quorumPeer;
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/95617662/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java
index 19535a6..f0cf68a 100644
--- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java
+++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java
@@ -28,7 +28,6 @@ import org.apache.zookeeper.server.ServerConfig;
 import org.apache.zookeeper.server.ZKDatabase;
 import org.apache.zookeeper.server.ZooKeeperServer;
 import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
-import org.apache.zookeeper.server.quorum.QuorumPeer;
 import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -139,12 +138,6 @@ public class TestingZooKeeperMain implements ZooKeeperMainFace
         }
     }
 
-    @Override
-    public QuorumPeer getQuorumPeer()
-    {
-        throw new UnsupportedOperationException();
-    }
-
     @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
     @Override
     public void blockUntilStarted() throws Exception

http://git-wip-us.apache.org/repos/asf/curator/blob/95617662/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java
index c14e3e4..225e3f7 100644
--- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java
+++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java
@@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicReference;
 /**
  * Thanks to Jeremie BORDIER (ahfeel) for this code
  */
-public class TestingZooKeeperServer extends QuorumPeerMain implements Closeable
+public class TestingZooKeeperServer implements Closeable
 {
     private static final Logger logger = LoggerFactory.getLogger(TestingZooKeeperServer.class);
 
@@ -55,12 +55,19 @@ public class TestingZooKeeperServer extends QuorumPeerMain implements Closeable
     {
         this.configBuilder = configBuilder;
         this.thisInstanceIndex = thisInstanceIndex;
-        main = (configBuilder.size() > 1) ? new TestingQuorumPeerMain() : new TestingZooKeeperMain();
+        main = isCluster() ? new TestingQuorumPeerMain() : new TestingZooKeeperMain();
     }
 
+    private boolean isCluster() {
+        return configBuilder.size() > 1;
+    }
+    
     public QuorumPeer getQuorumPeer()
     {
-        return main.getQuorumPeer();
+        if (isCluster()) {
+            return ((TestingQuorumPeerMain) main).getTestingQuorumPeer();
+        }
+        throw new UnsupportedOperationException();
     }
 
     public Collection<InstanceSpec> getInstanceSpecs()
@@ -99,7 +106,7 @@ public class TestingZooKeeperServer extends QuorumPeerMain implements Closeable
         // Set to a LATENT state so we can restart
         state.set(State.LATENT);
 
-        main = (configBuilder.size() > 1) ? new TestingQuorumPeerMain() : new TestingZooKeeperMain();
+        main = isCluster() ? new TestingQuorumPeerMain() : new TestingZooKeeperMain();
         start();
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/95617662/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java
index 6da29a4..946ac1a 100644
--- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java
+++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java
@@ -18,7 +18,6 @@
  */
 package org.apache.curator.test;
 
-import org.apache.zookeeper.server.quorum.QuorumPeer;
 import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 import java.io.Closeable;
 
@@ -29,6 +28,4 @@ public interface ZooKeeperMainFace extends Closeable
     public void blockUntilStarted() throws Exception;
 
     public void kill();
-
-    public QuorumPeer getQuorumPeer();
 }


[2/6] curator git commit: CURATOR-410: Fix testPathsFromProtectingInBackground failing due to new CreateModes in Zookeeper 3.5.3

Posted by ra...@apache.org.
CURATOR-410: Fix testPathsFromProtectingInBackground failing due to new CreateModes in Zookeeper 3.5.3


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

Branch: refs/heads/CURATOR-397
Commit: 2e69bbf7cc2a128f1e2f98ee6a02ba6d1e47c34f
Parents: f898959
Author: Stig Rohde Døssing <sd...@it-minds.dk>
Authored: Sat May 6 01:29:30 2017 +0200
Committer: Stig Rohde Døssing <sd...@it-minds.dk>
Committed: Sat May 6 09:52:49 2017 +0200

----------------------------------------------------------------------
 .../framework/imps/TestFrameworkEdges.java      | 26 ++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/2e69bbf7/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
index bf1c281..6acbaf6 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
@@ -29,7 +29,6 @@ import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.curator.framework.api.CuratorListener;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.framework.state.ConnectionStateListener;
-import org.apache.curator.retry.RetryForever;
 import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
@@ -53,6 +52,7 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.curator.framework.api.CreateBuilder;
 
 public class TestFrameworkEdges extends BaseClassForTests
 {
@@ -64,7 +64,7 @@ public class TestFrameworkEdges extends BaseClassForTests
         final int serverPort = server.getPort();
         server.close();
 
-        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), 1000, 1000, new RetryForever(100));
+        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), 1000, 1000, new RetryNTimes(10, timing.forSleepingABit().milliseconds()));
         try
         {
             new Thread()
@@ -178,10 +178,17 @@ public class TestFrameworkEdges extends BaseClassForTests
                 }
             };
             final String TEST_PATH = "/a/b/c/test-";
-            client.create().withMode(mode).inBackground(callback).forPath(TEST_PATH);
+            long ttl = timing.forWaiting().milliseconds()*1000;
+            CreateBuilder firstCreateBuilder = client.create();
+            if(mode.isTTL()) {
+                firstCreateBuilder.withTtl(ttl);
+            }
+            firstCreateBuilder.withMode(mode).inBackground(callback).forPath(TEST_PATH);
 
-            String name1 = paths.take();
-            String path1 = paths.take();
+            String name1 = paths.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
+            String path1 = paths.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
+            Assert.assertNotNull(name1);
+            Assert.assertNotNull(path1);
 
             client.close();
 
@@ -190,14 +197,19 @@ public class TestFrameworkEdges extends BaseClassForTests
             
             CreateBuilderImpl createBuilder = (CreateBuilderImpl)client.create();
             createBuilder.withProtection();
+            if(mode.isTTL()) {
+                createBuilder.withTtl(ttl);
+            }
 
             client.create().forPath(createBuilder.adjustPath(TEST_PATH));
 
             createBuilder.debugForceFindProtectedNode = true;
             createBuilder.withMode(mode).inBackground(callback).forPath(TEST_PATH);
 
-            String name2 = paths.take();
-            String path2 = paths.take();
+            String name2 = paths.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
+            String path2 = paths.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
+            Assert.assertNotNull(name2);
+            Assert.assertNotNull(path2);
 
             Assert.assertEquals(ZKPaths.getPathAndNode(name1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
             Assert.assertEquals(ZKPaths.getPathAndNode(name2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());


[4/6] curator git commit: Merge branch 'master' into CURATOR-397

Posted by ra...@apache.org.
Merge branch 'master' into CURATOR-397


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

Branch: refs/heads/CURATOR-397
Commit: 555e1d4684e233e1caa910be67a4ff892253d9c7
Parents: e4a7e09 32a7755
Author: randgalt <ra...@apache.org>
Authored: Mon May 8 18:36:48 2017 +0200
Committer: randgalt <ra...@apache.org>
Committed: Mon May 8 18:36:48 2017 +0200

----------------------------------------------------------------------
 .../framework/imps/TestFrameworkEdges.java      | 26 ++++++++++++++------
 .../curator/test/TestingQuorumPeerMain.java     |  3 +--
 .../curator/test/TestingZooKeeperMain.java      |  7 ------
 .../curator/test/TestingZooKeeperServer.java    | 15 ++++++++---
 .../apache/curator/test/ZooKeeperMainFace.java  |  3 ---
 5 files changed, 31 insertions(+), 23 deletions(-)
----------------------------------------------------------------------



[6/6] curator git commit: Added Versioned facade for easy management of models with versions

Posted by ra...@apache.org.
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);
+}


[3/6] curator git commit: Merge branch 'CURATOR-409' of github.com:srdo/curator into CURATOR-409

Posted by ra...@apache.org.
Merge branch 'CURATOR-409' of github.com:srdo/curator into CURATOR-409


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

Branch: refs/heads/CURATOR-397
Commit: 32a7755b85255a7a49d911fd9f315a9a394d51ba
Parents: 2e69bbf 9561766
Author: randgalt <ra...@apache.org>
Authored: Mon May 8 06:12:05 2017 +0200
Committer: randgalt <ra...@apache.org>
Committed: Mon May 8 06:12:05 2017 +0200

----------------------------------------------------------------------
 .../apache/curator/test/TestingQuorumPeerMain.java   |  3 +--
 .../apache/curator/test/TestingZooKeeperMain.java    |  7 -------
 .../apache/curator/test/TestingZooKeeperServer.java  | 15 +++++++++++----
 .../org/apache/curator/test/ZooKeeperMainFace.java   |  3 ---
 4 files changed, 12 insertions(+), 16 deletions(-)
----------------------------------------------------------------------



[5/6] curator git commit: Work on testing modeled schema

Posted by ra...@apache.org.
Work on testing modeled schema


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

Branch: refs/heads/CURATOR-397
Commit: 23a1487984b576b878e3a88287f74d9381e5dec7
Parents: 555e1d4
Author: randgalt <ra...@apache.org>
Authored: Mon May 8 19:11:22 2017 +0200
Committer: randgalt <ra...@apache.org>
Committed: Mon May 8 19:11:22 2017 +0200

----------------------------------------------------------------------
 .../apache/curator/framework/schema/Schema.java |  2 +-
 .../x/async/modeled/details/ModelSpecImpl.java  | 24 ++++++++++------
 .../x/async/modeled/TestModeledFramework.java   | 30 ++++++++++++++++++++
 3 files changed, 47 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/23a14879/curator-framework/src/main/java/org/apache/curator/framework/schema/Schema.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/schema/Schema.java b/curator-framework/src/main/java/org/apache/curator/framework/schema/Schema.java
index e9f4f18..bcb35d3 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/schema/Schema.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/schema/Schema.java
@@ -318,7 +318,7 @@ public class Schema
             ", pathRegex=" + pathRegex +
             ", path='" + fixedPath + '\'' +
             ", documentation='" + documentation + '\'' +
-            ", dataValidator=" + schemaValidator +
+            ", dataValidator=" + schemaValidator.getClass() +
             ", ephemeral=" + ephemeral +
             ", sequential=" + sequential +
             ", watched=" + watched +

http://git-wip-us.apache.org/repos/asf/curator/blob/23a14879/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
index 3a4a504..847ce61 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
@@ -29,6 +29,7 @@ import org.apache.curator.x.async.modeled.ModelSerializer;
 import org.apache.curator.x.async.modeled.ModelSpec;
 import org.apache.curator.x.async.modeled.ZPath;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 import java.util.List;
 import java.util.Objects;
@@ -207,18 +208,25 @@ public class ModelSpecImpl<T> implements ModelSpec<T>, SchemaValidator
     @Override
     public boolean isValid(Schema schema, String path, byte[] data, List<ACL> acl)
     {
-        if ( !acl.equals(aclList) )
+        if ( acl != null )
         {
-            throw new SchemaViolation(schema, new SchemaViolation.ViolatorData(path, data, acl), "ACLs do not match model ACLs");
+            List<ACL> localAclList = (aclList.size() > 0) ? aclList : ZooDefs.Ids.OPEN_ACL_UNSAFE;
+            if ( !acl.equals(localAclList) )
+            {
+                throw new SchemaViolation(schema, new SchemaViolation.ViolatorData(path, data, acl), "ACLs do not match model ACLs");
+            }
         }
 
-        try
+        if ( data != null )
         {
-            serializer.deserialize(data);
-        }
-        catch ( RuntimeException e )
-        {
-            throw new SchemaViolation(schema, new SchemaViolation.ViolatorData(path, data, acl), "Data cannot be deserialized into a model");
+            try
+            {
+                serializer.deserialize(data);
+            }
+            catch ( RuntimeException e )
+            {
+                throw new SchemaViolation(schema, new SchemaViolation.ViolatorData(path, data, acl), "Data cannot be deserialized into a model");
+            }
         }
         return true;
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/23a14879/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 a7884ee..209c463 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
@@ -21,6 +21,9 @@ package org.apache.curator.x.async.modeled;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.schema.Schema;
+import org.apache.curator.framework.schema.SchemaSet;
+import org.apache.curator.framework.schema.SchemaViolation;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.x.async.AsyncCuratorFramework;
@@ -33,6 +36,7 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import java.math.BigInteger;
+import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 
@@ -129,4 +133,30 @@ public class TestModeledFramework extends CompletableBaseClassForTests
         ModeledFramework<TestModel> client = ModeledFramework.builder(async, modelSpec).watched().build();
         complete(client.read().whenComplete((model, e) -> Assert.assertTrue(e instanceof RuntimeException)));
     }
+
+    @Test
+    public void testSchema() throws Exception
+    {
+        Schema schema = modelSpec.schema();
+        try ( CuratorFramework schemaClient = CuratorFrameworkFactory.builder()
+            .connectString(server.getConnectString())
+            .retryPolicy(new RetryOneTime(1))
+            .schemaSet(new SchemaSet(Collections.singletonList(schema), false))
+            .build() ) {
+            schemaClient.start();
+
+            try
+            {
+                schemaClient.create().forPath(modelSpec.path().fullPath(), "asflasfas".getBytes());
+                Assert.fail("Should've thrown SchemaViolation");
+            }
+            catch ( SchemaViolation dummy )
+            {
+                // expected
+            }
+
+            ModeledFramework<TestModel> modeledSchemaClient = ModeledFramework.wrap(AsyncCuratorFramework.wrap(schemaClient), modelSpec);
+            complete(modeledSchemaClient.set(new TestModel("one", "two", "three", 4, BigInteger.ONE)), (dummy, e) -> Assert.assertNull(e));
+        }
+    }
 }