package org.radargun.service;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Status;
import org.radargun.Service;
import org.radargun.config.Property;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.traits.Clustered;
import org.radargun.traits.Lifecycle;
import org.radargun.traits.ProvidesTrait;
/**
* An implementation of SerializableCacheWrapper that uses EHCache as an underlying implementation.
*
* Pass in a -Dbind.address=IP_ADDRESS ehcache propery files allows referencing system properties through syntax
* ${bind.address}.
*
* @author Manik Surtani <msurtani@gmail.com>
*/
@Service(doc = "EHCache")
public class EHCacheService implements Lifecycle, Clustered {
private static final Log log = LogFactory.getLog(EHCacheService.class);
protected static final String RMI_SCHEME = "RMI";
protected CacheManager manager;
//private Ehcache cache;
@Property(name = "file", doc = "Configuration file.", deprecatedName = "config")
private String configFile;
@Property(name = "cache", doc = "Name of the default cache. Default is 'testCache'.")
protected String cacheName = "testCache";
@ProvidesTrait
public EHCacheService getSelf() {
return this;
}
@ProvidesTrait
public EHCacheOperations createOperations() {
return new EHCacheOperations(this);
}
@ProvidesTrait
public EHCacheInfo createInfo() {
return new EHCacheInfo(this);
}
@Override
public synchronized void start() {
if (log.isTraceEnabled()) log.trace("Entering EHCacheService.setUp()");
log.debug("Initializing the cache with " + configFile);
URL url = getClass().getClassLoader().getResource(configFile);
manager = new CacheManager(url);
log.info("Caches available:");
for (String s : manager.getCacheNames()) log.info(" * " + s);
log.info("Bounded peers: " + manager.getCachePeerListener(RMI_SCHEME).getBoundCachePeers());
log.info("Remote peers: " + manager.getCacheManagerPeerProvider(RMI_SCHEME).listRemoteCachePeers(getCache(null)));
log.debug("Finish Initializing the cache");
}
@Override
public synchronized void stop() {
manager.shutdown();
}
@Override
public synchronized boolean isRunning() {
return manager.getStatus() == Status.STATUS_ALIVE;
}
public Ehcache getCache(String cacheName) {
return manager.getCache(cacheName);
}
@Override
public boolean isCoordinator() {
return false;
}
@Override
public Collection<Member> getMembers() {
ArrayList<Member> members = new ArrayList<>();
for (Object peer : manager.getCacheManagerPeerProvider("RMI").listRemoteCachePeers(getCache(null))) {
members.add(new Member(peer.toString(), false, false));
}
members.add(new Member("localhost", true, false));
return members;
}
@Override
public List<Membership> getMembershipHistory() {
return Collections.EMPTY_LIST; //TODO
}
}