/// <summary>
        /// Set the ACL for the node of the given path if such a node exists and the
        /// given version matches the version of the node. Return the stat of the
        /// node.
        ///
        /// A KeeperException with error code KeeperException.NoNode will be thrown
        /// if no node with the given path exists.
        ///
        /// A KeeperException with error code KeeperException.BadVersion will be
        /// thrown if the given version does not match the node's version.
        /// </summary>
        /// <param name="path"></param>
        /// <param name="acl"></param>
        /// <param name="version"></param>
        /// <returns>the stat of the node.</returns>
        public Task <Data.Stat> SetACL(string path, Data.ACL[] acl, int version)
        {
            var clientPath = path;

            Utils.PathUtils.ValidatePath(clientPath);
            var serverPath = Utils.PathUtils.PrependChroot(this._chrootPath, clientPath);

            return(this.ExecuteAsync <Data.Stat>(base.NextRequestSeqID(), Data.OpCode.SetACL,
                                                 new Data.SetACLRequest(serverPath, acl, version),
                                                 (src, response) =>
            {
                if (response.HasError())
                {
                    src.TrySetException(response.Error(clientPath));
                    return;
                }

                if (response.Payload == null || response.Payload.Length == 0)
                {
                    src.TrySetResult(null);
                    return;
                }

                Data.Stat result = null;
                try { result = Utils.Marshaller.Deserialize <Data.Stat>(response.Payload); }
                catch (Exception ex)
                {
                    src.TrySetException(ex);
                    return;
                }

                src.TrySetResult(result);
            }));
        }
        /// <summary>
        /// Return the stat of the node of the given path. Return null if no such a
        /// node exists.
        ///
        /// If the watch is non-null and the call is successful (no exception is thrown),
        /// a watch will be left on the node with the given path. The watch will be
        /// triggered by a successful operation that creates/delete the node or sets
        /// the data on the node.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="watcher">The watcher.</param>
        /// <returns>the stat of the node of the given path; return null if no such a node exists.</returns>
        public Task <Data.Stat> Exists(string path, IWatcher watcher)
        {
            var clientPath = path;

            Utils.PathUtils.ValidatePath(clientPath);
            var serverPath = Utils.PathUtils.PrependChroot(this._chrootPath, clientPath);

            return(this.ExecuteAsync <Data.Stat>(base.NextRequestSeqID(), Data.OpCode.Exists,
                                                 new Data.ExistsRequest(serverPath, watcher != null),
                                                 (src, response) =>
            {
                if (response.HasError() && response.ErrorCode != Data.ZoookError.NONODE)
                {
                    src.TrySetException(response.Error(clientPath));
                    return;
                }

                if (watcher != null)    //register watcher
                {
                    if (response.HasError())
                    {
                        this._watcherManager.RegisterExistWatcher(watcher, clientPath);
                    }
                    else
                    {
                        this._watcherManager.RegisterDataWatcher(watcher, clientPath);
                    }
                }

                if (response.Payload == null || response.Payload.Length == 0)
                {
                    src.TrySetResult(null);
                    return;
                }

                Data.Stat result = null;
                try { result = Utils.Marshaller.Deserialize <Data.Stat>(response.Payload); }
                catch (Exception ex)
                {
                    src.TrySetException(ex);
                    return;
                }

                src.TrySetResult(result);
            }));
        }
 /// <summary>
 /// read
 /// </summary>
 /// <param name="formatter"></param>
 public void Read(Utils.IFormatter formatter)
 {
     this.Data = formatter.ReadBuffer();
     this.Stat = formatter.ReadRecord<Stat>();
 }
 /// <summary>
 /// read
 /// </summary>
 /// <param name="formatter"></param>
 public void Read(Utils.IFormatter formatter)
 {
     this.Children = formatter.ReadStringArray();
     this.Stat = formatter.ReadRecord<Stat>();
 }