package com.taobao.tddl.atom.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import com.taobao.tddl.atom.common.TAtomConstants;
import com.taobao.tddl.common.model.Atom;
import com.taobao.tddl.common.utils.extension.Activate;
import com.taobao.tddl.config.impl.holder.AbstractConfigDataHolder;
@Activate(name = "ATOM_CONFIG_HOLDER", order = 1)
public class AtomConfigHolder extends AbstractConfigDataHolder {
private final String appName;
private final List<Atom> atoms;
private final String unitName;
public AtomConfigHolder(String appName, List<Atom> atoms, String unitName){
this.appName = appName;
this.atoms = atoms;
this.unitName = unitName;
}
public void init() {
loadDelegateExtension();
// 添加到当前holder配置,拦截对diamond的请求
for (Atom atom : atoms) {
addDatas(atom.getProperties());
}
Map<String, String> fullGlobalKeys = getFullGlobalKeyMap(atoms);
Map<String, String> globalResults = queryAndHold(values2List(fullGlobalKeys), unitName);
globalResults.putAll(configHouse);
Map<String, String> fullAppKeys = getFullAppKeyMap(atoms);
Map<String, String> appKeyResults = queryAndHold(values2List(fullAppKeys), unitName);
appKeyResults.putAll(configHouse);
List<String> passWdKeys = new ArrayList<String>();
for (Atom atom : atoms) {
String atomKey = atom.getName();
String globalValue = globalResults.get(TAtomConstants.getGlobalDataId(atomKey));
if (StringUtils.isEmpty(globalValue)) {
throw new IllegalArgumentException("Global Config Is Null, AppName >> " + appName + " ## UnitName >> "
+ unitName + " ## AtomKey >> " + atomKey);
}
Properties globalProperties = TAtomConfParser.parserConfStr2Properties(globalValue);
String dbName = globalProperties.getProperty(TAtomConfParser.GLOBA_DB_NAME_KEY);
String dbType = globalProperties.getProperty(TAtomConfParser.GLOBA_DB_TYPE_KEY);
String appValue = appKeyResults.get(TAtomConstants.getAppDataId(appName, atomKey));
if (StringUtils.isEmpty(appValue)) {
throw new IllegalArgumentException("App Config Is Null, AppName >> " + appName + " ## UnitName >> "
+ unitName + " ## AtomKey >> " + atomKey);
}
Properties dbKeyProperties = TAtomConfParser.parserConfStr2Properties(appValue);
String userName = dbKeyProperties.getProperty(TAtomConfParser.APP_USER_NAME_KEY);
String passwdKeyDataId = getPassWdKey(dbName, dbType, userName);
if (!configHouse.containsKey(passwdKeyDataId)) {
passWdKeys.add(getPassWdKey(dbName, dbType, userName));
}
}
queryAndHold(passWdKeys, unitName);
}
private List<String> values2List(Map<String, String> map) {
List<String> result = new ArrayList<String>();
for (String string : map.values())
result.add(string);
return result;
}
private Map<String, String> getFullGlobalKeyMap(List<Atom> atoms) {
Map<String, String> result = new HashMap<String, String>();
for (Atom atom : atoms) {
String globalDataId = TAtomConstants.getGlobalDataId(atom.getName());
if (!configHouse.containsKey(globalDataId)) {
result.put(atom.getName(), globalDataId);
}
}
return result;
}
private Map<String, String> getFullAppKeyMap(List<Atom> atoms) {
Map<String, String> result = new HashMap<String, String>();
for (Atom atom : atoms) {
String appDataId = TAtomConstants.getAppDataId(appName, atom.getName());
if (!configHouse.containsKey(appDataId)) {
result.put(atom.getName(), appDataId);
}
}
return result;
}
private String getPassWdKey(String dbName, String dbType, String userName) {
return TAtomConstants.getPasswdDataId(dbName, dbType, userName);
}
}