// Path: redant-core/src/main/java/com/redant/core/common/util/GenericsUtil.java
// public class GenericsUtil {
// 	
// 	/**
// 	 * 通过反射获得Class声明的范型Class.
// 	 * 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> maps, List<String> names){}
// 	 * @param method 方法
// 	 * @param index 第几个输入参数
// 	 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口，即不支持泛型，所以直接返回空集合
// 	 */
// 	@SuppressWarnings("rawtypes")
// 	public static List<Class> getMethodGenericParameterTypes(Method method, int index) {
// 		List<Class> results = new ArrayList<Class>();
// 		Type[] genericParameterTypes = method.getGenericParameterTypes();
// 		if (index >= genericParameterTypes.length || index < 0) {
// 			throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));
// 		}
// 		Type genericParameterType = genericParameterTypes[index];
// 		if (genericParameterType instanceof ParameterizedType) {
// 			ParameterizedType aType = (ParameterizedType) genericParameterType;
// 			Type[] parameterArgTypes = aType.getActualTypeArguments();
// 			for (Type parameterArgType : parameterArgTypes) {
// 				Class parameterArgClass = (Class) parameterArgType;
// 				results.add(parameterArgClass);
// 			}
// 			return results;
// 		}
// 		return results;
// 	}
// 
// 
// 	/**
// 	 * 断言非空
// 	 * @param dataName 参数
// 	 * @param values 值
// 	 */
// 	public static void checkNull(String dataName, Object... values){
// 		if(values == null){
// 			throw new ValidationException("["+ dataName + "] cannot be null");
// 		}
// 		for (Object value : values) {
// 			if (value == null) {
// 				throw new ValidationException("[" + dataName + "] cannot be null");
// 			}
// 		}
// 	}
// 
// 	/**
// 	 * 断言非空
// 	 * @param dataName 参数
// 	 * @param values 值
// 	 */
// 	public static void checkBlank(String dataName, Object... values){
// 		if(values == null){
// 			throw new ValidationException("["+ dataName + "] cannot be null");
// 		}
// 		for (Object value : values) {
// 			if (value == null || StrUtil.isBlank(value.toString())) {
// 				throw new ValidationException("[" + dataName + "] cannot be blank");
// 			}
// 		}
// 	}
// 
// 	/**
// 	 * 获取ipV4
// 	 * @return ipV4
// 	 */
// 	public static String getLocalIpV4(){
// 		LinkedHashSet<String> ipV4Set = NetUtil.localIpv4s();
// 		return ipV4Set.isEmpty()?"":ipV4Set.toArray()[0].toString();
// 	}
// 
// }


import com.redant.core.common.util.GenericsUtil;
import java.util.Properties;
package com.redant.cluster.zk;




/**
 * 启动zk所需要的配置信息
 * @author houyi.wh
 * @date 2017/11/21
 */
public class ZkConfig {

    private interface ZkConstant {
        int CLIENT_PORT = 2181;
        String DATA_DIR = "/Users/houyi/zookeeper/data";
        String DATA_LOG_DIR = "/Users/houyi/zookeeper/log";
    }

    /**
     * 客户端连接的端口
     */
    private int clientPort;

    private int tickTime = 2000;

    private int initLimit = 10;

    private int syncLimit = 5;

    /**
     * 数据存储目录，格式为：
     * /home/zookeeper/1/data
     */
    private String dataDir;

    /**
     * 日志存储目录，格式为：
     * /home/zookeeper/1/log
     */
    private String dataLogDir;

    /**
     * 客户端连接数上限
     */
    private int maxClientCnxns = 60;

    public ZkConfig(int clientPort,String dataDir,String dataLogDir){
        this.clientPort = clientPort;
        this.dataDir = dataDir;
        this.dataLogDir = dataLogDir;
    }

    public static ZkConfig DEFAULT = new ZkConfig(ZkConstant.CLIENT_PORT,ZkConstant.DATA_DIR,ZkConstant.DATA_LOG_DIR);


    public String generateZkAddress(){
// Path: redant-core/src/main/java/com/redant/core/common/util/GenericsUtil.java
// public class GenericsUtil {
// 	
// 	/**
// 	 * 通过反射获得Class声明的范型Class.
// 	 * 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> maps, List<String> names){}
// 	 * @param method 方法
// 	 * @param index 第几个输入参数
// 	 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口，即不支持泛型，所以直接返回空集合
// 	 */
// 	@SuppressWarnings("rawtypes")
// 	public static List<Class> getMethodGenericParameterTypes(Method method, int index) {
// 		List<Class> results = new ArrayList<Class>();
// 		Type[] genericParameterTypes = method.getGenericParameterTypes();
// 		if (index >= genericParameterTypes.length || index < 0) {
// 			throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));
// 		}
// 		Type genericParameterType = genericParameterTypes[index];
// 		if (genericParameterType instanceof ParameterizedType) {
// 			ParameterizedType aType = (ParameterizedType) genericParameterType;
// 			Type[] parameterArgTypes = aType.getActualTypeArguments();
// 			for (Type parameterArgType : parameterArgTypes) {
// 				Class parameterArgClass = (Class) parameterArgType;
// 				results.add(parameterArgClass);
// 			}
// 			return results;
// 		}
// 		return results;
// 	}
// 
// 
// 	/**
// 	 * 断言非空
// 	 * @param dataName 参数
// 	 * @param values 值
// 	 */
// 	public static void checkNull(String dataName, Object... values){
// 		if(values == null){
// 			throw new ValidationException("["+ dataName + "] cannot be null");
// 		}
// 		for (Object value : values) {
// 			if (value == null) {
// 				throw new ValidationException("[" + dataName + "] cannot be null");
// 			}
// 		}
// 	}
// 
// 	/**
// 	 * 断言非空
// 	 * @param dataName 参数
// 	 * @param values 值
// 	 */
// 	public static void checkBlank(String dataName, Object... values){
// 		if(values == null){
// 			throw new ValidationException("["+ dataName + "] cannot be null");
// 		}
// 		for (Object value : values) {
// 			if (value == null || StrUtil.isBlank(value.toString())) {
// 				throw new ValidationException("[" + dataName + "] cannot be blank");
// 			}
// 		}
// 	}
// 
// 	/**
// 	 * 获取ipV4
// 	 * @return ipV4
// 	 */
// 	public static String getLocalIpV4(){
// 		LinkedHashSet<String> ipV4Set = NetUtil.localIpv4s();
// 		return ipV4Set.isEmpty()?"":ipV4Set.toArray()[0].toString();
// 	}
// 
// }


// Path: redant-cluster/src/main/java/com/redant/cluster/zk/ZkConfig.java
import com.redant.core.common.util.GenericsUtil;
import java.util.Properties;

package com.redant.cluster.zk;




/**
 * 启动zk所需要的配置信息
 * @author houyi.wh
 * @date 2017/11/21
 */
public class ZkConfig {

    private interface ZkConstant {
        int CLIENT_PORT = 2181;
        String DATA_DIR = "/Users/houyi/zookeeper/data";
        String DATA_LOG_DIR = "/Users/houyi/zookeeper/log";
    }

    /**
     * 客户端连接的端口
     */
    private int clientPort;

    private int tickTime = 2000;

    private int initLimit = 10;

    private int syncLimit = 5;

    /**
     * 数据存储目录，格式为：
     * /home/zookeeper/1/data
     */
    private String dataDir;

    /**
     * 日志存储目录，格式为：
     * /home/zookeeper/1/log
     */
    private String dataLogDir;

    /**
     * 客户端连接数上限
     */
    private int maxClientCnxns = 60;

    public ZkConfig(int clientPort,String dataDir,String dataLogDir){
        this.clientPort = clientPort;
        this.dataDir = dataDir;
        this.dataLogDir = dataLogDir;
    }

    public static ZkConfig DEFAULT = new ZkConfig(ZkConstant.CLIENT_PORT,ZkConstant.DATA_DIR,ZkConstant.DATA_LOG_DIR);


    public String generateZkAddress(){
        return GenericsUtil.getLocalIpV4()+":"+this.clientPort;