package ddth.dasp.framework.cache.hazelcast;
import java.util.List;
import org.osgi.framework.BundleContext;
import ddth.dasp.common.hazelcastex.IHazelcastClientFactory;
import ddth.dasp.common.hazelcastex.PoolConfig;
import ddth.dasp.common.hazelcastex.impl.HazelcastClientFactory;
import ddth.dasp.common.utils.OsgiUtils;
import ddth.dasp.framework.cache.AbstractCacheManager;
import ddth.dasp.framework.cache.ICacheManager;
/**
* <a href="http://www.hazelcast.com/">Hazelcast</a> implementation of
* {@link ICacheManager}.
*
* @author NBThanh <btnguyen2k@gmail.com>
* @version 0.1.0
*/
public class HazelcastCacheManager extends AbstractCacheManager {
private boolean myOwnHazelcastClientFactory = false;
private IHazelcastClientFactory hazelcastClientFactory;
private List<String> hazelcastServers;
private String hazelcastUsername, hazelcastPassword;
private PoolConfig poolConfig;
public IHazelcastClientFactory getHazelcastClientFactory() {
if (hazelcastClientFactory != null) {
return hazelcastClientFactory;
}
/*
* If the Hazelcast client factory has not been set, try to get it from
* OSGi container.
*/
BundleContext bundleContext = getBundleContext();
if (bundleContext != null) {
IHazelcastClientFactory _hazelcastClientFactory = OsgiUtils.getService(bundleContext,
IHazelcastClientFactory.class);
if (_hazelcastClientFactory != null) {
return _hazelcastClientFactory;
}
}
/*
* Build an instance of Hazelcast client factory for my own.
*/
synchronized (this) {
// safeguard check
if (hazelcastClientFactory == null) {
HazelcastClientFactory hzcf = new HazelcastClientFactory();
hzcf.init();
hazelcastClientFactory = hzcf;
myOwnHazelcastClientFactory = true;
}
}
return hazelcastClientFactory;
}
public HazelcastCacheManager setHazelcastClientFactory(
IHazelcastClientFactory hazelcastClientFactory) {
this.hazelcastClientFactory = hazelcastClientFactory;
return this;
}
protected String getHazelcastUsername() {
return hazelcastUsername;
}
public HazelcastCacheManager setHazelcastUsername(String hazelcastUsername) {
this.hazelcastUsername = hazelcastUsername;
return this;
}
protected String getHazelcastPassword() {
return hazelcastPassword;
}
public HazelcastCacheManager setHazelcastPassword(String hazelcastPassword) {
this.hazelcastPassword = hazelcastPassword;
return this;
}
public List<String> getHazelcastServers() {
return hazelcastServers;
}
public HazelcastCacheManager setHazelcastServers(List<String> hazelcastServers) {
this.hazelcastServers = hazelcastServers;
return this;
}
protected PoolConfig getPoolConfig() {
return poolConfig;
}
public void setPoolConfig(PoolConfig poolConfig) {
this.poolConfig = poolConfig;
}
/**
* {@inheritDoc}
*/
@Override
public void destroy() {
try {
if (myOwnHazelcastClientFactory && hazelcastClientFactory != null) {
((HazelcastClientFactory) hazelcastClientFactory).destroy();
}
} finally {
super.destroy();
}
}
/**
* {@inheritDoc}
*/
@Override
protected HazelcastCache createCacheInternal(String name, long capacity, long expireAfterWrite,
long expireAfterAccess) {
HazelcastCache cache = new HazelcastCache(this, name);
cache.setCapacity(capacity > 0 ? capacity : getDefaultCacheCapacity());
cache.setExpireAfterAccess(expireAfterAccess);
cache.setExpireAfterWrite(expireAfterWrite);
cache.setHazelcastServer(hazelcastServers).setHazelcastUsername(hazelcastUsername)
.setHazelcastPassword(hazelcastPassword).setPoolConfig(poolConfig);
cache.init();
return cache;
}
}