package ddth.dasp.framework.cache.hazelcast;
import java.util.List;
import ddth.dasp.common.hazelcastex.IHazelcastClient;
import ddth.dasp.common.hazelcastex.IHazelcastClientFactory;
import ddth.dasp.common.hazelcastex.PoolConfig;
import ddth.dasp.framework.cache.AbstractCache;
import ddth.dasp.framework.cache.CacheEntry;
import ddth.dasp.framework.cache.ICache;
/**
* <a href="http://www.hazelcast.com/">Hazelcast</a> implementation of
* {@link ICache}.
*
* @author NBThanh <btnguyen2k@gmail.com>
* @version 0.1.0
*/
public class HazelcastCache extends AbstractCache implements ICache {
private HazelcastCacheManager hazelcastCacheManager;
private List<String> hazelcastServers;
private String hazelcastUsername, hazelcastPassword;
private PoolConfig poolConfig;
private long timeToLiveSeconds = -1;
public HazelcastCache(HazelcastCacheManager hazelcastCacheManager) {
this.hazelcastCacheManager = hazelcastCacheManager;
}
public HazelcastCache(HazelcastCacheManager hazelcastCacheManager, String name) {
super(name);
this.hazelcastCacheManager = hazelcastCacheManager;
}
public HazelcastCache(HazelcastCacheManager hazelcastCacheManager, String name, long capacity) {
super(name, capacity);
this.hazelcastCacheManager = hazelcastCacheManager;
}
public HazelcastCache(HazelcastCacheManager hazelcastCacheManager, String name, long capacity,
long expireAfterWrite, long expireAfterAccess) {
super(name, capacity, expireAfterWrite, expireAfterAccess);
this.hazelcastCacheManager = hazelcastCacheManager;
}
protected IHazelcastClientFactory getHazelcastClientFactory() {
return hazelcastCacheManager.getHazelcastClientFactory();
}
protected List<String> getHazelcastServers() {
return hazelcastServers;
}
public HazelcastCache setHazelcastServer(List<String> hazelcastServers) {
this.hazelcastServers = hazelcastServers;
return this;
}
protected String getHazelcastUsername() {
return hazelcastUsername;
}
public HazelcastCache setHazelcastUsername(String hazelcastUsername) {
this.hazelcastUsername = hazelcastUsername;
return this;
}
protected String getHazelcastPassword() {
return hazelcastPassword;
}
public HazelcastCache setHazelcastPassword(String hazelcastPassword) {
this.hazelcastPassword = hazelcastPassword;
return this;
}
protected PoolConfig getPoolConfig() {
return poolConfig;
}
public HazelcastCache setPoolConfig(PoolConfig poolConfig) {
this.poolConfig = poolConfig;
return this;
}
/**
* {@inheritDoc}
*/
@Override
public void init() {
super.init();
long expireAfterWrite = getExpireAfterWrite();
long expireAfterAccess = getExpireAfterAccess();
if (expireAfterAccess > 0 || expireAfterWrite > 0) {
timeToLiveSeconds = expireAfterAccess > 0 ? expireAfterAccess : expireAfterWrite;
} else {
timeToLiveSeconds = -1;
}
}
/**
* {@inheritDoc}
*/
@Override
public void destroy() {
// EMPTY
}
private IHazelcastClient getHazelcastClient() {
IHazelcastClientFactory hazelcastClientFactory = getHazelcastClientFactory();
return hazelcastClientFactory != null ? hazelcastClientFactory.getHazelcastClient(
hazelcastServers, hazelcastUsername, hazelcastPassword, poolConfig) : null;
}
private void returnHazelcastClient(IHazelcastClient hazelcastClient) {
if (hazelcastClient != null) {
getHazelcastClientFactory().returnHazelcastClient(hazelcastClient);
}
}
/**
* {@inheritDoc}
*/
@Override
public long getSize() {
IHazelcastClient hazelcastClient = getHazelcastClient();
try {
return hazelcastClient != null ? hazelcastClient.mapSize(getName()) : -1;
} finally {
returnHazelcastClient(hazelcastClient);
}
}
/**
* {@inheritDoc}
*/
@Override
public void set(String key, Object entry) {
if (entry instanceof CacheEntry) {
CacheEntry ce = (CacheEntry) entry;
set(key, ce, ce.getExpireAfterWrite(), ce.getExpireAfterAccess());
} else {
set(key, entry, timeToLiveSeconds, timeToLiveSeconds);
}
}
/**
* {@inheritDoc}
*/
public void set(String key, Object entry, long expireAfterWrite, long expireAfterAccess) {
IHazelcastClient hazelcastClient = getHazelcastClient();
if (hazelcastClient != null) {
long ttl = expireAfterAccess > 0 ? expireAfterAccess
: (expireAfterWrite > 0 ? expireAfterWrite : timeToLiveSeconds);
try {
hazelcastClient.mapSet(getName(), key, entry, (int) ttl);
} finally {
returnHazelcastClient(hazelcastClient);
}
}
}
/**
* {@inheritDoc}
*/
@Override
protected Object internalGet(String key) {
IHazelcastClient hazelcastClient = getHazelcastClient();
try {
return hazelcastClient != null ? hazelcastClient.mapGet(getName(), key) : null;
} finally {
returnHazelcastClient(hazelcastClient);
}
}
/**
* {@inheritDoc}
*/
@Override
public void delete(String key) {
IHazelcastClient hazelcastClient = getHazelcastClient();
if (hazelcastClient != null) {
try {
hazelcastClient.mapDelete(getName(), key);
} finally {
returnHazelcastClient(hazelcastClient);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void deleteAll() {
IHazelcastClient hazelcastClient = getHazelcastClient();
if (hazelcastClient != null) {
try {
hazelcastClient.mapDeleteAll(getName());
} finally {
returnHazelcastClient(hazelcastClient);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean exists(String key) {
IHazelcastClient hazelcastClient = getHazelcastClient();
try {
return hazelcastClient != null ? hazelcastClient.mapGet(getName(), key) != null : false;
} finally {
returnHazelcastClient(hazelcastClient);
}
}
}