/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.component.cache; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Map.Entry; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import com.jinhe.tss.core.cachepool.CacheManager; import com.jinhe.tss.core.cachepool.Cacheable; import com.jinhe.tss.core.cachepool.IPool; import com.jinhe.tss.core.cachepool.strategy.CacheConstants; import com.jinhe.tss.core.cachepool.strategy.CacheStrategy; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.sso.Environment; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.DateUtil; import com.jinhe.tss.core.util.URLUtil; import com.jinhe.tss.core.util.XMLDocUtil; /** * <p> XMLCacheStrategyService.java </p> * * 以XML存放的缓存配置操作类 */ public class XMLCacheStrategyManager { private XMLCacheStrategyManager(){ } public static XMLCacheStrategyManager service = null; public static XMLCacheStrategyManager getInstance(){ if(service == null) service = new XMLCacheStrategyManager(); return service; } private static CacheManager poolManager = CacheManager.getInstance(); /** * 保存修改后的缓存策略。 * @param cacheStrategy */ @SuppressWarnings("unchecked") public void saveCacheStrategy(CacheStrategy cacheStrategy) { if(cacheStrategy == null) return; String code = cacheStrategy.getCode(); // 保存的时候将操作人的信息记录到remark字段中 cacheStrategy.setRemark(cacheStrategy.getRemark() + "\n上次修改时间" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + ", 修改人" + Environment.getOperatorName() + "。"); poolManager.getCachePool(code).setCacheStrategy(cacheStrategy); //覆盖策略文件 Document doc = XMLDocUtil.createDoc(CacheConstants.STRATEGY_PATH); List<Element> nodes = XMLDocUtil.selectNodes(doc, CacheConstants.STRATEGY_NODE_NAME); for(Iterator<Element> it = nodes.iterator(); it.hasNext();){ Element strategyNode = it.next(); if(!strategyNode.attributeValue("code").equals(code)) continue; for(Iterator iter = strategyNode.elementIterator(); iter.hasNext();){ Element attrNode = (Element)iter.next(); attrNode.setText(BeanUtil.getPropertyValue(cacheStrategy, attrNode.getName()).toString()); } } //同时将更改后的缓存策略保存回缓存策略文件和缓存策略备份文件,以防止保存过程中出现服务器死机等意味情况时,可确保其中一个文件正常。 String classpath = URLUtil.getClassesPath().getPath(); String backupFile = classpath + CacheConstants.STRATEGY_BACKUP_PATH; String sourceFile = classpath + CacheConstants.STRATEGY_PATH; try { File cacheFile = new File(classpath + "META-INF"); if( !cacheFile.exists() ) { cacheFile.mkdir(); } //pass: FileWriter和FileOutputStream区别:前者会改变文件编码格式,后者不会。 //另外可通过format.setEncoding("UTF-8")方式来设置XMLWriter的输出编码方式。 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileOutputStream(backupFile), format); writer.write( doc ); writer.close(); writer = new XMLWriter(new FileOutputStream(sourceFile), format); writer.write( doc ); writer.close(); } catch (IOException e) { throw new BusinessException("写入缓存策略文件时出错:", e); } } /** * 获取所有的缓存策略 * @return */ public List<CacheStrategy> getAllCacheStrategy() { Set<Entry<String, IPool>> pools = poolManager.listCachePools(); List<CacheStrategy> list = new ArrayList<CacheStrategy>(); for(Iterator<Entry<String, IPool>> it = pools.iterator(); it.hasNext();){ IPool pool = it.next().getValue(); CacheStrategy cacheStrategy = pool.getCacheStrategy(); if("1".equals(cacheStrategy.getVisible())) list.add(cacheStrategy); } return list; } /** * 获取单个缓存策略 * @param code * @return */ public CacheStrategy getCacheStrategy(String code) { return poolManager.getCachePool(code).getCacheStrategy(); } /** * 获取某个缓存策略的缓存池中的所有缓存项。 * 缓存项需要按点击数来排序。 * @param code * @return */ public List<Cacheable> listItemsByStrategy(String code) { return poolManager.getCachePool(code).listItems(); } /** * 刷新缓存项。 * 如果不能重新加载更新的缓存项,则返回null。 * @param code * 缓存项所在池的缓存策略code * @param key * 缓存项的key值 * @return */ public Cacheable refresh(String code, String key) { IPool pool = poolManager.getCachePool(code); Cacheable object = pool.getObject(key); if(object == null){ throw new BusinessException("缓存项不在缓存池中,可能已被清除!"); } return pool.reload(object); } /** * 清空缓存池 * @param code */ public void releaseCache(String code) { poolManager.getCachePool(code).flush(); } /** * 初始化缓存池 * @param code */ public void initPool(String code) { poolManager.getCachePool(code).init(); } /**获取一个缓存项值 * @param code * @param key * @return */ public Cacheable getCachedItem(String code, String key) { return poolManager.getCachePool(code).getObject(key); } }