package com.taobao.tddl.config.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.common.exception.TddlRuntimeException; import com.taobao.tddl.config.ConfigDataHandler; import com.taobao.tddl.config.ConfigDataHandlerFactory; import com.taobao.tddl.config.ConfigDataListener; /** * 基于unit的data handler factory实现,通过Extension机制获取对应的 * {@linkplain ConfigDataHandler} * * @author <a href="junyu@taobao.com">junyu</a> * @author <a href="jianghang.loujh@taobao.com">jianghang</a> * @version 1.0 * @since 1.6 * @date 2011-1-11下午01:17:21 */ public class UnitConfigDataHandlerFactory implements ConfigDataHandlerFactory { public static final String DEFAULT_UNITNAME = ""; // 空值 protected String unitName = DEFAULT_UNITNAME; protected String appName; // 如果为null,则不会进入holder处理逻辑 public UnitConfigDataHandlerFactory(){ } public UnitConfigDataHandlerFactory(String unitName){ this.unitName = unitName; } public UnitConfigDataHandlerFactory(String unitName, String appName){ this.unitName = unitName; this.appName = appName; } @Override public ConfigDataHandler getConfigDataHandler(String dataId) { return this.getConfigDataHandler(dataId, null); } @Override public ConfigDataHandler getConfigDataHandler(String dataId, ConfigDataListener configDataListener) { List<ConfigDataListener> configDataListenerList = new ArrayList<ConfigDataListener>(); configDataListenerList.add(configDataListener); return this.getConfigDataHandler(dataId, configDataListenerList, null, new HashMap<String, Object>()); } @Override public ConfigDataHandler getConfigDataHandler(String dataId, List<ConfigDataListener> configDataListenerList, Executor executor, Map<String, Object> config) { // 获取config data handler的扩展实现 PreheatDataHandler instance = new PreheatDataHandler(); instance.setUnitName(unitName); instance.setAppName(appName); instance.setDataId(dataId); instance.setListeners(clearNullListener(configDataListenerList)); instance.setConfig(config); try { instance.init();// 启动 } catch (TddlException e) { throw new TddlRuntimeException(e); } return instance; } /** * 不能更换listenerList的引用,避免后续对list的修改无效 * * <pre> * 以下做法是被禁止的 * List result = new List * result.add * return result * </pre> */ protected List<ConfigDataListener> clearNullListener(List<ConfigDataListener> configDataListenerList) { for (int index = 0; index < configDataListenerList.size(); index++) { configDataListenerList.remove(null); } return configDataListenerList; } }