// Path: elastic-config-core/src/main/java/com/github/config/group/ZookeeperConfigProfile.java
// @Setter
// @Getter
// @ToString
// @NoArgsConstructor
// public class ZookeeperConfigProfile extends ConfigProfile {
// 
// 	public ZookeeperConfigProfile(String serverlist, String namespaces, String rootNode, String version) {
// 		super(rootNode, version);
// 		this.serverlist = serverlist;
// 		this.namespaces = namespaces;
// 	}
// 
// 	/**
// 	 * zookeeper地址,包括IP地址和端口号. 多个地址用逗号分隔
// 	 */
// 	private String serverlist;
// 
// 	/**
// 	 * Zookeeper项目配置命名空间
// 	 */
// 	private String namespaces;
// 
// 	/**
// 	 * Zookeeper项目配置监控端口
// 	 */
// 	private int monitorPort = -1;
// 
// 	public String getConcurrentRootNodePath() {
// 		return ZKPaths.makePath(rootNode, version, node);
// 	}
// 
// 	public String getVersionRootNodePath(String node) {
// 		return ZKPaths.makePath(rootNode, version, node);
// 	}
// 
// 	public String getFullPath(String key) {
// 		return ZKPaths.makePath(rootNode, version, node, key);
// 	}
// 
// 	public boolean isVersionRootPath(String path) {
// 		return getConcurrentRootNodePath().equals(path);
// 	}
// }


import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import com.github.config.group.ZookeeperConfigProfile;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

	protected abstract List<String> getConfigNodeChildrenKey();

	/**
	 * 加载Key
	 * 
	 * @param nodePath
	 *            节点路径
	 * @return 此节点健值对
	 */
	protected abstract Optional<? extends Pair<String, String>> loadKey(String nodeName);

	/**
	 * 刷新配置
	 */
	protected void refreshElasticConfig() {
	}

	/**
	 * 加载节点
	 */
	public void loadNode() {
		List<String> children = getConfigNodeChildrenKey();
		if (!children.isEmpty()) {
			Map<String, String> configs = Maps.newHashMap();
			for (String child : children) {
				Optional<? extends Pair<String, String>> keyValue = loadKey(child);
				if (keyValue.isPresent()) {
					configs.put(keyValue.get().getKey(), keyValue.get().getValue());
				}
			}

// Path: elastic-config-core/src/main/java/com/github/config/group/ZookeeperConfigProfile.java
// @Setter
// @Getter
// @ToString
// @NoArgsConstructor
// public class ZookeeperConfigProfile extends ConfigProfile {
// 
// 	public ZookeeperConfigProfile(String serverlist, String namespaces, String rootNode, String version) {
// 		super(rootNode, version);
// 		this.serverlist = serverlist;
// 		this.namespaces = namespaces;
// 	}
// 
// 	/**
// 	 * zookeeper地址,包括IP地址和端口号. 多个地址用逗号分隔
// 	 */
// 	private String serverlist;
// 
// 	/**
// 	 * Zookeeper项目配置命名空间
// 	 */
// 	private String namespaces;
// 
// 	/**
// 	 * Zookeeper项目配置监控端口
// 	 */
// 	private int monitorPort = -1;
// 
// 	public String getConcurrentRootNodePath() {
// 		return ZKPaths.makePath(rootNode, version, node);
// 	}
// 
// 	public String getVersionRootNodePath(String node) {
// 		return ZKPaths.makePath(rootNode, version, node);
// 	}
// 
// 	public String getFullPath(String key) {
// 		return ZKPaths.makePath(rootNode, version, node, key);
// 	}
// 
// 	public boolean isVersionRootPath(String path) {
// 		return getConcurrentRootNodePath().equals(path);
// 	}
// }


// Path: elastic-config-core/src/main/java/com/github/config/api/AbstractElasticConfig.java
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import com.github.config.group.ZookeeperConfigProfile;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

	protected abstract List<String> getConfigNodeChildrenKey();

	/**
	 * 加载Key
	 * 
	 * @param nodePath
	 *            节点路径
	 * @return 此节点健值对
	 */
	protected abstract Optional<? extends Pair<String, String>> loadKey(String nodeName);

	/**
	 * 刷新配置
	 */
	protected void refreshElasticConfig() {
	}

	/**
	 * 加载节点
	 */
	public void loadNode() {
		List<String> children = getConfigNodeChildrenKey();
		if (!children.isEmpty()) {
			Map<String, String> configs = Maps.newHashMap();
			for (String child : children) {
				Optional<? extends Pair<String, String>> keyValue = loadKey(child);
				if (keyValue.isPresent()) {
					configs.put(keyValue.get().getKey(), keyValue.get().getValue());
				}
			}

			refresh(Optional.of(configs));
