package ddth.dasp.framework.cache.guava;
import java.util.concurrent.TimeUnit;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import ddth.dasp.framework.cache.AbstractCache;
import ddth.dasp.framework.cache.CacheEntry;
import ddth.dasp.framework.cache.ICache;
import ddth.dasp.framework.cache.ICacheManager;
/**
* <a href="http://code.google.com/p/guava-libraries/">Guava</a> implementation
* of {@link ICache}.
*
* @author NBThanh <btnguyen2k@gmail.com>
* @version 0.1.0
*/
public class GuavaCache extends AbstractCache implements ICache {
private Cache<String, Object> cache;
public GuavaCache() {
}
public GuavaCache(String name) {
super(name);
}
public GuavaCache(String name, long capacity) {
super(name, capacity);
}
public GuavaCache(String name, long capacity, long expireAfterWrite, long expireAfterAccess) {
super(name, capacity, expireAfterWrite, expireAfterAccess);
}
/**
* {@inheritDoc}
*/
@Override
public void init() {
super.init();
int numProcessores = Runtime.getRuntime().availableProcessors();
CacheBuilder<Object, Object> cacheBuider = CacheBuilder.newBuilder();
cacheBuider.concurrencyLevel(numProcessores);
long capacity = getCapacity();
capacity = capacity > 0 ? capacity : ICacheManager.DEFAULT_CACHE_CAPACITY;
setCapacity(capacity);
long expireAfterAccess = getExpireAfterAccess();
long expireAfterWrite = getExpireAfterWrite();
cacheBuider.maximumSize(capacity);
if (expireAfterAccess > 0) {
cacheBuider.expireAfterAccess(expireAfterAccess, TimeUnit.SECONDS);
} else if (expireAfterWrite > 0) {
cacheBuider.expireAfterWrite(expireAfterWrite, TimeUnit.SECONDS);
} else {
cacheBuider.expireAfterAccess(ICacheManager.DEFAULT_EXPIRE_AFTER_ACCESS,
TimeUnit.SECONDS);
setExpireAfterAccess(ICacheManager.DEFAULT_EXPIRE_AFTER_ACCESS);
}
cache = cacheBuider.build();
}
/**
* {@inheritDoc}
*/
@Override
public void destroy() {
try {
cache.cleanUp();
cache = null;
} finally {
super.destroy();
}
}
/**
* {@inheritDoc}
*/
@Override
public long getSize() {
return cache.size();
}
/**
* {@inheritDoc}
*/
@Override
public void set(String key, Object entry) {
cache.put(key, entry);
}
/**
* {@inheritDoc}
*/
@Override
public void set(String key, Object entry, long expireAfterWrite, long expireAfterAccess) {
if (!(entry instanceof CacheEntry)) {
CacheEntry ce = new CacheEntry(key, entry, expireAfterWrite, expireAfterAccess);
entry = ce;
}
cache.put(key, entry);
}
/**
* {@inheritDoc}
*/
@Override
protected Object internalGet(String key) {
return cache.getIfPresent(key);
}
/**
* {@inheritDoc}
*/
@Override
public void delete(String key) {
cache.invalidate(key);
}
/**
* {@inheritDoc}
*/
@Override
public void deleteAll() {
cache.invalidateAll();
}
/**
* {@inheritDoc}
*/
@Override
public boolean exists(String key) {
return cache.getIfPresent(key) != null;
}
}