/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.common.query.cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
public class EhcacheResultCache implements ResultCacheable{
private static final Logger logger = LoggerFactory.getLogger(EhcacheResultCache.class);
private static final String CACHE_NAME = "queryCache";
private static final int DEFAULT_MAX_RESULT = 10000;
private static final int DEFAULT_NEWS_RESULT= 500;
private CacheManager cacheManager;
private String cacheName = CACHE_NAME;
private GeneratorCacheKeyable generatorCacheKey = new DefaultGeneratorCacheKey();
private int maxResult = DEFAULT_MAX_RESULT;
private int newsResult = DEFAULT_NEWS_RESULT;
private Cache getCache(){
Cache cache = cacheManager.getCache(cacheName);
Assert.notNull(cache,"cache is null");
return cache;
}
@Override
public int getMaxResult() {
return maxResult;
}
@Override
public int getNewsResult() {
return newsResult;
}
@Override
public CacheResultable putResultInCache(CacheResultable result) {
Cache cache = getCache();
if(result.getCacheKey()== null || result.getCacheKey().isEmpty()){
String cacheKey = getCacheKey();
result = new CacheResult(cacheKey,(CacheResult)result);
}
if(result.isModified()){
Element element = new Element(result.getCacheKey(),result);
cache.put(element);
if(logger.isDebugEnabled()){
logger.debug("Ehcache memory store size is {}",cache.calculateInMemorySize());
}
}
return result;
}
private String getCacheKey(){
Cache cache = getCache();
String cacheKey;
do{
cacheKey = generatorCacheKey.generatorKey();
}while(cache.isKeyInCache(cacheKey));
return cacheKey;
}
@Override
public CacheResultable getResultFromCache(String key) {
Cache cache = getCache();
Element element = cache.get(key);
return element == null ? null : new CacheResult((CacheResult)element.getValue());
}
@Override
public void removeResultFromCache(String key) {
Cache cache = getCache();
cache.remove(key);
}
public void setCacheManager(CacheManager cacheManager){
this.cacheManager = cacheManager;
}
public void setCacheName(String cacheName){
this.cacheName = cacheName;
}
public void setGeneratorCacheKey(GeneratorCacheKeyable generatorCacheKey){
this.generatorCacheKey = generatorCacheKey;
}
public void setMaxResult(int maxResult) {
this.maxResult = maxResult;
}
public void setNewsResult(int newsResult) {
this.newsResult = newsResult;
}
}