package com.app.mvc.config;
import com.app.mvc.acl.util.RequestHolder;
import com.app.mvc.beans.JsonMapper;
import com.app.mvc.common.SpringHelper;
import com.app.mvc.http.HttpClients;
import com.app.mvc.proxy.ProxyManager;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by jimin on 15/11/7.
*/
@Slf4j
public class GlobalConfig {
private static Map<String, String> configMap = Maps.newConcurrentMap();
private static Map<String, List<String>> listStringMap = Maps.newConcurrentMap();
private static Map<String, List<Integer>> listIntMap = Maps.newConcurrentMap();
private static Map<String, Set<String>> setStringMap = Maps.newConcurrentMap();
private static Map<String, Map<String, String>> mapStringStringMap = Maps.newConcurrentMap();
public synchronized static void loadAllConfig() {
log.info("load all config");
List<Configuration> configurationList = SpringHelper.popBean(ConfigurationService.class).getAll();
if (CollectionUtils.isEmpty(configurationList)) {
log.info("no config");
}
Map<String, String> tempMap = Maps.newHashMap();
for (Configuration configuration : configurationList) {
tempMap.put(configuration.getK(), configuration.getV().trim());
}
ProxyManager.getProxyManager().reload(tempMap);
configMap = tempMap;
listStringMap.clear();
listIntMap.clear();
setStringMap.clear();
mapStringStringMap.clear();
log.info("config: {}", JsonMapper.obj2String(configMap));
}
public static List<String> loadMachineConfig() {
// 本机需要先加载config, 因为加载的机器列表可能会变
loadAllConfig();
Set<String> machineSet = GlobalConfig.getSetValue(GlobalConfigKey.MACHINE_LIST);
List<String> result = Lists.newArrayList();
for (String machine : machineSet) {
String url = StringUtils.join(machine, "/config/reload.json");
try {
String response = HttpClients.syncClient().cookie(RequestHolder.getCurrentRequest().getHeader("cookie"), CookiePolicy.BROWSER_COMPATIBILITY)
.get(url).getContent();
log.info("{} load config success, {}", url, response);
result.add(url + " load config success");
} catch (Throwable t) {
log.error("{} load config failed", url, t);
result.add(url + "load config failed, error: " + t.getMessage());
}
}
return result;
}
public static int getIntValue(String k, int defaultValue) {
return NumberUtils.toInt(configMap.get(k), defaultValue);
}
public static long getLongValue(String k, long defaultValue) {
return NumberUtils.toLong(configMap.get(k), defaultValue);
}
public static String getValue(String k) {
return configMap.get(k);
}
public static String getStringValue(String k, String defaultValue) {
if (configMap.containsKey(k)) {
return configMap.get(k).trim();
} else {
log.info("config use default value, key:{}, value:{}", k, defaultValue);
return defaultValue;
}
}
public static boolean getBooleanValue(String k, boolean defaultValue) {
if (configMap.containsKey(k)) {
return Boolean.parseBoolean(configMap.get(k));
} else {
log.info("config use default value, key:{}, value:{}", k, defaultValue);
return defaultValue;
}
}
public static Set<String> getSetValue(String k) {
return getSetValue(k, ",");
}
public static Set<String> getSetValue(String k, String separator) {
Set<String> result = Sets.newHashSet();
if (!configMap.containsKey(k)) {
return result;
}
if (setStringMap.containsKey(k)) {
return setStringMap.get(k);
}
String v = configMap.get(k);
if (StringUtils.isBlank(v)) {
return result;
}
Iterable<String> res = Splitter.on(separator).trimResults().omitEmptyStrings().split(v);
for (String str : res) {
result.add(str.trim());
}
setStringMap.put(k, result);
return result;
}
public static List<String> getListStringValue(String k) {
return getListStringValue(k, ",");
}
public static List<String> getListStringValue(String k, String separator) {
List<String> result = Lists.newArrayList();
if (!configMap.containsKey(k)) {
return result;
}
if (listStringMap.containsKey(k)) {
return listStringMap.get(k);
}
String v = configMap.get(k);
if (StringUtils.isBlank(v)) {
return result;
}
Iterable<String> res = Splitter.on(separator).trimResults().omitEmptyStrings().split(v);
for (String str : res) {
result.add(str.trim());
}
listStringMap.put(k, result);
return result;
}
public static List<Integer> getListIntValue(String k) {
return getListIntValue(k);
}
public static List<Integer> getListIntValue(String k, String separator) {
List<Integer> result = Lists.newArrayList();
if (!configMap.containsKey(k)) {
return result;
}
if (listIntMap.containsKey(k)) {
return listIntMap.get(k);
}
String v = configMap.get(k);
if (StringUtils.isBlank(v)) {
return result;
}
Iterable<String> res = Splitter.on(separator).trimResults().omitEmptyStrings().split(v);
try {
for (String str : res) {
result.add(Integer.valueOf(str.trim()));
}
} catch (NumberFormatException e) {
log.error("List<Integer> parse error, k:{}, v:{}", k, v, e);
return Lists.newArrayList();
}
listIntMap.put(k, result);
return result;
}
public static Map<String, String> getMapValue(String k) {
return getMapValue(k, ";", ",");
}
public static Map<String, String> getMapValue(String k, String sep1, String sep2) {
Map<String, String> result = Maps.newHashMap();
if (!configMap.containsKey(k)) {
return result;
}
if (mapStringStringMap.containsKey(k)) {
return mapStringStringMap.get(k);
}
String v = configMap.get(k);
if (StringUtils.isBlank(v)) {
return result;
}
Iterable<String> res = Splitter.on(sep1).trimResults().omitEmptyStrings().split(v);
try {
for (String str : res) {
String[] temp = str.split(sep2);
Preconditions.checkArgument(temp.length == 2);
result.put(temp[0].trim(), temp[1].trim());
}
} catch (Exception e) {
log.error("Map<String, String> parse error, k:{}, v:{}", k, v, e);
return Maps.newConcurrentMap();
}
mapStringStringMap.put(k, result);
return result;
}
}