package io.mycat.server.config.loader.zkloader;
import io.mycat.server.config.ConfigException;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.utils.ZKPaths;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* provide a abstract constructor to construct zookeeper path.
* Created by v1.lion on 2015/10/8.
*/
public abstract class AbstractZKLoaders {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractZKLoaders.class);
//parent config path in zookeeper
//example /mycat-cluster-/server-config/
// /CLUSTER_ID/CONFIG_DIRECTORY_NAME
protected final String BASE_CONFIG_PATH;
public AbstractZKLoaders() {
super();
BASE_CONFIG_PATH = null;
}
public AbstractZKLoaders(String clusterID, String configDirectoryName) {
BASE_CONFIG_PATH = ZKPaths.makePath("/", clusterID, configDirectoryName);
LOGGER.trace("base config path is {}", BASE_CONFIG_PATH);
}
/**
* return a string transformed from data in specified path.
*
* @param zkConnection
* @param path path in zookeeper
* @return data string
*/
public String fetchDataToString(final CuratorFramework zkConnection, String path, String... restPath) {
return new String(fetchData(zkConnection, path, restPath), StandardCharsets.UTF_8);
}
/**
* return data based on specified path.
*
* @param zkConnection
* @param path
* @param restPath
* @return data in zookeeper
*/
public byte[] fetchData(final CuratorFramework zkConnection, String path, String... restPath) {
String dataPath = ZKPaths.makePath(BASE_CONFIG_PATH, path, restPath);
try {
byte[] rawByte = zkConnection.getData().forPath(dataPath);
LOGGER.trace("get raw data from zookeeper: {} , path : {}",
new String(rawByte, StandardCharsets.UTF_8), dataPath);
return rawByte;
} catch (Exception e) {
LOGGER.error("get config data from zookeeper error : {}, path : {}",
e.getMessage(), dataPath);
throw new ConfigException(e);
}
}
/**
* return a children name list under BASE_CONFIG_PATH
*
* @param zkConnection
* @param restPath rest path concat to BASE_CONFIG_PATH
* @return name list
*/
public List<String> fetchChildren(final CuratorFramework zkConnection, String... restPath) {
try {
String childPath = ZKPaths.makePath(BASE_CONFIG_PATH, null, restPath);
return zkConnection
.getChildren()
.forPath(childPath);
} catch (Exception e) {
LOGGER.error("fetch child node name from zookeeper error : {} , path {} ", e.getMessage(), BASE_CONFIG_PATH);
throw new ConfigException(e);
}
}
/**
* fetch config form zookeeper and then transform them to bean.
*
* @param zkConnection a zookeeper connection
*/
abstract public void fetchConfig(final CuratorFramework zkConnection);
}