package com.baidu.disconf.client.store.inner; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.baidu.disconf.client.common.model.DisconfCenterBaseModel; import com.baidu.disconf.client.common.model.DisconfCenterFile; import com.baidu.disconf.client.common.model.DisconfCenterItem; import com.baidu.disconf.client.common.update.IDisconfUpdatePipeline; /** * 配置仓库,是个单例 * * @author liaoqiqi * @version 2014-6-9 */ public class DisconfCenterStore { protected static final Logger LOGGER = LoggerFactory.getLogger(DisconfCenterStore.class); private DisconfCenterStore() { } /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。 */ private static class SingletonHolder { /** * 静态初始化器,由JVM来保证线程安全 */ private static DisconfCenterStore instance = new DisconfCenterStore(); } public static DisconfCenterStore getInstance() { return SingletonHolder.instance; } // 每个配置文件一条 // key: 配置文件名 // value: 配置文件数据 private Map<String, DisconfCenterFile> confFileMap = new HashMap<String, DisconfCenterFile>(); // 每个配置Item一条 // key: 配置项的Key // value: 配置项数据 private Map<String, DisconfCenterItem> confItemMap = new HashMap<String, DisconfCenterItem>(); // 主备切换时的Key列表 private List<String> activeBackupKeyList; // private IDisconfUpdatePipeline iDisconfUpdatePipeline = null; // 标识本机器名 private String machineName; /** * 存储 一个配置文件 */ public void storeOneFile(DisconfCenterBaseModel disconfCenterBaseModel) { DisconfCenterFile disconfCenterFile = (DisconfCenterFile) disconfCenterBaseModel; String fileName = disconfCenterFile.getFileName(); if (confFileMap.containsKey(fileName)) { LOGGER.warn("There are two same fileName key!!!! " + fileName); DisconfCenterFile existCenterFile = confFileMap.get(fileName); // 如果是 同时使用了 注解式 和 非注解式 两种方式,则当修改时也要 进行 XML 式 reload if (disconfCenterFile.isTaggedWithNonAnnotationFile()) { existCenterFile.setIsTaggedWithNonAnnotationFile(true); } } else { confFileMap.put(fileName, disconfCenterFile); } } /** * 存储 一个配置项 */ public void storeOneItem(DisconfCenterBaseModel disconfCenterBaseModel) { DisconfCenterItem disconfCenterItem = (DisconfCenterItem) disconfCenterBaseModel; String key = disconfCenterItem.getKey(); if (confItemMap.containsKey(key)) { LOGGER.error("There are two same item key!!!! " + "first: " + confItemMap.get(key).getClass().toString() + ", Second: " + disconfCenterItem.getClass().toString()); } else { confItemMap.put(key, disconfCenterItem); } } /** * 删除一个配置项 */ public void excludeOneItem(String key) { if (confItemMap.containsKey(key)) { confItemMap.remove(key); } } /** * 删除一个配置文件 */ public void excludeOneFile(String key) { if (confFileMap.containsKey(key)) { confFileMap.remove(key); } } public Map<String, DisconfCenterFile> getConfFileMap() { return confFileMap; } public Map<String, DisconfCenterItem> getConfItemMap() { return confItemMap; } public List<String> getActiveBackupKeyList() { return activeBackupKeyList; } public String getMachineName() { return machineName; } public void setMachineName(String machineName) { this.machineName = machineName; } public IDisconfUpdatePipeline getiDisconfUpdatePipeline() { return iDisconfUpdatePipeline; } public void setiDisconfUpdatePipeline( IDisconfUpdatePipeline iDisconfUpdatePipeline) { this.iDisconfUpdatePipeline = iDisconfUpdatePipeline; } }