package com.taobao.tddl.group.config;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.taobao.tddl.common.model.Atom;
import com.taobao.tddl.common.model.Group;
import com.taobao.tddl.config.impl.holder.AbstractConfigDataHolder;
import com.taobao.tddl.group.jdbc.TGroupDataSource;
/**
* @author mengshi.sunmengshi 2013-11-12 下午5:16:38
* @since 5.0.0
*/
public class GroupConfigHolder extends AbstractConfigDataHolder {
private static final String ATOM_CONFIG_HOLDER_NAME = "com.taobao.tddl.atom.config.AtomConfigHolder";
private final String appName;
private final List<Group> groups;
private final String unitName;
public GroupConfigHolder(String appName, List<Group> groups, String unitName){
this.appName = appName;
this.groups = groups;
this.unitName = unitName;
}
protected void initSonHolder(List<Atom> atomKeys) throws Exception {
Class sonHolderClass = Class.forName(ATOM_CONFIG_HOLDER_NAME);
Constructor constructor = sonHolderClass.getConstructor(String.class, List.class, String.class);
sonConfigDataHolder = (AbstractConfigDataHolder) constructor.newInstance(this.appName, atomKeys, this.unitName);
sonConfigDataHolder.init();
delegateDataHolder.setSonConfigDataHolder(sonConfigDataHolder);// 传递给deletegate,由它进行son传递
}
public void init() {
loadDelegateExtension();
// 添加到当前holder配置,拦截对diamond的请求
for (Group group : groups) {
addDatas(group.getProperties());
}
List<String> fullGroupKeys = getFullDbGroupKeys(groups);
Map<String, String> queryResults = queryAndHold(fullGroupKeys, unitName);
initExtraConfigs();
queryResults.putAll(configHouse);
List<Atom> atomKeys = new ArrayList<Atom>();
for (Group group : groups) {
String groupKey = group.getName();
String atomConfig = queryResults.get(getFullDbGroupKey(groupKey));
if (StringUtils.isEmpty(atomConfig)) {
throw new IllegalArgumentException("Group Config Is Null, AppName >> " + appName + " ## UnitName >> "
+ unitName + " ## GroupKey >> " + groupKey);
}
String[] dsWeightArray = atomConfig.split(",");
for (String inValue : dsWeightArray) {
String atomKey = inValue.split(":")[0];
atomKeys.add(getOrCreateAtom(atomKey));
}
}
try {
initSonHolder(atomKeys);
} catch (Exception e) {
throw new IllegalStateException("Init SonConfigHolder Error, Class is : " + ATOM_CONFIG_HOLDER_NAME, e);
}
}
private void initExtraConfigs() {
List<String> extraConfKeys = getExtraConfKeys(groups);
// extraConfKeys.add(ConfigServerHelper.getTddlConfigDataId(appName));
queryAndHold(extraConfKeys, unitName);
}
private List<String> getExtraConfKeys(List<Group> groupKeys) {
List<String> result = new ArrayList<String>();
for (Group group : groupKeys) {
String groupExtraConfKey = getExtraConfKey(group.getName());
if (!configHouse.containsKey(groupExtraConfKey)) {
// 没有的配置才向远程取
result.add(groupExtraConfKey);
}
}
return result;
}
private String getExtraConfKey(String groupKey) {
return TGroupDataSource.EXTRA_PREFIX + groupKey + "." + appName;
}
private List<String> getFullDbGroupKeys(List<Group> groupKeys) {
List<String> result = new ArrayList<String>();
for (Group group : groupKeys) {
String groupKey = getFullDbGroupKey(group.getName());
if (!configHouse.containsKey(groupKey)) {
// 没有的配置才向远程取
result.add(groupKey);
}
}
return result;
}
private String getFullDbGroupKey(String groupKey) {
return TGroupDataSource.PREFIX + groupKey;
}
private Atom getOrCreateAtom(String name) {
for (Group group : groups) {
Atom atom = group.getAtom(name);
if (atom != null) {
return atom;
}
}
Atom atom = new Atom();
atom.setName(name);
return atom;
}
}