package com.dianping.pigeon.registry.zookeeper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.dianping.pigeon.registry.config.RegistryConfig;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;
import com.dianping.pigeon.log.Logger;
import com.dianping.pigeon.log.LoggerLoader;
import com.dianping.pigeon.registry.util.Constants;
public class Utils {
private static final Logger logger = LoggerLoader.getLogger(Utils.class);
private static final ObjectMapper mapper = new ObjectMapper();
public static String unescapeServiceName(String serviceName) {
return serviceName.replace(Constants.PLACEHOLDER, Constants.PATH_SEPARATOR);
}
public static String escapeServiceName(String serviceName) {
return serviceName.replace(Constants.PATH_SEPARATOR, Constants.PLACEHOLDER);
}
public static String getServicePath(String serviceName, String group) {
String path = Constants.SERVICE_PATH + Constants.PATH_SEPARATOR + escapeServiceName(serviceName);
if (!StringUtils.isBlank(group)) {
path = path + Constants.PATH_SEPARATOR + group;
}
return path;
}
public static String getWeightPath(String serviceAddress) {
String path = Constants.WEIGHT_PATH + Constants.PATH_SEPARATOR + serviceAddress;
return path;
}
public static String getAppPath(String serviceAddress) {
String path = Constants.APP_PATH + Constants.PATH_SEPARATOR + serviceAddress;
return path;
}
public static String getVersionPath(String serviceAddress) {
String path = Constants.VERSION_PATH + Constants.PATH_SEPARATOR + serviceAddress;
return path;
}
public static String getHeartBeatPath(String serviceAddress) {
String path = Constants.HEARTBEAT_PATH + Constants.PATH_SEPARATOR + serviceAddress;
return path;
}
public static String getProtocolPath(String serviceAddress) {
String path = Constants.PROTOCOL_PATH + Constants.PATH_SEPARATOR + serviceAddress;
return path;
}
public static String normalizeGroup(String group) {
return StringUtils.isBlank(group) ? Constants.DEFAULT_GROUP : group;
}
public static List<String[]> getServiceIpPortList(String serviceAddress) {
List<String[]> result = new ArrayList<String[]>();
if (serviceAddress != null && serviceAddress.length() > 0) {
String[] hostArray = serviceAddress.split(",");
for (String host : hostArray) {
int idx = host.lastIndexOf(":");
if (idx != -1) {
String ip = null;
int port = -1;
try {
ip = host.substring(0, idx);
port = Integer.parseInt(host.substring(idx + 1));
} catch (RuntimeException e) {
logger.warn("invalid host: " + host + ", ignored!");
}
if (ip != null && port > 0) {
result.add(new String[]{ip, port + ""});
}
} else {
logger.warn("invalid host: " + host + ", ignored!");
}
}
}
return result;
}
public static String getServicePath(String path) {
int idx = path.lastIndexOf(":");
if (idx != -1) {
String str = path.substring(idx + 1);
try {
Integer.parseInt(str);
int idx2 = path.lastIndexOf("/");
return path.substring(0, idx2);
} catch (NumberFormatException e) {
return path;
}
} else {
return path;
}
}
public static boolean isValidAddress(String addr) {
return StringUtils.isNotBlank(addr) && addr.contains(":") && addr.length() > 10;
}
public static String getProtocolInfo(Map<String, Boolean> infoMap) throws JsonProcessingException {
return mapper.writeValueAsString(infoMap);
}
public static ConcurrentHashMap getProtocolInfoMap(String info) throws IOException {
if (StringUtils.isNotBlank(info)) {
return mapper.readValue(info, ConcurrentHashMap.class);
}
return new ConcurrentHashMap<String, Boolean>();
}
public static String getRegistryConfigInfo(RegistryConfig registryConfig) throws JsonProcessingException {
return mapper.writeValueAsString(registryConfig);
}
public static RegistryConfig getRegistryConfig(String info) throws IOException {
if (StringUtils.isNotBlank(info)) {
return mapper.readValue(info, RegistryConfig.class);
}
return new RegistryConfig();
}
public static String getConsolePath(String clientAddress) {
return Constants.CONSOLE_PATH + Constants.PATH_SEPARATOR + clientAddress;
}
public static String getConsoleRootPath() {
return Constants.CONSOLE_PATH;
}
public static String getRegistryConfigPath(String ip) {
return Constants.HOST_CONFIG_PATH + Constants.PATH_SEPARATOR + ip;
}
}