// Path: elastic-config-core/src/main/java/com/github/config/exception/RegisterExceptionHandler.java
// @Slf4j
// @NoArgsConstructor(access = AccessLevel.PRIVATE)
// public final class RegisterExceptionHandler {
// 
//     /**
//      * 处理掉中断和连接失效异常并继续抛出RegisterException.
//      * 
//      * @param cause 待处理的异常.
//      */
//     public static void handleException(final Exception cause) {
//         if (isIgnoredException(cause) || isIgnoredException(cause.getCause())) {
//             log.debug("Elastic config: ignored exception for: {}", cause.getMessage());
//         }
//         else if (cause instanceof InterruptedException) {
//             Thread.currentThread().interrupt();
//         }
//         else {
//             throw new RegisterException(cause);
//         }
//     }
// 
//     private static boolean isIgnoredException(final Throwable cause) {
//         return null != cause
//             && (cause instanceof ConnectionLossException || cause instanceof NoNodeException || cause instanceof NodeExistsException);
//     }
// }
// 
// Path: elastic-config-core/src/main/java/com/github/config/register/base/ElasticConfigRegistryCenter.java
// public interface ElasticConfigRegistryCenter extends RegistryCenter {
// 
//     /**
//      * 直接从注册中心而非本地缓存获取数据.
//      * 
//      * @param key 键
//      * @return 值
//      */
//     String getDirectly(String key);
// 
//     /**
//      * 获取子节点名称集合.
//      * 
//      * @param key 键
//      * @return 子节点名称集合
//      */
//     List<String> getChildrenKeys(String key);
// 
//     /**
//      * 持久化临时注册数据.
//      * 
//      * @param key 键
//      * @param value 值
//      */
//     void persistEphemeral(String key, String value);
// 
//     /**
//      * 持久化顺序注册数据.
//      *
//      * @param key 键
//      * @return 包含10位顺序数字的znode名称
//      */
//     String persistSequential(String key);
// 
//     /**
//      * 持久化临时顺序注册数据.
//      * 
//      * @param key 键
//      */
//     void persistEphemeralSequential(String key);
// 
//     /**
//      * 添加本地缓存.
//      * 
//      * @param cachePath 需加入缓存的路径
//      */
//     void addCacheData(String cachePath);
// 
//     /**
//      * 获取注册中心数据缓存对象.
//      * 
//      * @param cachePath 缓存的节点路径
//      * @return 注册中心数据缓存对象
//      */
//     Object getRawCache(String cachePath);
// }


import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.framework.api.ACLProvider;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.CloseableUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.ACL;
import com.github.config.exception.RegisterExceptionHandler;
import com.github.config.register.base.ElasticConfigRegistryCenter;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
    }

    @Override
    public void persistEphemeral(final String key, final String value) {
        try {
            if (isExisted(key)) {
                client.delete().deletingChildrenIfNeeded().forPath(key);
            }
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)
                .forPath(key, value.getBytes(Charset.forName("UTF-8")));
        }
        catch (final Exception ex) {
            RegisterExceptionHandler.handleException(ex);
        }
    }

    @Override
    public String persistSequential(final String key) {
        try {
            return client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(key);
        }
        catch (final Exception ex) {
            RegisterExceptionHandler.handleException(ex);
        }
        return null;
    }

    @Override
    public void persistEphemeralSequential(final String key) {
        try {
// Path: elastic-config-core/src/main/java/com/github/config/exception/RegisterExceptionHandler.java
// @Slf4j
// @NoArgsConstructor(access = AccessLevel.PRIVATE)
// public final class RegisterExceptionHandler {
// 
//     /**
//      * 处理掉中断和连接失效异常并继续抛出RegisterException.
//      * 
//      * @param cause 待处理的异常.
//      */
//     public static void handleException(final Exception cause) {
//         if (isIgnoredException(cause) || isIgnoredException(cause.getCause())) {
//             log.debug("Elastic config: ignored exception for: {}", cause.getMessage());
//         }
//         else if (cause instanceof InterruptedException) {
//             Thread.currentThread().interrupt();
//         }
//         else {
//             throw new RegisterException(cause);
//         }
//     }
// 
//     private static boolean isIgnoredException(final Throwable cause) {
//         return null != cause
//             && (cause instanceof ConnectionLossException || cause instanceof NoNodeException || cause instanceof NodeExistsException);
//     }
// }
// 
// Path: elastic-config-core/src/main/java/com/github/config/register/base/ElasticConfigRegistryCenter.java
// public interface ElasticConfigRegistryCenter extends RegistryCenter {
// 
//     /**
//      * 直接从注册中心而非本地缓存获取数据.
//      * 
//      * @param key 键
//      * @return 值
//      */
//     String getDirectly(String key);
// 
//     /**
//      * 获取子节点名称集合.
//      * 
//      * @param key 键
//      * @return 子节点名称集合
//      */
//     List<String> getChildrenKeys(String key);
// 
//     /**
//      * 持久化临时注册数据.
//      * 
//      * @param key 键
//      * @param value 值
//      */
//     void persistEphemeral(String key, String value);
// 
//     /**
//      * 持久化顺序注册数据.
//      *
//      * @param key 键
//      * @return 包含10位顺序数字的znode名称
//      */
//     String persistSequential(String key);
// 
//     /**
//      * 持久化临时顺序注册数据.
//      * 
//      * @param key 键
//      */
//     void persistEphemeralSequential(String key);
// 
//     /**
//      * 添加本地缓存.
//      * 
//      * @param cachePath 需加入缓存的路径
//      */
//     void addCacheData(String cachePath);
// 
//     /**
//      * 获取注册中心数据缓存对象.
//      * 
//      * @param cachePath 缓存的节点路径
//      * @return 注册中心数据缓存对象
//      */
//     Object getRawCache(String cachePath);
// }


// Path: elastic-config-core/src/main/java/com/github/config/register/zookeeper/ZookeeperRegistryCenter.java
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.framework.api.ACLProvider;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.CloseableUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.ACL;
import com.github.config.exception.RegisterExceptionHandler;
import com.github.config.register.base.ElasticConfigRegistryCenter;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;

    }

    @Override
    public void persistEphemeral(final String key, final String value) {
        try {
            if (isExisted(key)) {
                client.delete().deletingChildrenIfNeeded().forPath(key);
            }
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)
                .forPath(key, value.getBytes(Charset.forName("UTF-8")));
        }
        catch (final Exception ex) {
            RegisterExceptionHandler.handleException(ex);
        }
    }

    @Override
    public String persistSequential(final String key) {
        try {
            return client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(key);
        }
        catch (final Exception ex) {
            RegisterExceptionHandler.handleException(ex);
        }
        return null;
    }

    @Override
    public void persistEphemeralSequential(final String key) {
        try {
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(key);