package org.jboss.seam.cache;
import static org.jboss.seam.ScopeType.APPLICATION;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.lang.reflect.Method;
import org.infinispan.Cache;
import org.infinispan.tree.Fqn;
import org.infinispan.tree.TreeCache;
import org.infinispan.tree.TreeCacheFactory;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.util.Reflections;
/**
* Implementation of CacheProvider backed by Infinispan 5.x. for simple objects.
*
* @author Marek Novotny
*/
@Name("org.jboss.seam.cache.cacheProvider")
@Scope(APPLICATION)
@BypassInterceptors
@Install(value = false, precedence = BUILT_IN, classDependencies = { "org.infinispan.tree.TreeCache", "org.jgroups.MembershipListener" })
@AutoCreate
@SuppressWarnings("rawtypes")
public class InfinispanCacheProvider extends AbstractInfinispanCacheProvider<TreeCache<Object, Object>>
{
private org.infinispan.tree.TreeCache cache;
private static final LogProvider log = Logging.getLogProvider(InfinispanCacheProvider.class);
private static Method GET;
private static Method PUT;
private static Method REMOVE;
private static Method REMOVE_NODE;
static
{
try
{
GET = TreeCache.class.getDeclaredMethod("get", Fqn.class, Object.class);
PUT = TreeCache.class.getDeclaredMethod("put", Fqn.class, Object.class, Object.class);
REMOVE = TreeCache.class.getDeclaredMethod("remove", Fqn.class, Object.class);
REMOVE_NODE = TreeCache.class.getDeclaredMethod("removeNode", Fqn.class);
}
catch (Exception e)
{
log.error(e);
throw new IllegalStateException("Unable to use Infinispan Cache", e);
}
}
@SuppressWarnings("unchecked")
@Create
public void create()
{
log.debug("Starting Infinispan Cache");
try
{
DefaultCacheManager manager = new DefaultCacheManager(getConfigurationAsStream());
Cache defaultCache = manager.getCache();
cache = new TreeCacheFactory().createTreeCache(defaultCache);
}
catch (Exception e)
{
throw new IllegalStateException("Error starting Infinispan Cache", e);
}
}
@Destroy
public void destroy()
{
log.debug("Stopping Infinispan Cache");
try
{
cache.stop();
cache = null;
}
catch (Exception e)
{
throw new IllegalStateException("Error stopping Infinispan Cache", e);
}
}
@Override
public Object get(String region, String key)
{
return Reflections.invokeAndWrap(GET, cache, getFqn(region), key);
}
@Override
public void put(String region, String key, Object object)
{
Reflections.invokeAndWrap(PUT, cache, getFqn(region), key, object);
}
@Override
public void remove(String region, String key)
{
Reflections.invokeAndWrap(REMOVE, cache, getFqn(region), key);
}
@Override
public void clear()
{
Reflections.invokeAndWrap(REMOVE_NODE, cache, getFqn(null));
}
@Override
public TreeCache getDelegate()
{
return cache;
}
}