package org.jboss.seam.cache;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import static org.jboss.seam.ScopeType.APPLICATION;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
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;
/**
* Implementation of CacheProvider backed by EhCache. The default cache region
* issues <i>org.jboss.seam.cache.DefaultCache</> as the default cache region.
*
* @author Sebastian Hennebrueder
* @author Pete Muir
*/
@Name("org.jboss.seam.cache.cacheProvider")
@Scope(APPLICATION)
@BypassInterceptors
@Install(value = false, precedence = BUILT_IN, classDependencies="net.sf.ehcache.Cache")
@AutoCreate
public class EhCacheProvider extends CacheProvider<CacheManager>
{
private CacheManager cacheManager;
private static final LogProvider log = Logging.getLogProvider(EhCacheProvider.class);
@Override
public CacheManager getDelegate()
{
return cacheManager;
}
@Override
public void put(String region, String key, Object object)
{
Cache cache = getCacheRegion(region);
Element element = new Element(key, object);
cache.put(element);
}
@Override
public void clear()
{
String[] strings = cacheManager.getCacheNames();
for (String cacheName : strings)
{
Cache cache = getCacheRegion(cacheName);
cache.removeAll();
}
}
@Override
public Object get(String region, String key)
{
Cache cache = getCacheRegion(region);
Element element = cache.get(key);
if (element != null)
{
return element.getObjectValue();
}
else
{
return null;
}
}
private net.sf.ehcache.Cache getCacheRegion(String regionName)
{
if (regionName == null)
{
regionName = getDefaultRegion();
}
Cache result = cacheManager.getCache(regionName);
if (result == null)
{
log.debug("Could not find configuration for region [" + regionName + "]; using defaults.");
cacheManager.addCache(regionName);
result = cacheManager.getCache(regionName);
log.debug("EHCache region created: " + regionName);
}
return result;
}
@Override
public void remove(String region, String key)
{
Cache cache = getCacheRegion(region);
cache.remove(key);
}
@Create
public void create()
{
log.debug("Starting EhCacheProvider cache");
try
{
if (getConfiguration() != null)
{
cacheManager = new CacheManager(getConfigurationAsStream());
}
else
{
cacheManager = new CacheManager();
}
}
catch (net.sf.ehcache.CacheException e)
{
throw new IllegalStateException("Error starting EHCache Cache", e);
}
}
@Destroy
public void destroy()
{
log.debug("Stopping EhCacheProvider cache");
try
{
cacheManager.shutdown();
cacheManager = null;
}
catch (RuntimeException e)
{
throw new IllegalStateException("Error stopping EHCache Cache", e);
}
}
}