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 2014/02/18 10:48:45 UTC

[4/4] git commit: doc continues

doc continues


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

Branch: refs/heads/CURATOR-88
Commit: b4c76c79bcc3f2e1ffcb0dcf32854255ffa9d126
Parents: 3267285
Author: randgalt <ra...@apache.org>
Authored: Tue Feb 18 10:48:30 2014 +0100
Committer: randgalt <ra...@apache.org>
Committed: Tue Feb 18 10:48:30 2014 +0100

----------------------------------------------------------------------
 .../curator/x/rest/api/ClientResource.java      |  40 +++++--
 .../apache/curator/x/rest/api/Constants.java    |   1 -
 .../curator/x/rest/api/LeaderResource.java      |  36 ++++++-
 .../x/rest/api/PathChildrenCacheResource.java   |   2 +-
 .../x/rest/api/RestBackgroundCallback.java      |   8 +-
 .../org/apache/curator/x/rest/api/Session.java  |   2 +-
 .../curator/x/rest/entities/LeaderSpec.java     |  14 +--
 .../x/rest/entities/ParticipantSpec.java        |  60 +++++++++++
 curator-x-rest/src/site/assets/client.png       | Bin 100105 -> 0 bytes
 .../src/site/confluence/apis.confluence         |  56 ++++++++++
 .../src/site/confluence/entities.confluence     |  86 +++++++++++++++
 .../src/site/confluence/index.confluence        | 108 ++-----------------
 .../src/site/confluence/status.confluence       |  75 +++++++++++++
 .../src/site/resources/images/client.png        | Bin 0 -> 100105 bytes
 14 files changed, 365 insertions(+), 123 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/ClientResource.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/ClientResource.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/ClientResource.java
index d866a21..49e3789 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/ClientResource.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/ClientResource.java
@@ -75,7 +75,7 @@ public class ClientResource
     public Response getStatusWithTouch(List<String> ids) throws IOException
     {
         ObjectNode node = context.getMapper().createObjectNode();
-        node.put("state", context.getConnectionState().name());
+        node.put("state", context.getConnectionState().name().toLowerCase());
         node.putPOJO("messages", context.getSession().drainMessages());
 
         for ( String id : ids )
@@ -213,11 +213,16 @@ public class ClientResource
                 @Override
                 protected String getMessage(CuratorEvent event)
                 {
-                    if ( event.getResultCode() != 0 )
+                    PathAndId pathAndId = new PathAndId(String.valueOf(event.getName()), id);
+                    try
+                    {
+                        return context.getWriter().writeValueAsString(pathAndId);
+                    }
+                    catch ( IOException e )
                     {
-                        return Constants.ERROR;
+                        log.error("Could not serialize PathAndId", e);
                     }
-                    return event.getName();
+                    return "{}";
                 }
 
                 @Override
@@ -261,7 +266,11 @@ public class ClientResource
                 @Override
                 protected String getMessage(CuratorEvent event)
                 {
-                    return (event.getData() != null) ? new String(event.getData()) : "";
+                    if ( event.getResultCode() == 0 )
+                    {
+                        return (event.getData() != null) ? new String(event.getData()) : "";
+                    }
+                    return "";
                 }
             };
             castBuilder(builder, Backgroundable.class).inBackground(backgroundCallback);
@@ -297,7 +306,26 @@ public class ClientResource
 
         if ( existsSpec.isAsync() )
         {
-            BackgroundCallback backgroundCallback = new RestBackgroundCallback(context, Constants.CLIENT_EXISTS_ASYNC, existsSpec.getAsyncId());
+            BackgroundCallback backgroundCallback = new RestBackgroundCallback(context, Constants.CLIENT_EXISTS_ASYNC, existsSpec.getAsyncId())
+            {
+                @Override
+                protected String getMessage(CuratorEvent event)
+                {
+                    Stat stat = event.getStat();
+                    if ( stat != null )
+                    {
+                        try
+                        {
+                            return context.getWriter().writeValueAsString(stat);
+                        }
+                        catch ( IOException e )
+                        {
+                            log.error("Could not serialize stat object", e);
+                        }
+                    }
+                    return "{}";
+                }
+            };
             castBuilder(builder, Backgroundable.class).inBackground(backgroundCallback);
         }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Constants.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Constants.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Constants.java
index a516322..5ee1982 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Constants.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Constants.java
@@ -34,7 +34,6 @@ class Constants
     static final String CLIENT_SET_DATA_ASYNC = "client-set-data-async";
     static final String CLIENT_EXISTS_ASYNC = "client-exists-async";
     static final String CLIENT_DELETE_ASYNC = "client-delete-async";
-    static final String ERROR = "error";
     static final String WATCH = "watch";
     static final String PATH_CACHE = "path-cache";
     static final String NODE_CACHE = "node-cache";

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/LeaderResource.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/LeaderResource.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/LeaderResource.java
index 2590597..43316a1 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/LeaderResource.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/LeaderResource.java
@@ -18,24 +18,33 @@
  */
 package org.apache.curator.x.rest.api;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
 import org.apache.curator.framework.recipes.leader.LeaderLatch;
 import org.apache.curator.framework.recipes.leader.LeaderLatchListener;
+import org.apache.curator.framework.recipes.leader.Participant;
 import org.apache.curator.x.rest.CuratorRestContext;
 import org.apache.curator.x.rest.entities.LeaderSpec;
+import org.apache.curator.x.rest.entities.ParticipantSpec;
 import org.apache.curator.x.rest.entities.StatusMessage;
 import org.codehaus.jackson.node.ObjectNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import javax.annotation.Nullable;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.GenericEntity;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
 
 @Path("/curator/v1/recipes/leader")
 public class LeaderResource
@@ -53,7 +62,7 @@ public class LeaderResource
     @Produces(MediaType.APPLICATION_JSON)
     public Response startLeaderSelection(final LeaderSpec leaderSpec) throws Exception
     {
-        LeaderLatch leaderLatch = new LeaderLatch(context.getClient(), leaderSpec.getPath(), leaderSpec.getId());
+        LeaderLatch leaderLatch = new LeaderLatch(context.getClient(), leaderSpec.getPath(), leaderSpec.getParticipantId());
         leaderLatch.start();
 
         Closer<LeaderLatch> closer = new Closer<LeaderLatch>()
@@ -101,4 +110,29 @@ public class LeaderResource
         leaderLatch.close();
         return Response.ok().build();
     }
+
+    @GET
+    @Path("{leader-id}")
+    public Response getParticipants(@PathParam("leader-id") String leaderId) throws Exception
+    {
+        LeaderLatch leaderLatch = Constants.getThing(context.getSession(), leaderId, LeaderLatch.class);
+        Collection<Participant> participants = leaderLatch.getParticipants();
+
+        List<ParticipantSpec> transformed = Lists.transform
+        (
+            Lists.newArrayList(participants),
+            new Function<Participant, ParticipantSpec>()
+            {
+                @Nullable
+                @Override
+                public ParticipantSpec apply(Participant participant)
+                {
+                    return new ParticipantSpec(participant.getId(), participant.isLeader());
+                }
+            }
+        );
+
+        GenericEntity<List<ParticipantSpec>> entity = new GenericEntity<List<ParticipantSpec>>(transformed){};
+        return Response.ok(entity).build();
+    }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/PathChildrenCacheResource.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/PathChildrenCacheResource.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/PathChildrenCacheResource.java
index 76fae7d..4622ac1 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/PathChildrenCacheResource.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/PathChildrenCacheResource.java
@@ -84,7 +84,7 @@ public class PathChildrenCacheResource
             @Override
             public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception
             {
-                context.getSession().pushMessage(new StatusMessage(Constants.PATH_CACHE, id, event.getType().name(), ""));
+                context.getSession().pushMessage(new StatusMessage(Constants.PATH_CACHE, id, event.getType().name().toLowerCase(), event.getData().getPath()));
             }
         };
         cache.getListenable().addListener(listener);

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/RestBackgroundCallback.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/RestBackgroundCallback.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/RestBackgroundCallback.java
index a5e2284..a8231bb 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/RestBackgroundCallback.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/RestBackgroundCallback.java
@@ -43,13 +43,13 @@ class RestBackgroundCallback implements BackgroundCallback
         context.getSession().pushMessage(new StatusMessage(type, asyncId, getMessage(event), getDetails(event)));
     }
 
-    protected String getDetails(CuratorEvent event)
+    protected String getMessage(CuratorEvent event)
     {
-        return Integer.toString(event.getResultCode());
+        return String.valueOf(event.getPath());
     }
 
-    protected String getMessage(CuratorEvent event)
+    protected String getDetails(CuratorEvent event)
     {
-        return String.valueOf(event.getName());
+        return Integer.toString(event.getResultCode());
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Session.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Session.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Session.java
index 36a2654..1a487f8 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Session.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/api/Session.java
@@ -75,7 +75,7 @@ public class Session implements Closeable
             if ( elapsedSinceLastUse > sessionLengthMs )
             {
                 String id = mapEntry.getKey();
-                pushMessage(new StatusMessage(Constants.EXPIRED, id, "expired", entry.thing.getClass().getName()));
+                pushMessage(new StatusMessage(Constants.EXPIRED, id, entry.thing.getClass().getSimpleName(), ""));
                 log.warn(String.format("Expiring object. Elapsed time: %d, id: %s, Class: %s", elapsedSinceLastUse, id, entry.thing.getClass().getName()));
 
                 things.remove(id);

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/LeaderSpec.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/LeaderSpec.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/LeaderSpec.java
index fde9701..0af2a89 100644
--- a/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/LeaderSpec.java
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/LeaderSpec.java
@@ -24,17 +24,17 @@ import javax.xml.bind.annotation.XmlRootElement;
 public class LeaderSpec
 {
     private String path;
-    private String id;
+    private String participantId;
 
     public LeaderSpec()
     {
         this("/", "");
     }
 
-    public LeaderSpec(String path, String id)
+    public LeaderSpec(String path, String participantId)
     {
         this.path = path;
-        this.id = id;
+        this.participantId = participantId;
     }
 
     public String getPath()
@@ -47,13 +47,13 @@ public class LeaderSpec
         this.path = path;
     }
 
-    public String getId()
+    public String getParticipantId()
     {
-        return id;
+        return participantId;
     }
 
-    public void setId(String id)
+    public void setParticipantId(String participantId)
     {
-        this.id = id;
+        this.participantId = participantId;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/ParticipantSpec.java
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/ParticipantSpec.java b/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/ParticipantSpec.java
new file mode 100644
index 0000000..b695e59
--- /dev/null
+++ b/curator-x-rest/src/main/java/org/apache/curator/x/rest/entities/ParticipantSpec.java
@@ -0,0 +1,60 @@
+/**
+ * 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.rest.entities;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class ParticipantSpec
+{
+    private String participantId;
+    private boolean isLeader;
+
+    public ParticipantSpec()
+    {
+        this("", false);
+    }
+
+    public ParticipantSpec(String participantId, boolean isLeader)
+    {
+        this.participantId = participantId;
+        this.isLeader = isLeader;
+    }
+
+    public String getParticipantId()
+    {
+        return participantId;
+    }
+
+    public void setParticipantId(String participantId)
+    {
+        this.participantId = participantId;
+    }
+
+    public boolean isLeader()
+    {
+        return isLeader;
+    }
+
+    public void setLeader(boolean isLeader)
+    {
+        this.isLeader = isLeader;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/assets/client.png
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/assets/client.png b/curator-x-rest/src/site/assets/client.png
deleted file mode 100644
index 27d10c2..0000000
Binary files a/curator-x-rest/src/site/assets/client.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/confluence/apis.confluence
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/confluence/apis.confluence b/curator-x-rest/src/site/confluence/apis.confluence
new file mode 100644
index 0000000..abde4ca
--- /dev/null
+++ b/curator-x-rest/src/site/confluence/apis.confluence
@@ -0,0 +1,56 @@
+[[Curator REST Proxy|index.html]] / APIs
+
+h1. APIs
+
+Here are the available APIs:
+
+h2. Status APIs
+
+||URL||Method||Request Entity||Response Entity||Description||
+|/curator/v1/client/status|GET|n/a|Status|Call to get the status of the Curator connection as well as any pending messages.|
+|/curator/v1/client/status|POST|List of string ids|Status|Call to get the status of the Curator connection as well as any pending messages. Additionally, stateful instances with the specified IDs are "touched" thus preventing timeout expiration.|
+
+h2. Client APIs
+
+NOTE: Not all combinations are valid *TBD*
+
+||URL||Method||Request Entity||Response Entity||Description||
+|/get-children|POST|GetChildrenSpec|Array of strings|This is the equivalent of CuratorFramework.getChildren().|
+|/create|POST|CreateSpec|PathAndId|This is the equivalent of CuratorFramework.create().|
+|/delete|POST|DeleteSpec|n/a|This is the equivalent of CuratorFramework.delete().|
+|/set-data|POST|SetDataSpec|n/a|This is the equivalent of CuratorFramework.setData().|
+|/get-data|POST|GetDataSpec|DataAndStat|This is the equivalent of CuratorFramework.setData().|
+|/exists|POST|ExistsSpec|ZK Stat or empty|This is the equivalent of CuratorFramework.exists().|
+
+h3. How Asynchronous APIs Are Handled
+
+*TBD*
+
+h3. How Watchers Are Handled
+
+*TBD*
+
+h3. How Ephemeral Nodes Are Handled
+
+*TBD*
+
+h2. Recipe APIs
+||URL||Method||Request Entity||Response Entity||Description||
+|/curator/v1/recipes/lock|POST|LockSpec|IdSpec|An InterProcessSemaphoreMutex. On successful return, your client will be holding the specified lock until you delete the lock via the delete API.|
+|/curator/v1/recipes/lock/{lock-id}|DELETE|n/a|n/a|Release and delete a lock.|
+|/curator/v1/recipes/leader|POST|LeaderSpec|IdSpec|Start a LeaderLatch instance. When you gain leadership, it will be notified via status.|
+|/curator/v1/recipes/leader/{leader-id}|DELETE|n/a|n/a|Release/delete leadership.|
+|/curator/v1/recipes/leader/{leader-id}|GET|n/a|array of ParticipantSpecs|List of participants in the leader election.|
+
+h3. Handling Timeouts, Status and Releasing
+
+*TBD - releases must go to same server, etc.
+
+h2. Entities
+
+See the [[Entity Descriptions Page|entities.html]] for details on the Entities used in the APIs.
+
+h2. Status Message Types
+
+See the [[Status Message Page|status.html]] for details of the status messages for each type.
+

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/confluence/entities.confluence
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/confluence/entities.confluence b/curator-x-rest/src/site/confluence/entities.confluence
new file mode 100644
index 0000000..dcf6bc5
--- /dev/null
+++ b/curator-x-rest/src/site/confluence/entities.confluence
@@ -0,0 +1,86 @@
+[[Curator REST Proxy|index.html]] / Entity Descriptions
+
+h1. Entity Descriptions
+
+Here are the entity descriptions for the entities used in the APIs:
+
+||Field||Type||Description||
+|*Status*| | |
+|state|string|This instance's Curator connection state. One of: "connected", "suspended", or "lost". If the state is other than "connected" you must assume that any open locks and/or watchers are no longer valid.|
+|messages|array of StatusMessages|Any pending messages from this instance.|
+| | | |
+|*StatusMessage*| | |
+|type|string|The status message type. See the Managing Status section for details.|
+|message|string|Type-dependent message|
+|details|string|Type-dependent details|
+|sourceId|string|Type-dependent sourceId|
+| | | |
+|*GetChildrenSpec*| | |
+|path|string|The ZK path|
+|async|boolean|If true, perform asynchronously|
+|asyncId|string|for async, a user-defined ID to return in the status message|
+|asyncListSeparator|string|for async, the separator to use for the child names. Usually you'd set this to ",".|
+|watched|boolean|if true, set a watch|
+|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
+| | | |
+|*CreateSpec*| | |
+|path|string|The ZK path|
+|data|string|The data to store in the node|
+|mode|string|The create mode. One of: "persistent", "persistent_sequential", "ephemeral", or "ephemeral_sequential"|
+| | | |
+| *PathAndId* | | |
+|path|string|The created ZK Path (possibly with a sequence suffix)|
+|id|string|The internally generated id for this node (used for ephemerals)|
+| | | |
+| *DeleteSpec* | | |
+|path|string|The ZK path|
+|async|boolean|If true, perform asynchronously|
+|asyncId|string|for async, a user-defined ID to return in the status message|
+|guaranteed|boolean|if true, use Curator's guaranteed delete mechanism|
+|version|int|the expected version to delete or -1|
+| | | |
+| *SetDataSpec* | | |
+|path|string|The ZK path|
+|data|string|The data to set|
+|async|boolean|If true, perform asynchronously|
+|asyncId|string|for async, a user-defined ID to return in the status message|
+|watched|boolean|if true, set a watch|
+|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
+|compressed|boolean|if true, compress the data using Curator's compression mechanism|
+|version|int|the expected version or -1|
+| | | |
+| *GetDataSpec* | | |
+|path|string|The ZK path|
+|async|boolean|If true, perform asynchronously|
+|asyncId|string|for async, a user-defined ID to return in the status message|
+|watched|boolean|if true, set a watch|
+|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
+|decompressed|boolean|if true, decompress the data using Curator's compression mechanism|
+| | | |
+| *DataAndStat* | | |
+|data|string|the data from the node|
+|stat|ZK Stat|the ZooKeeper stat for the node|
+| | | |
+| *ExistsSpec* | | |
+|path|string|The ZK path|
+|async|boolean|If true, perform asynchronously|
+|asyncId|string|for async, a user-defined ID to return in the status message|
+|watched|boolean|if true, set a watch|
+|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
+| | | |
+| *IdSpec* | | |
+|id|string|The ID of the created recipe, etc. Used for subsequent calls to delete, close, etc. the instance.|
+| | | |
+| *LockSpec* | | |
+|path|string|The ZK path|
+|maxWaitMs|int|Maximum time to wait to acquire the lock (in milliseconds)|
+| | | |
+| *LeaderSpec* | | |
+|path|string|The ZK path|
+|maxWaitMs|int|Maximum time to wait to acquire the lock (in milliseconds)|
+| | | |
+| *ParticipantSpec* | | |
+|participantId|string|The participant ID|
+|isLeader|boolean|true if this is the leader|
+
+*TBD*

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/confluence/index.confluence
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/confluence/index.confluence b/curator-x-rest/src/site/confluence/index.confluence
index 22755d5..da36433 100644
--- a/curator-x-rest/src/site/confluence/index.confluence
+++ b/curator-x-rest/src/site/confluence/index.confluence
@@ -8,6 +8,8 @@ any language.
 
 *TBD*
 
+!images/client.png!
+
 h2. Building and Packaging
 
 Dropwizard
@@ -32,111 +34,13 @@ h2. Managing Status
 
 *TBD*
 
-h2. Status APIs
-
-||URL||METHOD||Request Entity||Response Entity||Description||
-|/curator/v1/client/status|GET|n/a|Status|Call to get the status of the Curator connection as well as any pending messages.|
-|/curator/v1/client/status|POST|List of string ids|Status|Call to get the status of the Curator connection as well as any pending messages. Additionally, stateful instances with the specified IDs are "touched" thus preventing timeout expiration.|
-
-h2. Client APIs
-
-NOTE: Not all combinations are valid *TBD*
-
-||URL||METHOD||Request Entity||Response Entity||Description||
-|/get-children|POST|GetChildrenSpec|Array of strings|This is the equivalent of CuratorFramework.getChildren().|
-|/create|POST|CreateSpec|PathAndId|This is the equivalent of CuratorFramework.create().|
-|/delete|POST|DeleteSpec|n/a|This is the equivalent of CuratorFramework.delete().|
-|/set-data|POST|SetDataSpec|n/a|This is the equivalent of CuratorFramework.setData().|
-|/get-data|POST|GetDataSpec|DataAndStat|This is the equivalent of CuratorFramework.setData().|
-|/exists|POST|ExistsSpec|ZK Stat or empty|This is the equivalent of CuratorFramework.exists().|
-
-h3. How Asynchronous APIs Are Handled
-
-*TBD*
-
-h3. How Watchers Are Handled
-
-*TBD*
-
-h3. How Ephemeral Nodes Are Handled
+See the [[Status Message Page|status.html]] for details of the status messages for each type.
 
-*TBD*
-
-h2. Recipe APIs
-||URL||METHOD||Request Entity||Response Entity||Description||
-|/curator/v1/recipes/lock|POST|LockSpec|IdSpec|An InterProcessSemaphoreMutex. On successful return, your client will be holding the specified lock until you delete the lock via the delete API.|
-|/curator/v1/recipes/lock/{lock-id}|DELETE|n/a|n/a|Release and delete a lock.|
-|/curator/v1/recipes/leader|POST|LeaderSpec|IdSpec|Start a LeaderLatch instance. When you gain leadership, it will be notified via status.|
-|/curator/v1/recipes/leader/{leader-id}|DELETE|n/a|n/a|Release/delete leadership.|
+h2. APIs
 
-h3. Handling Timeouts, Status and Releasing
-
-*TBD - releases must go to same server, etc.
+See the [[APIs Page|apis.html]] for list of available APIs.
 
 h2. Entities
 
-||Field||Type||Description||
-|*Status*| | |
-|state|string|This instance's Curator connection state. One of: "connected", "suspended", or "lost". If the state is other than "connected" you must assume that any open locks and/or watchers are no longer valid.|
-|messages|array of StatusMessages|Any pending messages from this instance.|
-| | | |
-|*StatusMessage*| | |
-|type|string|The status message type. See the Managing Status section for details.|
-|message|string|Type-dependent message|
-|details|string|Type-dependent details|
-|sourceId|string|Type-dependent sourceId|
-| | | |
-|*GetChildrenSpec*| | |
-|path|string|The ZK path|
-|async|boolean|If true, perform asynchronously|
-|asyncId|string|for async, a user-defined ID to return in the status message|
-|asyncListSeparator|string|for async, the separator to use for the child names. Usually you'd set this to ",".|
-|watched|boolean|if true, set a watch|
-|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
-| | | |
-|*CreateSpec*| | |
-|path|string|The ZK path|
-|data|string|The data to store in the node|
-|mode|string|The create mode. One of: "persistent", "persistent_sequential", "ephemeral", or "ephemeral_sequential"|
-| | | |
-| *PathAndId* | | |
-|path|string|The created ZK Path (possibly with a sequence suffix)|
-|id|string|The internally generated id for this node (used for ephemerals)|
-| | | |
-| *DeleteSpec* | | |
-|path|string|The ZK path|
-|async|boolean|If true, perform asynchronously|
-|asyncId|string|for async, a user-defined ID to return in the status message|
-|guaranteed|boolean|if true, use Curator's guaranteed delete mechanism|
-|version|int|the expected version to delete or -1|
-| | | |
-| *SetDataSpec* | | |
-|path|string|The ZK path|
-|data|string|The data to set|
-|async|boolean|If true, perform asynchronously|
-|asyncId|string|for async, a user-defined ID to return in the status message|
-|watched|boolean|if true, set a watch|
-|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
-|compressed|boolean|if true, compress the data using Curator's compression mechanism|
-|version|int|the expected version or -1|
-| | | |
-| *GetDataSpec* | | |
-|path|string|The ZK path|
-|async|boolean|If true, perform asynchronously|
-|asyncId|string|for async, a user-defined ID to return in the status message|
-|watched|boolean|if true, set a watch|
-|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
-|decompressed|boolean|if true, decompress the data using Curator's compression mechanism|
-| | | |
-| *DataAndStat* | | |
-|data|string|the data from the node|
-|stat|ZK Stat|the ZooKeeper stat for the node|
-| | | |
-| *ExistsSpec* | | |
-|path|string|The ZK path|
-|async|boolean|If true, perform asynchronously|
-|asyncId|string|for async, a user-defined ID to return in the status message|
-|watched|boolean|if true, set a watch|
-|watchId|string|if watched, a user-defined ID to return in the status when the watch triggers|
+See the [[Entity Descriptions Page|entities.html]] for details on the Entities used in the APIs.
 
-*TBD*

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/confluence/status.confluence
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/confluence/status.confluence b/curator-x-rest/src/site/confluence/status.confluence
new file mode 100644
index 0000000..5957771
--- /dev/null
+++ b/curator-x-rest/src/site/confluence/status.confluence
@@ -0,0 +1,75 @@
+[[Curator REST Proxy|index.html]] / Status Messages
+
+h1. Status Messages
+
+h2. Status Messages
+
+|*Watchers*| |
+|Type|watch|
+|Source Id|The watchId passed in the original request|
+|Message|Either "NodeCreated", "NodeDeleted", "NodeDataChanged", or "NodeChildrenChanged"|
+|Details|The event path|
+| | |
+|*Expired Instances*| |
+|Type|expired|
+|Source Id|Generated Id of the instance that is expiring|
+|Message|Class name of the expiring instance. Either: "LeaderLatch.class", "InterProcessSemaphoreMutex.class", "NodeCache.class", "PathChildrenCache.class", "PersistentEphemeralNode.class", "InterProcessMutex.class", "LeasesHolder.class" (for semaphores)|
+|Details|n/a|
+
+h2. Asynchronous Client APIs
+
+|API: */curator/v1/client/create*| |
+|Type|client-create-async|
+|Source Id|The asyncId passed in the original request|
+|Message|PathAndId as a JSON string|
+|Details|The ZooKeeper "rc" result code|
+| | |
+|API: */curator/v1/client/delete*| |
+|Type|client-delete-async|
+|Source Id|The asyncId passed in the original request|
+|Message|n/a|
+|Details|The ZooKeeper "rc" result code|
+| | |
+|API: */curator/v1/client/get-children*| |
+|Type|client-get-children-async|
+|Source Id|The asyncId passed in the original request|
+|Message|List of children nodes separated by the value passed as asyncListSeparator in the original request|
+|Details|The ZooKeeper "rc" result code|
+| | |
+|API: */curator/v1/client/set-data*| |
+|Type|client-set-data-async|
+|Source Id|The asyncId passed in the original request|
+|Message|n/a|
+|Details|The ZooKeeper "rc" result code|
+| | |
+|API: */curator/v1/client/get-data*| |
+|Type|client-get-data-async|
+|Source Id|The asyncId passed in the original request|
+|Message|The data|
+|Details|The ZooKeeper "rc" result code|
+| | |
+|API: */curator/v1/client/exists*| |
+|Type|client-exists-async|
+|Source Id|The asyncId passed in the original request|
+|Message|ZK Stat as a JSON string|
+|Details|The ZooKeeper "rc" result code|
+
+h2. Recipe Messages
+
+|API: */curator/v1/recipes/leader*| |
+|Type|leader|
+|Source Id|generated leader Id|
+|Message|"true" if leader, "false" if leadership is lost|
+|Details|n/a|
+| | |
+|API: */curator/v1/recipes/path-cache*| |
+|Type|path-cache|
+|Source Id|generated leader Id|
+|Message|n/a|
+|Details|n/a|
+| | |
+|API: */curator/v1/recipes/node-cache*| |
+|Type|node-cache|
+|Source Id|generated leader Id|
+|Message|Either "child_added", "child_updated", "child_removed", "connection_suspended", "connection_reconnected", "connection_lost", or "initialized"|
+|Details|Node path|

http://git-wip-us.apache.org/repos/asf/curator/blob/b4c76c79/curator-x-rest/src/site/resources/images/client.png
----------------------------------------------------------------------
diff --git a/curator-x-rest/src/site/resources/images/client.png b/curator-x-rest/src/site/resources/images/client.png
new file mode 100644
index 0000000..27d10c2
Binary files /dev/null and b/curator-x-rest/src/site/resources/images/client.png differ