package org.jboss.seam.cache; import java.io.InputStream; import org.jboss.seam.Component; import org.jboss.seam.ScopeType; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.ResourceLoader; /** * CacheProvider provides methods to control and manipulate the configured cache * * @author Sebastian Hennebrueder * @author Pete Muir */ public abstract class CacheProvider<T> { /** * the region name to be used if no region is specified */ public static final String DEFAULT_REGION = "org.jboss.seam.cache.DefaultRegion"; private String configuration; private String defaultRegion = DEFAULT_REGION; /** * @return - the cache the cache provider delegates to */ public abstract T getDelegate(); /** * Get the configuration file used by the cache * */ public String getConfiguration() { return this.configuration; } protected InputStream getConfigurationAsStream() { return ResourceLoader.instance().getResourceAsStream(getConfiguration()); } /** * Set the configuration file to be used by the cache */ public void setConfiguration(String cfgResourceName) { this.configuration = cfgResourceName; } /** * Fetches an object for the given key from the cache and returns it if * found. Only the default cache region will be searched. * * @param key - a key to identify the object. * @return - the object if found or null if not */ public Object get(String key) { return get(null, key); } /** * Fetches an object for the given key from the cache and returns it if * found. Only the default cache region will be searched. * * @param key - a key to identify the object. * @param type - the type of the object to return * @return - the object if found or null if not */ public <E> E get(String key, E type) { return (E) get(null, key); } /** * Fetches an object for the given key from the cache and returns it if * found. Only the specified cache region will be searched. * * @param region - the name of a cache region * @param key - a key to identify the object. * @return - the object if found or null if not */ public abstract Object get(String region, String key); /** * Fetches an object for the given key from the cache and returns it if * found. Only the specified cache region will be searched. * * @param region - the name of a cache region * @param key - a key to identify the object. * @param type - the type of object to return * * @return - the object if found or null if not */ public <E> E get(String region, String key, E type) { return (E) get(region, key); } /** * Put an object into the cache. The object is placed in the default cache * region under the given key. * * @param key - a key to identify the object * @param object - the object to be stored in the cache */ public void put(String key, Object object) { put(null, key, object); } /** * Puts an object into the cache. The object is placed in the specified cache * region under the given key. * * @param region - the name of a cache region * @param key - a key to identify the object * @param object - the object to be stored in the cache */ public abstract void put(String region, String key, Object object); /** * Removes an object from the cache. The object is removed from the default * cache region under the given key. * * @param key - a key to identify the object */ public void remove(String key) { remove(null, key); } /** * Removes an object from the cache. The object is removed from the specified * cache region under the given key. * * @param region - the name of a cache region * @param key - a key to identify the object */ public abstract void remove(String region, String key); /** * Removes all objects from all cache regions */ public abstract void clear(); public String getDefaultRegion() { return defaultRegion; } public void setDefaultRegion(String defaultRegion) { this.defaultRegion = defaultRegion; } public static CacheProvider instance() { if (!Contexts.isApplicationContextActive()) { throw new IllegalStateException("No active application scope"); } return (CacheProvider) Component.getInstance("org.jboss.seam.cache.cacheProvider", ScopeType.APPLICATION); } public static <T> CacheProvider<T> instance(Class<? extends T> type) { return instance(); } }