package ddth.dasp.framework.bo;
import ddth.dasp.framework.cache.CacheEntry;
import ddth.dasp.framework.cache.ICache;
import ddth.dasp.framework.cache.ICacheManager;
/**
* Cache-enabled Business Object manager.
*
* @author NBThanh <btnguyen2k@gmail.com>
* @version 0.1.0
*/
public abstract class CacheBoManager extends BaseBoManager {
public final static long DEFAULT_CACHE_NULL_EXPIRY = 3600;
private ICacheManager cacheManager, cacheManagerForNull;
private String cacheName = CacheBoManager.class.getName(),
cacheNameForNull = CacheBoManager.class.getName() + "_null";
private ICache cache, cacheForNull;
private long cacheCapcity = 0, cacheCapcityForNull = 0, expireAfterWrite = -1,
expireAfterAccess = -1;
private boolean cacheNull = false;
private long cacheNullExpiry = DEFAULT_CACHE_NULL_EXPIRY;
public void init() {
super.init();
cache = getCache();
cacheForNull = getCacheForNull();
}
public ICacheManager getCacheManager() {
return cacheManager;
}
public void setCacheManager(ICacheManager cacheManager) {
this.cacheManager = cacheManager;
}
public ICacheManager getCacheManagerForNull() {
return cacheManagerForNull;
}
public void setCacheManagerForNull(ICacheManager cacheManagerForNull) {
this.cacheManagerForNull = cacheManagerForNull;
}
public String getCacheName() {
return cacheName;
}
public void setCacheName(String cacheName) {
this.cacheName = cacheName;
}
public String getCacheNameForNull() {
return cacheNameForNull;
}
public void setCacheNameForNull(String cacheNameForNull) {
this.cacheNameForNull = cacheNameForNull;
}
public boolean isCacheNull() {
return cacheNull;
}
public void setCacheNull(boolean cacheNull) {
this.cacheNull = cacheNull;
}
protected boolean cacheEnabled() {
return cacheManager != null;
}
public ICache getCache() {
if (cache == null && cacheManager != null) {
// if (cacheCapcity <= 0) {
// cacheCapcity = Integer.MAX_VALUE;
// }
cache = cacheManager.createCache(cacheName, cacheCapcity, expireAfterWrite,
expireAfterAccess);
}
return cache;
}
public ICache getCacheForNull() {
if (cacheForNull == null && cacheEnabled() && cacheNull) {
if (cacheCapcityForNull <= 0) {
cacheCapcityForNull = Integer.MAX_VALUE;
}
if (cacheManagerForNull == null) {
cacheManagerForNull = cacheManager;
}
cacheForNull = cacheManagerForNull.createCache(cacheNameForNull, cacheCapcityForNull,
cacheNullExpiry, -1);
}
return cacheForNull;
}
/**
* Deletes all cache entries.
*/
protected void flushCache() {
if (!cacheEnabled()) {
return;
}
ICache cache = getCache();
if (cache != null) {
cache.deleteAll();
}
ICache cacheForNull = getCacheForNull();
if (cacheForNull != null && cacheForNull != cache) {
cacheForNull.deleteAll();
}
}
/**
* Deletes an entry from cache.
*
* @param key
*/
protected void deleteFromCache(String key) {
if (!cacheEnabled()) {
return;
}
ICache cache = getCache();
if (cache != null) {
cache.delete(key);
}
ICache cacheForNull = getCacheForNull();
if (cacheForNull != null && cacheForNull != cache) {
cacheForNull.delete(key);
}
}
/**
* Puts an entry to cache, with default expiries.
*
* @param key
* @param value
*/
protected void putToCache(String key, Object value) {
if (value instanceof CacheEntry) {
CacheEntry ce = (CacheEntry) value;
putToCache(key, ce, ce.getExpireAfterWrite(), ce.getExpireAfterAccess());
} else {
putToCache(key, value, expireAfterWrite, expireAfterAccess);
}
}
/**
* Puts an entry to cache, with specified expiries.
*
* @param key
* @param value
* @param expireAfterWrite
* @param expireAfterAccess
*/
protected void putToCache(String key, Object value, long expireAfterWrite,
long expireAfterAccess) {
if (!cacheEnabled()) {
return;
}
if (value != null) {
ICache cache = getCache();
if (cache != null) {
cache.set(key, value, expireAfterWrite, expireAfterAccess);
}
} else if (cacheNull) {
ICache cacheForNull = getCacheForNull();
if (cacheForNull != null) {
long ttl = cacheNullExpiry > 0 ? cacheNullExpiry
: (expireAfterWrite > 0 ? expireAfterWrite : -1);
cacheForNull.set(key, ICache.NULL_VALUE, ttl, -1);
}
}
}
/**
* Gets an entry from cache.
*
* @param key
* @return
*/
protected Object getFromCache(String key) {
if (!cacheEnabled()) {
return null;
}
ICache cache = getCache();
Object value = cache.get(key);
if (value == null && cacheNull) {
ICache cacheForNull = getCacheForNull();
value = (cacheForNull != null && cacheForNull != cache) ? cacheForNull.get(key) : null;
}
if (value instanceof CacheEntry && ((CacheEntry) value).isExpired()) {
return null;
}
return value;
}
}