Author: bstansberry(a)jboss.com
Date: 2007-12-23 09:55:36 -0500 (Sun, 23 Dec 2007)
New Revision: 14262
Removed:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactory.java
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactoryImpl.java
Modified:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JndiMultiplexingCacheInstanceManager.java
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/MultiplexingCacheInstanceManager.java
Log:
Convert from JBossCacheFactory prototype to the real JBC CacheManager
Deleted:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactory.java
===================================================================
---
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactory.java 2007-12-23
14:53:06 UTC (rev 14261)
+++
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactory.java 2007-12-23
14:55:36 UTC (rev 14262)
@@ -1,81 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.cache.jbc2.builder;
-
-import java.util.Set;
-
-import org.jboss.cache.Cache;
-
-/**
- * Factory and registry for JBoss Cache instances configured using
- * named configurations.
- *
- * @author <a href="brian.stansberry(a)jboss.com">Brian
Stansberry</a>
- * @version $Revision: 1 $
- */
-public interface JBossCacheFactory {
-
- /**
- * Gets all the names of all the configurations of which this object
- * is aware.
- *
- * @return
- */
- Set getConfigurationNames();
-
- /**
- * Get a cache configured according to the given configuration name.
- * <p>
- * The caller is free to invoke the {@link Cache#create()} and
- * {@link Cache#start()} lifecycle methods on the returned cache, but
- * the @link Cache#stop()} and {@link Cache#destroy()} methods should not
- * be invoked, since it is quite possible other session factories are
- * still using the cache. Use {@link #releaseCache(String)} to notify this
- * factory that the caller is no longer using a cache; let the factory
- * control stopping and destroying the underlying cache.
- * </p>
- *
- * @param configName the name of the configuration
- * @param create should the cache be instantiated if it
- * hasn't already been?
- * @return the cache, or <code>null</code> if
- * <code>create</code> is false and the cache
hasn't
- * been created previously.
- *
- * @throws IllegalArgumentException if this object is unaware of
- * <code>configName</code>
- * @throws Exception if there is a problem instantiating the cache
- */
- Cache getCache(String configName, boolean create) throws Exception;
-
- /**
- * Notifies the factory that the caller is no longer using the given
- * cache. The factory may perform cleanup operations, such as
- * stopping and destroying the cache.
- *
- * @param configName
- */
- void releaseCache(String configName);
-
-}
\ No newline at end of file
Deleted:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactoryImpl.java
===================================================================
---
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactoryImpl.java 2007-12-23
14:53:06 UTC (rev 14261)
+++
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JBossCacheFactoryImpl.java 2007-12-23
14:55:36 UTC (rev 14262)
@@ -1,368 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.cache.jbc2.builder;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.hibernate.cache.CacheException;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheStatus;
-import org.jboss.cache.DefaultCacheFactory;
-import org.jboss.cache.config.Configuration;
-import org.jboss.cache.config.ConfigurationException;
-import org.jboss.cache.xml.XmlHelper;
-import org.jgroups.ChannelFactory;
-import org.jgroups.JChannelFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.ls.DOMImplementationLS;
-import org.w3c.dom.ls.LSOutput;
-import org.w3c.dom.ls.LSSerializer;
-
-/**
- * A JBossCacheConfigurationFactory. This is a basic prototype of a
- * JBCACHE-1156 solution; only in Hibernate code base for a very short
- * period.
- *
- * @author <a href="brian.stansberry(a)jboss.com">Brian
Stansberry</a>
- * @version $Revision: 1 $
- */
-public class JBossCacheFactoryImpl implements JBossCacheFactory {
-
- private static final Logger log =
LoggerFactory.getLogger(JBossCacheFactoryImpl.class);
-
- private static final String DOCUMENT_ROOT = "cache-configs";
- private static final String CONFIG_ROOT = "cache-config";
- private static final String CONFIG_NAME = "name";
-
- private static JBossCacheFactoryImpl sharedFactory;
- private static String sharedChannelFactoryCfg;
-
- private XmlConfigurationParser parser;
- private String configResource;
- private Map configs = new HashMap();
- private Map caches = new HashMap();
- private Map checkouts = new HashMap();
- private ChannelFactory channelFactory;
- private boolean started;
-
- public JBossCacheFactoryImpl(String configResource, ChannelFactory factory) {
-
- parser = new XmlConfigurationParser();
- this.configResource = configResource;
- this.channelFactory = factory;
- }
-
- public static synchronized JBossCacheFactory getSharedInstance(String
cacheConfigResource, String channelFactoryConfigResource) {
-
- if (sharedFactory == null) {
- ChannelFactory cf = new JChannelFactory();
- try {
- cf.setMultiplexerConfig(channelFactoryConfigResource);
- }
- catch (Exception e) {
- throw new CacheException("Problem setting ChannelFactory
config", e);
- }
- sharedFactory = new JBossCacheFactoryImpl(cacheConfigResource, cf);
- sharedChannelFactoryCfg = channelFactoryConfigResource;
- }
- else {
- // Validate that the provided resources match the existing singleton
- if (!sharedFactory.getConfigResource().equals(cacheConfigResource)) {
- throw new CacheException("Provided cacheConfigResource does "
+
- "not match the existing shared factory: provided = " +
- cacheConfigResource + "; existing = " +
sharedFactory.getConfigResource());
- }
- else if (!sharedChannelFactoryCfg.equals(channelFactoryConfigResource)) {
- throw new IllegalStateException("Provided
channelFactoryConfigResource does " +
- "not match the existing shared factory: provided = " +
- channelFactoryConfigResource + "; existing = " +
sharedChannelFactoryCfg);
-
- }
- }
-
- return sharedFactory;
- }
-
- public void start() {
- if (!started) {
- this.configs = parser.parseConfigs(configResource);
- started = true;
- }
- }
-
- public void stop() {
- if (started) {
- synchronized (caches) {
- for (Iterator it = caches.entrySet().iterator(); it.hasNext(); ) {
- Map.Entry entry = (Entry) it.next();
- destroyCache((Cache) entry.getValue());
- it.remove();
- }
- caches.clear();
- checkouts.clear();
- configs.clear();
- }
- started = false;
- }
- }
-
- public String getConfigResource() {
- return configResource;
- }
-
- public ChannelFactory getChannelFactory() {
- return channelFactory;
- }
-
- public Set getConfigurationNames()
- {
- return new HashSet(configs.keySet());
- }
-
- public Cache getCache(String configName, boolean create) throws Exception
- {
- Cache cache = null;
- synchronized (caches) {
- cache = (Cache) caches.get(configName);
- if (cache == null && create) {
- Configuration config = getConfiguration(configName);
- cache = DefaultCacheFactory.getInstance().createCache(config, false);
- registerCache(cache, configName);
- }
- else if (cache != null) {
- incrementCheckout(configName);
- }
- }
-
- return cache;
- }
-
- private int incrementCheckout(String configName) {
- synchronized (checkouts) {
- Integer count = (Integer) checkouts.get(configName);
- if (count == null)
- count = new Integer(0);
- Integer newVal = new Integer(count.intValue() + 1);
- checkouts.put(configName, newVal);
- return newVal.intValue();
- }
- }
-
- private int decrementCheckout(String configName) {
- synchronized (checkouts) {
- Integer count = (Integer) checkouts.get(configName);
- if (count == null || count.intValue() < 1)
- throw new IllegalStateException("invalid count of " + count +
" for " + configName);
-
- Integer newVal = new Integer(count.intValue() - 1);
- checkouts.put(configName, newVal);
- return newVal.intValue();
- }
- }
-
- public void registerCache(Cache cache, String configName) {
- synchronized (caches) {
- if (caches.containsKey(configName))
- throw new IllegalStateException(configName + " already
registered");
- caches.put(configName, cache);
- incrementCheckout(configName);
- }
- }
-
- public void releaseCache(String configName) {
-
- synchronized (caches) {
- if (!caches.containsKey(configName))
- throw new IllegalStateException(configName + " not
registered");
- if (decrementCheckout(configName) == 0) {
- Cache cache = (Cache) caches.remove(configName);
- destroyCache(cache);
- }
- }
- }
-
- private void destroyCache(Cache cache) {
- if (cache.getCacheStatus() == CacheStatus.STARTED) {
- cache.stop();
- }
- if (cache.getCacheStatus() != CacheStatus.DESTROYED
- && cache.getCacheStatus() != CacheStatus.INSTANTIATED) {
- cache.destroy();
- }
- }
-
- public Configuration getConfiguration(String configName) throws Exception {
- Element element = (Element) configs.get(configName);
- if (element == null)
- throw new IllegalArgumentException("unknown config " +
configName);
- Configuration config = parser.parseConfig(element);
- if (channelFactory != null && config.getMultiplexerStack() != null) {
- config.getRuntimeConfig().setMuxChannelFactory(channelFactory);
- }
- return config;
- }
-
- class XmlConfigurationParser extends org.jboss.cache.factories.XmlConfigurationParser
{
-
- public Map parseConfigs(String configs) {
- InputStream is = getAsInputStreamFromClassLoader(configs);
- if (is == null)
- {
- if (log.isDebugEnabled())
- log.debug("Unable to find configuration file " + configs +
" in classpath; searching for this file on the filesystem instead.");
- try
- {
- is = new FileInputStream(configs);
- }
- catch (FileNotFoundException e)
- {
- throw new ConfigurationException("Unable to find config file
" + configs + " either in classpath or on the filesystem!", e);
- }
- }
-
- return parseConfigs(is);
- }
-
- public Map parseConfigs(InputStream stream) {
-
- // loop through all elements in XML.
- Element root = XmlHelper.getDocumentRoot(stream);
- NodeList list = root.getElementsByTagName(CONFIG_ROOT);
- if (list == null || list.getLength() == 0)
- throw new ConfigurationException("Can't find " +
CONFIG_ROOT + " tag");
-
- Map result = new HashMap();
-
- for (int i = 0; i < list.getLength(); i++)
- {
- org.w3c.dom.Node node = list.item(i);
- if (node.getNodeType() != org.w3c.dom.Node.ELEMENT_NODE)
- {
- continue;
- }
-
- Element element = (Element) node;
- String name = element.getAttribute(CONFIG_NAME);
- if (name == null || name.trim().length() == 0)
- throw new ConfigurationException("Element " + element +
" has no name attribute");
-
- result.put(name.trim(), element);
- }
-
- return result;
- }
-
- public Configuration parseConfig(Element config) throws Exception {
-
- DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
- Document doc = builder.newDocument();
- Element root = doc.createElement(DOCUMENT_ROOT);
- doc.appendChild(root);
- Node imported = doc.importNode(config, true);
- root.appendChild(imported);
-
- DOMImplementation domImpl = doc.getImplementation();
-
- DOMImplementationLS impl =
- (DOMImplementationLS)domImpl.getFeature("LS",
"3.0");
-
- LSSerializer writer = impl.createLSSerializer();
- LSOutput output = impl.createLSOutput();
- output.setEncoding("UTF-8");
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- output.setByteStream(baos);
- writer.write(doc, output);
-
- ByteArrayInputStream is = new ByteArrayInputStream(baos.toByteArray());
- return parseStream(is);
- }
-
-
- @Override
- protected Element getMBeanElement(Element root)
- {
- // This is following JBoss convention.
- NodeList list = root.getElementsByTagName(CONFIG_ROOT);
- if (list == null) throw new ConfigurationException("Can't find "
+ CONFIG_ROOT + " tag");
-
- if (list.getLength() > 1) throw new ConfigurationException("Has
multiple " + CONFIG_ROOT + " tag");
-
- Node node = list.item(0);
- Element element = null;
- if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE)
- {
- element = (Element) node;
- }
- else
- {
- throw new ConfigurationException("Can't find " + CONFIG_ROOT
+ " element");
- }
- return element;
- }
-
-
- }
-
- public static void main(String[] args)
- {
- try
- {
- JChannelFactory cf = new JChannelFactory();
- cf.setMultiplexerConfig("stacks.xml");
- JBossCacheFactoryImpl factory = new
JBossCacheFactoryImpl("jbc2-configs.xml", cf);
- for (Iterator iter = factory.getConfigurationNames().iterator();
iter.hasNext(); )
- {
- String name = (String) iter.next();
- Cache c = factory.getCache(name, true);
- c.start();
- System.out.println(name + " == " + c);
- factory.releaseCache(name);
- System.out.println(name + " == " + c.getCacheStatus());
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace(System.out);
- }
- }
-}
Modified:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JndiMultiplexingCacheInstanceManager.java
===================================================================
---
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JndiMultiplexingCacheInstanceManager.java 2007-12-23
14:53:06 UTC (rev 14261)
+++
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/JndiMultiplexingCacheInstanceManager.java 2007-12-23
14:55:36 UTC (rev 14262)
@@ -33,6 +33,7 @@
import org.hibernate.cfg.Settings;
import org.hibernate.util.NamingHelper;
import org.hibernate.util.PropertiesHelper;
+import org.jboss.cache.CacheManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,7 +50,7 @@
private static final Logger log =
LoggerFactory.getLogger(JndiMultiplexingCacheInstanceManager.class);
/**
- * Specifies the JNDI name under which the {@link JBossCacheFactory} to use is
bound.
+ * Specifies the JNDI name under which the {@link CacheManager} to use is bound.
* There is no default value -- the user must specify the property.
*/
public static final String CACHE_FACTORY_RESOURCE_PROP =
"hibernate.cache.region.jbc2.cachefactory";
@@ -68,18 +69,18 @@
if (name == null)
throw new CacheException("Configuration property " +
CACHE_FACTORY_RESOURCE_PROP + " not set");
- JBossCacheFactory cf = locateCacheFactory( name, NamingHelper.getJndiProperties(
properties ) );
+ CacheManager cf = locateCacheFactory( name, NamingHelper.getJndiProperties(
properties ) );
setCacheFactory( cf );
super.start(settings, properties);
}
- private JBossCacheFactory locateCacheFactory(String jndiNamespace, Properties
jndiProperties) {
+ private CacheManager locateCacheFactory(String jndiNamespace, Properties
jndiProperties) {
Context ctx = null;
try {
ctx = new InitialContext( jndiProperties );
- return (JBossCacheFactory) ctx.lookup( jndiNamespace );
+ return (CacheManager) ctx.lookup( jndiNamespace );
}
catch (NamingException ne) {
String msg = "Unable to retreive Cache from JNDI [" + jndiNamespace
+ "]";
Modified:
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/MultiplexingCacheInstanceManager.java
===================================================================
---
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/MultiplexingCacheInstanceManager.java 2007-12-23
14:53:06 UTC (rev 14261)
+++
core/trunk/cache-jbosscache2/src/main/java/org/hibernate/cache/jbc2/builder/MultiplexingCacheInstanceManager.java 2007-12-23
14:55:36 UTC (rev 14262)
@@ -27,6 +27,8 @@
import javax.transaction.TransactionManager;
import org.jboss.cache.Cache;
+import org.jboss.cache.CacheManager;
+import org.jboss.cache.CacheManagerImpl;
import org.jboss.cache.CacheStatus;
import org.jboss.cache.config.Configuration;
import org.jgroups.ChannelFactory;
@@ -106,9 +108,7 @@
public static final String DEF_CACHE_FACTORY_RESOURCE =
"org/hibernate/cache/jbc2/builder/jbc2-configs.xml";
/**
* Default value for {@link #CHANNEL_FACTORY_RESOURCE_PROP}. Specifies
- * "stacks.xml", which can be found in the root of the JGroups jar file.
- * Thus, leaving this value at default means using the default protocol
- * stack configs provided by JGroups.
+ * the "jgroups-stacks.xml" file in this package.
*/
public static final String DEF_MULTIPLEXER_RESOURCE =
"org/hibernate/cache/jbc2/builder/jgroups-stacks.xml";
/**
@@ -142,7 +142,7 @@
private String tsConfig = null;
/** Our cache factory */
- private JBossCacheFactory jbcFactory;
+ private CacheManager jbcFactory;
/** Our channel factory */
private ChannelFactory channelFactory;
/**
@@ -187,7 +187,7 @@
*
* @return Value for property 'cacheFactory'.
*/
- public JBossCacheFactory getCacheFactory() {
+ public CacheManager getCacheFactory() {
return jbcFactory;
}
@@ -197,7 +197,7 @@
*
* @param factory Value to set for property 'cacheFactory'.
*/
- public void setCacheFactory(JBossCacheFactory factory) {
+ public void setCacheFactory(CacheManager factory) {
this.jbcFactory = factory;
}
@@ -288,9 +288,8 @@
}
String factoryRes =
PropertiesHelper.getString(CACHE_FACTORY_RESOURCE_PROP, properties,
DEF_CACHE_FACTORY_RESOURCE);
- // FIXME use an impl from JBossCache
- jbcFactory = new JBossCacheFactoryImpl(factoryRes, channelFactory);
- ((JBossCacheFactoryImpl) jbcFactory).start();
+ jbcFactory = new CacheManagerImpl(factoryRes, channelFactory);
+ ((CacheManagerImpl) jbcFactory).start();
selfCreatedFactory = true;
}
@@ -390,7 +389,7 @@
public void stop() {
releaseCaches();
if (selfCreatedFactory) {
- ((JBossCacheFactoryImpl) jbcFactory).stop();
+ ((CacheManagerImpl) jbcFactory).stop();
}
}