// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/IRegistry.java
// public interface IRegistry {
// 
//     /**
//      * 注册
//      */
//     void registry(RegistryConfig registryConfig);
// 
//     void modify(RegistryConfig registryConfig);
// 
//     /**
//      * 取消注册
//      */
//     boolean unRegistry(String appKey, ThriftServerInfo serverInfo);
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/config/RegistryConfig.java
// @Setter
// @Getter
// @Builder
// @EqualsAndHashCode(of = {"serverInfo", "appKey"}, callSuper = false)
// public class RegistryConfig extends AbstractConfig {
//     @Singular
//     private List<ServiceConfig> servers = Collections.emptyList();
//     private ThriftServerInfo serverInfo;
//     private String appKey;
//     private String registry;
//     private String hostName;
//     private int weight; //权重
// 
//     public RegistryConfig() {
//         super("registry");
//     }
// 
//     public RegistryConfig(List<ServiceConfig> servers, ThriftServerInfo serverInfo, String appKey, String registry, String hostName, int weight) {
//         this();
//         this.servers = servers;
//         this.serverInfo = serverInfo;
//         this.appKey = appKey;
//         this.registry = registry;
//         this.hostName = hostName;
//         this.weight = weight;
//     }
// 
//     public String toJsonString() {
//         this.servers.stream().forEach(AbstractConfig::fillId);
//         this.fillId();
//         return JsonUtils.toJson(this);
//     }
// 
//     public static RegistryConfig parse(String json) {
//         return JsonUtils.fromJson(json, RegistryConfig.class);
//     }
// 
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/config/ThriftServerInfo.java
// @Data
// @AllArgsConstructor
// @EqualsAndHashCode
// public class ThriftServerInfo {
//     private String ip;
//     private int port;
// 
//     public ThriftServerInfo(String ipPort) {
//         checkNotNull(ipPort);
//         String[] splits = ipPort.split(":");
//         checkArgument(splits.length == 2, "ipPort format error");
//         this.ip = splits[0];
//         this.port = NumberUtils.toInt(splits[1]);
//     }
// 
//     @Override
//     public String toString() {
//         return ip + ":" + port;
//     }
// 
//     public static ThriftServerInfo parse(String info) {
//         String[] splits = StringUtils.split(info, ":");
//         if (splits == null || splits.length != 2) {
//             return null;
//         }
//         return new ThriftServerInfo(splits[0], NumberUtils.toInt(splits[1]));
//     }
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/exception/TRpcRegistryException.java
// public class TRpcRegistryException extends RuntimeException {
// 
//     public TRpcRegistryException(Exception e) {
//         super(e);
//     }
// 
//     public TRpcRegistryException(String s, Exception e) {
//         super(s, e);
//     }
// 
//     public TRpcRegistryException(String s) {
//         super(s);
//     }
// }


import com.github.sofn.trpc.core.IRegistry;
import com.github.sofn.trpc.core.config.RegistryConfig;
import com.github.sofn.trpc.core.config.ThriftServerInfo;
import com.github.sofn.trpc.core.exception.TRpcRegistryException;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentNode;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
package com.github.sofn.trpc.registry.zk;



/**
 * Authors: sofn
 * Version: 1.0  Created at 2016-09-18 22:37.
 */
@Slf4j
@Setter
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/IRegistry.java
// public interface IRegistry {
// 
//     /**
//      * 注册
//      */
//     void registry(RegistryConfig registryConfig);
// 
//     void modify(RegistryConfig registryConfig);
// 
//     /**
//      * 取消注册
//      */
//     boolean unRegistry(String appKey, ThriftServerInfo serverInfo);
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/config/RegistryConfig.java
// @Setter
// @Getter
// @Builder
// @EqualsAndHashCode(of = {"serverInfo", "appKey"}, callSuper = false)
// public class RegistryConfig extends AbstractConfig {
//     @Singular
//     private List<ServiceConfig> servers = Collections.emptyList();
//     private ThriftServerInfo serverInfo;
//     private String appKey;
//     private String registry;
//     private String hostName;
//     private int weight; //权重
// 
//     public RegistryConfig() {
//         super("registry");
//     }
// 
//     public RegistryConfig(List<ServiceConfig> servers, ThriftServerInfo serverInfo, String appKey, String registry, String hostName, int weight) {
//         this();
//         this.servers = servers;
//         this.serverInfo = serverInfo;
//         this.appKey = appKey;
//         this.registry = registry;
//         this.hostName = hostName;
//         this.weight = weight;
//     }
// 
//     public String toJsonString() {
//         this.servers.stream().forEach(AbstractConfig::fillId);
//         this.fillId();
//         return JsonUtils.toJson(this);
//     }
// 
//     public static RegistryConfig parse(String json) {
//         return JsonUtils.fromJson(json, RegistryConfig.class);
//     }
// 
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/config/ThriftServerInfo.java
// @Data
// @AllArgsConstructor
// @EqualsAndHashCode
// public class ThriftServerInfo {
//     private String ip;
//     private int port;
// 
//     public ThriftServerInfo(String ipPort) {
//         checkNotNull(ipPort);
//         String[] splits = ipPort.split(":");
//         checkArgument(splits.length == 2, "ipPort format error");
//         this.ip = splits[0];
//         this.port = NumberUtils.toInt(splits[1]);
//     }
// 
//     @Override
//     public String toString() {
//         return ip + ":" + port;
//     }
// 
//     public static ThriftServerInfo parse(String info) {
//         String[] splits = StringUtils.split(info, ":");
//         if (splits == null || splits.length != 2) {
//             return null;
//         }
//         return new ThriftServerInfo(splits[0], NumberUtils.toInt(splits[1]));
//     }
// }
// 
// Path: trpc-core/src/main/java/com/github/sofn/trpc/core/exception/TRpcRegistryException.java
// public class TRpcRegistryException extends RuntimeException {
// 
//     public TRpcRegistryException(Exception e) {
//         super(e);
//     }
// 
//     public TRpcRegistryException(String s, Exception e) {
//         super(s, e);
//     }
// 
//     public TRpcRegistryException(String s) {
//         super(s);
//     }
// }


// Path: trpc-registry/trpc-registry-zookeeper/src/main/java/com/github/sofn/trpc/registry/zk/ZkRegistry.java
import com.github.sofn.trpc.core.IRegistry;
import com.github.sofn.trpc.core.config.RegistryConfig;
import com.github.sofn.trpc.core.config.ThriftServerInfo;
import com.github.sofn.trpc.core.exception.TRpcRegistryException;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentNode;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

package com.github.sofn.trpc.registry.zk;



/**
 * Authors: sofn
 * Version: 1.0  Created at 2016-09-18 22:37.
 */
@Slf4j
@Setter
public class ZkRegistry implements IRegistry {