package cn.dreampie.cache.ehcache; import cn.dreampie.cache.CacheEvent; import cn.dreampie.cache.CacheProvider; import cn.dreampie.log.Logger; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; import net.sf.ehcache.config.Configuration; import java.io.InputStream; import java.net.URL; /** * EHCacheProvider */ public class EHCacheProvider extends CacheProvider { private static final Logger logger = Logger.getLogger(EHCacheProvider.class); private final net.sf.ehcache.CacheManager cacheManager; public EHCacheProvider() { cacheManager = net.sf.ehcache.CacheManager.create(); } public EHCacheProvider(net.sf.ehcache.CacheManager cacheManager) { this.cacheManager = cacheManager; } public EHCacheProvider(String configurationFileName) { this(EHCacheProvider.class.getResourceAsStream(configurationFileName)); } public EHCacheProvider(URL configurationFileURL) { this.cacheManager = net.sf.ehcache.CacheManager.create(configurationFileURL); } public EHCacheProvider(InputStream inputStream) { this.cacheManager = net.sf.ehcache.CacheManager.create(inputStream); } public EHCacheProvider(Configuration configuration) { this.cacheManager = net.sf.ehcache.CacheManager.create(configuration); } public <T> T getCache(String group, String key) { try { createIfMissing(group); Cache c = cacheManager.getCache(group); return (T) (c.get(key) == null ? null : c.get(key).getObjectValue()); } catch (Exception e) { logger.warn("%s", e, e); return null; } } private void createIfMissing(String group) { //double-checked synchronization is broken in Java, but this should work just fine. if (cacheManager.getCache(group) == null) { try { cacheManager.addCache(group); } catch (Exception ignore) { logger.warn(ignore.getMessage()); } } } public void addCache(String group, String key, Object cache, int expired) { createIfMissing(group); Element element; if (expired != -1) { element = new Element(key, cache, false, expired, expired); } else { element = new Element(key, cache); } cacheManager.getCache(group).put(element); } public void removeCache(String group, String key) { if (cacheManager.getCache(group) != null) { cacheManager.getCache(group).remove(key); } } public void doFlush(CacheEvent event) { if (event.getType().equals(CacheEvent.CacheEventType.ALL)) { cacheManager.removalAll(); } else if (event.getType().equals(CacheEvent.CacheEventType.GROUP)) { cacheManager.removeCache(event.getGroup()); } } }