package org.infinispan.spring; import java.io.IOException; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.configuration.parsing.ConfigurationBuilderHolder; import org.infinispan.configuration.parsing.ParserRegistry; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; import org.springframework.core.io.Resource; /** * <p> * An abstract base class for factories creating cache managers that are backed by an * EmbeddedCacheManager. * </p> * * @author <a href="mailto:olaf DOT bergner AT gmx DOT de">Olaf Bergner</a> * @author Marius Bogoevici */ public class AbstractEmbeddedCacheManagerFactory { protected static final Log logger = LogFactory.getLog(AbstractEmbeddedCacheManagerFactory.class); private Resource configurationFileLocation; private GlobalConfigurationBuilder gcb; private ConfigurationBuilder builder; // ------------------------------------------------------------------------ // Create fully configured EmbeddedCacheManager instance // ------------------------------------------------------------------------ protected EmbeddedCacheManager createBackingEmbeddedCacheManager() throws IOException { if (configurationFileLocation != null) { ConfigurationBuilderHolder configurationBuilderHolder = new ParserRegistry(Thread.currentThread().getContextClassLoader()) .parse(configurationFileLocation.getInputStream()); if(gcb != null) { configurationBuilderHolder.getGlobalConfigurationBuilder().read(gcb.build()); } if (builder != null) { ConfigurationBuilder dcb = configurationBuilderHolder.getDefaultConfigurationBuilder(); if (dcb != null) dcb.read(builder.build()); else throw logger.noDefaultCache(); } return new DefaultCacheManager(configurationBuilderHolder, true); } else { if (gcb == null) { if (logger.isDebugEnabled()) logger.debug("GlobalConfigurationBuilder is null. Using default new " + "instance."); gcb = new GlobalConfigurationBuilder(); gcb.globalJmxStatistics().allowDuplicateDomains(true); } if (builder == null) { if (logger.isDebugEnabled()) logger.debug("ConfigurationBuilder is null. Using default new instance."); builder = new ConfigurationBuilder(); } return new DefaultCacheManager(gcb.build(), builder.build()); } } // ------------------------------------------------------------------------ // Setter for location of configuration file // ------------------------------------------------------------------------ /** * <p> * Sets the {@link org.springframework.core.io.Resource <code>location</code>} of the * configuration file which will be used to configure the * {@link org.infinispan.manager.EmbeddedCacheManager <code>EmbeddedCacheManager</code>} the * {@link org.infinispan.spring.provider.SpringEmbeddedCacheManager * <code>SpringEmbeddedCacheManager</code>} created by this <code>FactoryBean</code> delegates * to. If no location is supplied, <tt>Infinispan</tt>'s default configuration will be used. * </p> * <p> * Note that configuration settings defined via using explicit setters exposed by this * <code>FactoryBean</code> take precedence over those defined in the configuration file pointed * to by <code>configurationFileLocation</code>. * </p> * * @param configurationFileLocation * The {@link org.springframework.core.io.Resource <code>location</code>} of the * configuration file which will be used to configure the * {@link org.infinispan.manager.EmbeddedCacheManager * <code>EmbeddedCacheManager</code>} the * {@link org.infinispan.spring.provider.SpringEmbeddedCacheManager * <code>SpringEmbeddedCacheManager</code>} created by this <code>FactoryBean</code> * delegates to */ public void setConfigurationFileLocation(final Resource configurationFileLocation) { this.configurationFileLocation = configurationFileLocation; } /** * Sets the {@link GlobalConfigurationBuilder} to use when creating an <code>EmbeddedCacheManager</code>. * * @param gcb the <code>GlobalConfigurationBuilder</code> instance. */ public void addCustomGlobalConfiguration(final GlobalConfigurationBuilder gcb) { this.gcb = gcb; } /** * Sets the {@link ConfigurationBuilder} to use when creating an <code>EmbeddedCacheManager</code>. * * @param builder the <code>ConfigurationBuilder</code> instance. */ public void addCustomCacheConfiguration(final ConfigurationBuilder builder) { this.builder = builder; } }