package org.jboss.resteasy.plugins.cache.server;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfiguration;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.eviction.EvictionStrategy;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.jboss.resteasy.plugins.cache.server.i18n.Messages;
import org.jboss.resteasy.spi.ResteasyConfiguration;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import java.io.IOException;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class ServerCacheFeature implements Feature
{
protected ServerCache cache;
public ServerCacheFeature()
{
}
public ServerCacheFeature(ServerCache cache)
{
this.cache = cache;
}
@Override
public boolean configure(FeatureContext configurable)
{
ServerCache cache = getCache(configurable);
if (cache == null) return false;
configurable.register(new ServerCacheHitFilter(cache));
configurable.register(new ServerCacheInterceptor(cache));
return true;
}
protected ResteasyConfiguration getResteasyConfiguration()
{
return ResteasyProviderFactory.getContextData(ResteasyConfiguration.class);
}
protected String getConfigProperty(String name)
{
ResteasyConfiguration config = getResteasyConfiguration();
if (config == null) return null;
return config.getParameter(name);
}
protected ServerCache getCache(Configurable configurable)
{
if (this.cache != null) return this.cache;
ServerCache cache = (ServerCache)configurable.getConfiguration().getProperty(ServerCache.class.getName());
if (cache != null) return cache;
cache = getXmlCache(configurable);
if (cache != null) return cache;
return getDefaultCache();
}
protected ServerCache getDefaultCache()
{
GlobalConfiguration gconfig = new GlobalConfigurationBuilder()
.globalJmxStatistics()
.allowDuplicateDomains(true)
.enable()
.jmxDomain("custom-cache")
.build();
Configuration configuration = new ConfigurationBuilder()
.eviction()
.strategy(EvictionStrategy.LIRS)
.maxEntries(100)
.jmxStatistics().enable()
.build();
EmbeddedCacheManager manager = new DefaultCacheManager(gconfig, configuration);
Cache<Object, Object> c = manager.getCache("custom-cache");
return new InfinispanCache(c);
}
protected ServerCache getXmlCache(Configurable configurable)
{
String path = (String)configurable.getConfiguration().getProperty("server.request.cache.infinispan.config.file");
if (path == null) path = getConfigProperty("server.request.cache.infinispan.config.file");
if (path == null) return null;
String name = (String)configurable.getConfiguration().getProperty("server.request.cache.infinispan.cache.name");
if (name == null) name = getConfigProperty("server.request.cache.infinispan.cache.name");
if (name == null) throw new RuntimeException(Messages.MESSAGES.needToSpecifyCacheName());
try
{
Cache<Object, Object> c = new DefaultCacheManager(path).getCache(name);
return new InfinispanCache(c);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
}