You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/04/15 08:54:08 UTC

[02/10] camel git commit: CAMEL-9851: zookeeper create operation should create sub paths.

CAMEL-9851: zookeeper create operation should create sub paths.


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

Branch: refs/heads/master
Commit: f02727ea1623dc236602c0d1e4347e7bd4c29d55
Parents: 8463350
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Apr 15 08:51:31 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Apr 15 08:51:31 2016 +0200

----------------------------------------------------------------------
 .../zookeeper/operations/CreateOperation.java   |  6 +-
 .../zookeeper/operations/ZooKeeperHelper.java   | 58 ++++++++++++++++++++
 .../operations/CreateOperationTest.java         | 21 +++++++
 3 files changed, 83 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/f02727ea/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/CreateOperation.java
----------------------------------------------------------------------
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/CreateOperation.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/CreateOperation.java
index 5fb6587..730f6f2 100644
--- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/CreateOperation.java
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/CreateOperation.java
@@ -18,14 +18,14 @@ package org.apache.camel.component.zookeeper.operations;
 
 import java.util.List;
 
-import static java.lang.String.format;
-
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.ZooDefs.Ids;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 
+import static java.lang.String.format;
+
 /**
  * <code>CreateOperation</code> is a basic Zookeeper operation used to create
  * and set the data contained in a given node
@@ -49,6 +49,8 @@ public class CreateOperation extends ZooKeeperOperation<String> {
     @Override
     public OperationResult<String> getResult() {
         try {
+            // ensure parent nodes is created first as persistent (cannot be ephemeral without children)
+            ZooKeeperHelper.mkdirs(connection, node, false, CreateMode.PERSISTENT);
             String created = connection.create(node, data, permissions, createMode);
             if (LOG.isDebugEnabled()) {
                 LOG.debug(format("Created node '%s' using mode '%s'", created, createMode));

http://git-wip-us.apache.org/repos/asf/camel/blob/f02727ea/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/ZooKeeperHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/ZooKeeperHelper.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/ZooKeeperHelper.java
new file mode 100644
index 0000000..0a022e1
--- /dev/null
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/operations/ZooKeeperHelper.java
@@ -0,0 +1,58 @@
+/**
+ * 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.camel.component.zookeeper.operations;
+
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.common.PathUtils;
+
+public final class ZooKeeperHelper {
+
+    private ZooKeeperHelper() {
+    }
+
+    public static void mkdirs(ZooKeeper zookeeper, String path, boolean makeLastNode, CreateMode createMode) throws Exception {
+        PathUtils.validatePath(path);
+
+        int pos = 1; // skip first slash, root is guaranteed to exist
+        do {
+            pos = path.indexOf("/", pos + 1);
+
+            if (pos == -1) {
+                if (makeLastNode) {
+                    pos = path.length();
+                } else {
+                    break;
+                }
+            }
+
+            String subPath = path.substring(0, pos);
+            if (zookeeper.exists(subPath, false) == null) {
+                try {
+                    zookeeper.create(subPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, createMode);
+                } catch (KeeperException.NodeExistsException e) {
+                    // ignore... someone else has created it since we checked
+                }
+            }
+
+        }
+        while (pos < path.length());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/f02727ea/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/operations/CreateOperationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/operations/CreateOperationTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/operations/CreateOperationTest.java
index e0137e1..48624c8 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/operations/CreateOperationTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/operations/CreateOperationTest.java
@@ -48,6 +48,27 @@ public class CreateOperationTest extends ZooKeeperTestSupport {
     }
 
     @Test
+    public void createBasicSubPath() throws Exception {
+        CreateOperation create = new CreateOperation(connection, "/sub/sub2");
+
+        OperationResult<String> result = create.get();
+        assertEquals("/sub/sub2", result.getResult());
+
+        verifyNodeContainsData("/sub/sub2", null);
+    }
+
+    @Test
+    public void createBasicSubPathWithData() throws Exception {
+        CreateOperation create = new CreateOperation(connection, "/sub/sub3");
+        create.setData(testPayload.getBytes());
+
+        OperationResult<String> result = create.get();
+        assertEquals("/sub/sub3", result.getResult());
+
+        verifyNodeContainsData("/sub/sub3", testPayloadBytes);
+    }
+
+    @Test
     public void createBasicWithData() throws Exception {
         CreateOperation create = new CreateOperation(connection, "/two");
         create.setData(testPayload.getBytes());