package io.loli.kaze.cache; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.TimeUnit; import javax.cache.Cache; import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.configuration.Configuration; import javax.cache.configuration.MutableConfiguration; import javax.cache.expiry.AccessedExpiryPolicy; import javax.cache.expiry.Duration; import javax.cache.spi.CachingProvider; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; public class KazeCacheFactory { private static final Logger logger = Logger .getLogger(KazeCacheFactory.class); private static Map<String, Cache<String, KazeCacheData>> cacheMap = new HashMap<>(); public static Cache<String, KazeCacheData> getCache(String name) { if (cacheMap.get(name) == null) { Cache<String, KazeCacheData> cache = createCache(name); cacheMap.put(name, cache); } return cacheMap.get(name); } private static Cache<String, KazeCacheData> createCache(String name) { Properties prop = new Properties(); try { prop.load(CacheFilter.class .getResourceAsStream("/cache.properties")); } catch (IOException e) { logger.warn("Failed to load cache.properties, use blank prop instead"); } String str = prop.getProperty("jcs.expirein"); Integer expirein = 0; if (StringUtils.isBlank(str)) { try { expirein = Integer.parseInt(str); } catch (Exception e) { } } Configuration<String, KazeCacheData> config = null; if (expirein != 0) { config = new MutableConfiguration<String, KazeCacheData>() .setTypes(String.class, KazeCacheData.class) .setExpiryPolicyFactory( AccessedExpiryPolicy.factoryOf(new Duration( TimeUnit.SECONDS, expirein))); } else { config = new MutableConfiguration<String, KazeCacheData>() .setTypes(String.class, KazeCacheData.class); } CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager cacheManager = cachingProvider.getCacheManager( cachingProvider.getDefaultURI(), cachingProvider.getDefaultClassLoader(), prop); Cache<String, KazeCacheData> cache = cacheManager.createCache(name, config); return cache; } }