/* * 文件名称: UConfig.java * 版权信息: Copyright 2001-2011 ZheJiang Collaboration Data System Co., LTD. All right reserved. * ---------------------------------------------------------------------------------------------- * 修改历史: * ---------------------------------------------------------------------------------------------- * 修改原因: 新增 * 修改人员: LuoJingtian * 修改日期: 2011-12-19 * 修改内容: */ package com.mfh.comna.comn.cfg; import com.mfh.comn.config.ConfigClass; import com.mfh.comn.config.ConfigItem; import com.mfh.comn.config.ConfigLocationItem; import com.mfh.comn.config.ConfigsParseHelper; import com.mfh.comn.config.UConfig; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 统一配置缓存, 适合于容器持有. 对不需要缓存的配置读取, 建议使用 {@link com.mfh.comna.comn.cfg.UConfigHelper}.<BR><BR> * 使用示例: * * <pre> * UConfigCache cache = new UConfigCache(); * UConfig uc = cache.getUConfig("SHK.COMMON"); * System.out.println(uc.getString("myurl")); * System.out.println(uc.getString("password")); * cache.destroy(); * </pre> * * @author <a href="mailto:luojt@zjcds.com">LuoJingtian</a> created on 2011-12-19 * @since chch Framework 1.0 */ public final class UConfigCache extends UConfigWrapper { /** 统一配置缓存: key=domain value=UConfig */ private Map<String, UConfig> uconfigs = new HashMap<>(); private Map<String, ConfigItem> configItems = null; private static UConfigCache configCache = null; public UConfigCache() { super(); } public UConfigCache(String configAlias) { super(configAlias); } public static UConfigCache getConfig(){ if (configCache == null) { synchronized (UConfigCache.class) { if (configCache == null) configCache = new UConfigCache(); } } return configCache; } public static UConfigCache getConfig(String configAlias){ if (configCache == null) { synchronized (UConfigCache.class) { if (configCache == null) { configCache = new UConfigCache(configAlias); } } } return configCache; } public Map<String, ConfigItem> getConfigItems() { if (configItems == null) init(configAlias); return configItems; } /** * 初始化统一配置缓存 * @author LuoJingtian created on 2011-12-20 * @since chch Framework 1.0 */ private void init(String configAlias) { configItems = ConfigsParseHelper.getConfigs(configAlias); ConfigClass configClass = ConfigsParseHelper.getConfigClass(configAlias); UConfig uconfig; ConfigItem configItem; String domain; for (Map.Entry<String, ConfigItem> entry : configItems.entrySet()) { domain = entry.getKey(); if (uconfigs.containsKey(domain)) { logger.warn("初始化配置失败: 重复的配置域[" + domain + "]."); continue; } configItem = entry.getValue(); try { uconfig = configClass.getUconfigClass().newInstance(); //new DefaultUConfig(); uconfig.init(configItem, configClass.getConfigDomainClass()); uconfigs.put(domain, uconfig); } catch (Exception e) { // 某一个配置初始化失败, 记录日志, 继续初始化下一个配置 logger.warn("初始化配置失败:" + e.getMessage() + configItem, e); } } } /** * 根据配置项所属域获取统一配置接口. * @param domain 统一配置项所属域 * @return 统一配置接口 * @author LuoJingtian created on 2011-12-20 * @since chch Framework 1.0 */ public UConfig getDomain(String domain) { if (uconfigs.isEmpty()) { init(this.configAlias); } return uconfigs.get(domain); } public void clearUConfigInner(String domain){ if (uconfigs.isEmpty()) return; uconfigs.remove(domain); } /** * 清空统一配置缓存, 释放资源. * @author LuoJingtian created on 2011-12-20 * @since chch Framework 1.0 */ public void destroy() { uconfigs.clear(); configItems = null; } public static UConfig getUConfig(String domain){ return getConfig().getDomain(domain); } /** * 清除一个配置项 * @param domain * @author zhangyz created on 2012-3-27 */ public static void clearUConfig(String domain){ getConfig().clearUConfigInner(domain); } /** * 获取配置项的配置路径,若存在多个,取最后一个 * @param domain * @return * @author zhangyz created on 2012-3-27 */ public static URL getUConfigFilePath(String domain){ ConfigItem configItem = getConfig().getConfigItems().get(domain); ConfigLocationItem item = configItem.getLastConfigLocationItem(); if (item == null) return null; return getConfigUrl(item.getLocation()); } /** * 获取所有配置路径 * @param domain * @return * @author zhangyz created on 2012-3-22 */ public static URL[] getConfigLocations(String domain){ ConfigItem configItem = getConfig().getConfigItems().get(domain); ConfigLocationItem dc = configItem.getDefaultLocation(); if (dc == null) return new URL[0]; List<ConfigLocationItem> configs = configItem.getExtendsLocations(); URL[] ret = new URL[1 + configs.size()]; URL url = getConfigUrl(configItem.getDefaultLocation().getLocation()); ret[0] = url; int index = 1; for (ConfigLocationItem item:configs){ url = getConfigUrl(item.getLocation()); ret[index ++] = url; } return ret; } }