[jboss-cvs] JBossAS SVN: r106539 - in projects/cluster/ha-server-ispn/trunk: src and 19 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jul 9 16:10:11 EDT 2010


Author: pferraro
Date: 2010-07-09 16:10:10 -0400 (Fri, 09 Jul 2010)
New Revision: 106539

Added:
   projects/cluster/ha-server-ispn/trunk/pom.xml
   projects/cluster/ha-server-ispn/trunk/src/
   projects/cluster/ha-server-ispn/trunk/src/main/
   projects/cluster/ha-server-ispn/trunk/src/main/java/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/AliasAwareCacheContainer.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfiguration.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfigurationAdapter.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerFactory.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerRegistry.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/Alias.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfiguration.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationEntry.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationSource.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SimpleCacheContainerRegistryConfigurationSource.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SingleCacheContainerRegistryConfigurationSource.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/package-info.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolver.java
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/XMLCacheContainerRegistryConfigurationSource.java
   projects/cluster/ha-server-ispn/trunk/src/main/resources/
   projects/cluster/ha-server-ispn/trunk/src/main/resources/META-INF/
   projects/cluster/ha-server-ispn/trunk/src/main/resources/META-INF/infinispan-configs.xsd
   projects/cluster/ha-server-ispn/trunk/src/test/
   projects/cluster/ha-server-ispn/trunk/src/test/java/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SimpleCacheManagerRegistryConfigurationSourceTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SingleCacheManagerRegistryConfigurationSourceTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolverTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/XMLCacheManagerRegistryConfigurationSourceTest.java
   projects/cluster/ha-server-ispn/trunk/src/test/resources/
   projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs-multiple.xml
   projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs.xml
Modified:
   projects/cluster/ha-server-ispn/trunk/
Log:
Migrate CacheContainerRegistry code to separate module.


Property changes on: projects/cluster/ha-server-ispn/trunk
___________________________________________________________________
Name: svn:ignore
   + target
.settings
.classpath
.project


Added: projects/cluster/ha-server-ispn/trunk/pom.xml
===================================================================
--- projects/cluster/ha-server-ispn/trunk/pom.xml	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/pom.xml	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,107 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss</groupId>
+    <artifactId>jboss-parent</artifactId>
+    <version>5</version>
+  </parent>
+  
+  <groupId>org.jboss.cluster</groupId>
+  <artifactId>jboss-ha-server-ispn</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <name>JBoss AS Clustering Infinispan Support</name>
+  <description>A set of server-side Infinispan support classes for users of JBoss AS clustering</description>
+  <url>http://www.jboss.org</url>
+
+  <licenses>
+   <license>
+      <name>lgpl</name>
+      <url>http://repository.jboss.com/licenses/lgpl.txt</url>
+   </license>
+  </licenses>
+  <organization>
+    <name>JBoss, a division of Red Hat, Inc.</name>
+    <url>http://www.jboss.org</url>
+  </organization>
+
+  <scm>
+    <connection>scm:svn:http://anonsvn.jboss.org/repos/jbossas/projects/cluster/ha-server-ispn/trunk</connection>
+    <developerConnection>scm:svn:https://svn.jboss.org/repos/jbossas/projects/cluster/ha-server-ispn/trunk</developerConnection>
+  </scm>
+  
+  <properties>
+    <version.infinispan>4.1.0.CR1</version.infinispan>
+    <version.jta>1.0.1.GA</version.jta>
+    <version.junit>4.8.1</version.junit>
+    <version.easymock>3.0</version.easymock>
+  </properties>
+  
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-release-plugin</artifactId>
+        <configuration>
+          <!-- The tagBase property is needed during the release process so that the maven release plugin
+            will create the release tag in the appropriate location. -->
+          <tagBase>https://svn.jboss.org/repos/jbossas/projects/cluster/ha-server-cache-ispn/tags</tagBase>
+        </configuration>
+      </plugin>     
+    </plugins>
+  </build>  
+  
+  <dependencies> 
+    
+    <dependency>
+      <groupId>org.infinispan</groupId>
+      <artifactId>infinispan-core</artifactId>
+      <version>${version.infinispan}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+        </exclusion>
+        <exclusion>
+          <!-- Exclude JTA, and redeclare using provided scope -->
+          <groupId>org.jboss.javaee</groupId>
+          <artifactId>jboss-transaction-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    
+    <!-- Provided (by the container) dependencies -->
+    <dependency>
+      <groupId>org.jboss.javaee</groupId>
+      <artifactId>jboss-transaction-api</artifactId>
+      <version>1.0.1.GA</version>
+      <scope>provided</scope>
+    </dependency>
+    
+    <!-- Test dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${version.junit}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.easymock</groupId>
+      <artifactId>easymock</artifactId>
+      <version>${version.easymock}</version>
+      <scope>test</scope>
+    </dependency>
+    
+  </dependencies>   
+  
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>findbugs-maven-plugin</artifactId>
+        <version>2.3.1</version>
+      </plugin>
+    </plugins>
+  </reporting>
+  
+</project>
\ No newline at end of file

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/AliasAwareCacheContainer.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/AliasAwareCacheContainer.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/AliasAwareCacheContainer.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,90 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Map;
+
+import org.infinispan.Cache;
+import org.infinispan.manager.CacheContainer;
+
+/**
+ * Cache container decorator that returns the same cache instance for all aliases of a given cache name.
+ * @author Paul Ferraro
+ */
+public class AliasAwareCacheContainer implements CacheContainer
+{
+   private final CacheContainer container;
+   private final Map<String, String> aliases;
+   
+   /**
+    * Creates a new alias-aware cache container.
+    * @param container the proxied cache container
+    * @param aliases an map of cache name aliases
+    */
+   public AliasAwareCacheContainer(CacheContainer container, Map<String, String> aliases)
+   {
+      this.container = container;
+      this.aliases = aliases;
+   }
+   
+   /**
+    * {@inheritDoc}
+    * @see org.infinispan.lifecycle.Lifecycle#start()
+    */
+   @Override
+   public void start()
+   {
+      this.container.start();
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.infinispan.lifecycle.Lifecycle#stop()
+    */
+   @Override
+   public void stop()
+   {
+      this.container.stop();
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.infinispan.manager.CacheContainer#getCache()
+    */
+   @Override
+   public <K, V> Cache<K, V> getCache()
+   {
+      return this.container.getCache();
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.infinispan.manager.CacheContainer#getCache(java.lang.String)
+    */
+   @Override
+   public <K, V> Cache<K, V> getCache(String alias)
+   {
+      String name = this.aliases.get(alias);
+      
+      return this.container.getCache((name == null) ? alias : name);
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfiguration.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfiguration.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfiguration.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Collection;
+
+import org.infinispan.config.Configuration;
+import org.infinispan.config.GlobalConfiguration;
+
+/**
+ * Represents an Infinispan cache container configuration.
+ * @author Paul Ferraro
+ */
+public interface CacheContainerConfiguration
+{
+   /**
+    * The general configuration shared by all caches.
+    * @return a global configuration
+    */
+   GlobalConfiguration getGlobalConfiguration();
+
+   /**
+    * The default configuration inherited by any named caches.
+    * @return the default cache configuration
+    */
+   Configuration getDefaultConfiguration();
+
+   /**
+    * The name cache configurations.
+    * @return a collection of named cache configuration
+    */
+   Collection<Configuration> getConfigurations();
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfigurationAdapter.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfigurationAdapter.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerConfigurationAdapter.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Collection;
+
+import org.infinispan.config.Configuration;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.config.InfinispanConfiguration;
+
+/**
+ * Adapts an {@link InfinispanConfiguration} to the {@link CacheContainerConfiguration} interface.
+ * @author Paul Ferraro
+ */
+public class CacheContainerConfigurationAdapter implements CacheContainerConfiguration
+{
+   private final InfinispanConfiguration configuration;
+   
+   public CacheContainerConfigurationAdapter(InfinispanConfiguration configuration)
+   {
+      this.configuration = configuration;
+   }
+
+   @Override
+   public GlobalConfiguration getGlobalConfiguration()
+   {
+      return this.configuration.parseGlobalConfiguration();
+   }
+
+   @Override
+   public Configuration getDefaultConfiguration()
+   {
+      return this.configuration.parseDefaultConfiguration();
+   }
+
+   @Override
+   public Collection<Configuration> getConfigurations()
+   {
+      return this.configuration.parseNamedConfigurations().values();
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerFactory.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerFactory.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerFactory.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Map;
+
+import org.infinispan.manager.CacheContainer;
+
+/**
+ * Creates an Infinispan {@link CacheContainer} instance from configuration.
+ * 
+ * @author Paul Ferraro
+ */
+public interface CacheContainerFactory
+{
+   /**
+    * Creates a {@link CacheContainer} from the specified configuration and alias mapping.
+    * @param configuration a cache container configuration
+    * @param aliases a map of cache name aliases 
+    * @return an Infinispan cache container
+    */
+   CacheContainer createCacheContainer(CacheContainerConfiguration configuration, Map<String, String> aliases);
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerRegistry.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerRegistry.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/CacheContainerRegistry.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Set;
+
+import org.infinispan.manager.CacheContainer;
+
+/**
+ * A registry of Infinispan cache containers.
+ * @author Paul Ferraro
+ */
+public interface CacheContainerRegistry
+{
+   /**
+    * Returns the default cache container.
+    * Equivalent to getCacheContainer(null).
+    * @return an Infinispan cache container.
+    */
+   CacheContainer getDefaultCacheContainer();
+   
+   /**
+    * Returns the cache container associated with the specified identifier,
+    * or the default cache container if there is no associated cache container
+    * or the specified id is null.
+    * @param id a cache container identifier
+    * @return an Infinispan cache container.
+    */
+   CacheContainer getCacheContainer(String id);
+   
+   /**
+    * Returns the identifiers of all cache containers in this registry.
+    * @return a set of cache container identifiers.
+    */
+   Set<String> getCacheContainers();
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,122 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.infinispan.config.Configuration;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.manager.CacheContainer;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup;
+import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.jgroups.Channel;
+import org.jgroups.ChannelFactory;
+
+/**
+ * An Infinispan cache container factory that injects its channel from a channel factory and adds aliasing support.
+ * 
+ * @author Paul Ferraro
+ */
+ at SuppressWarnings("deprecation")
+public class DefaultCacheContainerFactory implements CacheContainerFactory
+{
+   private static final String CHANNEL_ID = "channelId";
+   private static final String CHANNEL_FACTORY = "channelFactory";
+   
+   private final ChannelFactory channelFactory;
+   
+   /**
+    * Creates a new cache container factory using the specified channel factory.
+    * @param channelFactory a channel factory
+    */
+   public DefaultCacheContainerFactory(ChannelFactory channelFactory)
+   {
+      this.channelFactory = channelFactory;
+   }
+   
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.CacheContainerFactory#createCacheContainer(org.jboss.ha.ispn.CacheContainerConfiguration, java.util.Map)
+    */
+   @Override
+   public CacheContainer createCacheContainer(CacheContainerConfiguration configuration, Map<String, String> aliases)
+   {
+      GlobalConfiguration globalConfiguration = configuration.getGlobalConfiguration();
+      Properties properties = globalConfiguration.getTransportProperties();
+      properties.put(CHANNEL_FACTORY, this.channelFactory);
+      properties.setProperty(CHANNEL_ID, globalConfiguration.getClusterName());
+      properties.setProperty(JGroupsTransport.CHANNEL_LOOKUP, ChannelFactoryChannelLookup.class.getName());
+
+      EmbeddedCacheManager manager = new DefaultCacheManager(globalConfiguration, configuration.getDefaultConfiguration(), false);
+
+      // Add named configurations
+      for (Configuration config: configuration.getConfigurations())
+      {
+         manager.defineConfiguration(config.getName(), config);
+      }
+      
+      manager.start();
+      
+      return new AliasAwareCacheContainer(manager, aliases);
+   }
+   
+   /**
+    * JGroupsChannelLookup implementation that uses a channel factory.
+    */
+   public static class ChannelFactoryChannelLookup implements JGroupsChannelLookup
+   {
+      public static final String STACK = "stack";
+      public static final String DEFAULT_STACK = "udp";
+      
+      @Override
+      public Channel getJGroupsChannel(Properties properties)
+      {
+         String stack = properties.getProperty(STACK, DEFAULT_STACK);
+         String id = properties.getProperty(CHANNEL_ID);
+         ChannelFactory factory = (ChannelFactory) properties.get(CHANNEL_FACTORY);
+         
+         try
+         {
+            return factory.createMultiplexerChannel(stack, id);
+         }
+         catch (Exception e)
+         {
+            throw new IllegalArgumentException(e);
+         }
+      }
+
+      @Override
+      public boolean shouldStartAndConnect()
+      {
+         return true;
+      }
+
+      @Override
+      public boolean shouldStopAndDisconnect()
+      {
+         return true;
+      }
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,207 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn;
+
+import java.util.AbstractMap;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.infinispan.manager.CacheContainer;
+import org.jboss.ha.ispn.config.Alias;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfiguration;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationEntry;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource;
+import org.jboss.logging.Logger;
+
+/**
+ * Cache container registry that populates itself using a specified factory from configuration from a specified source.
+ * All cache containers in the registry are bound to jndi.
+ * @author Paul Ferraro
+ */
+public class DefaultCacheContainerRegistry implements CacheContainerRegistry
+{
+   private static Logger logger = Logger.getLogger(DefaultCacheContainerRegistry.class);
+   
+   private final CacheContainerFactory factory;
+   private final CacheContainerRegistryConfigurationSource source;
+   private final Context context;
+   private final Map<String, Map.Entry<String, CacheContainer>> containers = new ConcurrentHashMap<String, Map.Entry<String, CacheContainer>>();
+   
+   private CacheContainer defaultContainer;
+   
+   /**
+    * Creates a new cache container registry using the specified factory and source.
+    * @param factory used to create cache container instances from configuration
+    * @param source source of cache container configurations.
+    * @throws NamingException if inital context could not be created
+    */
+   public DefaultCacheContainerRegistry(CacheContainerFactory factory, CacheContainerRegistryConfigurationSource source) throws NamingException
+   {
+      this(factory, source, new InitialContext());
+   }
+   
+   /**
+    * Creates a new cache container registry using the specified factory and source.
+    * @param factory used to create cache container instances from configuration
+    * @param source source of cache container configurations.
+    * @param context jndi context to which to bind cache containers.
+    */
+   public DefaultCacheContainerRegistry(CacheContainerFactory factory, CacheContainerRegistryConfigurationSource source, Context context)
+   {
+      this.factory = factory;
+      this.source = source;
+      this.context = context;
+   }
+   
+   public void start() throws Exception
+   {
+      CacheContainerRegistryConfiguration registry = this.source.getRegistryConfiguration();
+      
+      for (CacheContainerRegistryConfigurationEntry entry: registry.getEntries())
+      {
+         if (entry.getJndiName() == null)
+         {
+            entry.setJndiName(this.context.composeName(entry.getId(), registry.getBaseJndiName()));
+         }
+         
+         this.add(entry);
+      }
+
+      CacheContainerRegistryConfigurationEntry defaultEntry = registry.getDefaultEntry();
+      
+      if (defaultEntry == null)
+      {
+         defaultEntry = registry.getEntries().get(0);
+      }
+      
+      this.defaultContainer = this.containers.get(defaultEntry.getId()).getValue();
+   }
+   
+   public void stop() throws Exception
+   {
+      for (Map.Entry<String, CacheContainer> entry: this.containers.values())
+      {
+         try
+         {
+            this.context.unbind(entry.getKey());
+         }
+         catch (NamingException e)
+         {
+            logger.warn(e.getMessage(), e);
+         }
+         
+         entry.getValue().stop();
+      }
+      
+      this.containers.clear();
+      this.defaultContainer = null;
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.CacheContainerRegistry#getCacheContainers()
+    */
+   @Override
+   public Set<String> getCacheContainers()
+   {
+      return Collections.unmodifiableSet(this.containers.keySet());
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.CacheContainerRegistry#getDefaultCacheContainer()
+    */
+   @Override
+   public CacheContainer getDefaultCacheContainer()
+   {
+      return this.defaultContainer;
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.CacheContainerRegistry#getCacheContainer(java.lang.String)
+    */
+   @Override
+   public CacheContainer getCacheContainer(String name)
+   {
+      Map.Entry<String, CacheContainer> entry = (name != null) ? this.containers.get(name) : null;
+      
+      // Return default cache manager, if name was not found or if it was null
+      return (entry != null) ? entry.getValue() : this.defaultContainer;
+   }
+   
+   public void add(CacheContainerRegistryConfigurationEntry entry) throws NamingException
+   {
+      CacheContainerConfiguration configuration = new CacheContainerConfigurationAdapter(entry.getConfiguration());
+      CacheContainer container = this.factory.createCacheContainer(configuration, this.mapAliases(entry));
+      
+      String jndiName = entry.getJndiName();
+      
+      // Store cache containers with jndi name, so they can be unbound during stop()
+      this.containers.put(entry.getId(), new AbstractMap.SimpleImmutableEntry<String, CacheContainer>(jndiName, container));
+      
+      // Bind cache container to jndi
+      this.context.bind(jndiName, container);
+   }
+   
+   private Map<String, String> mapAliases(CacheContainerRegistryConfigurationEntry entry)
+   {
+      List<Alias> aliases = entry.getAliases();
+      
+      if ((aliases == null) || aliases.isEmpty()) return Collections.emptyMap();
+      
+      if (aliases.size() == 1)
+      {
+         Alias alias = aliases.get(0);
+         return Collections.singletonMap(alias.getName(), alias.getTarget());
+      }
+      
+      Map<String, String> map = new HashMap<String, String>();
+      
+      for (Alias alias: aliases)
+      {
+         map.put(alias.getName(), alias.getTarget());
+      }
+      
+      return map;
+   }
+   
+   public void remove(CacheContainerRegistryConfigurationEntry config) throws NamingException
+   {
+      Map.Entry<String, CacheContainer> entry = this.containers.remove(config.getId());
+      
+      if (entry != null)
+      {
+         entry.getValue().stop();
+         
+         this.context.unbind(entry.getKey());
+      }
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/Alias.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/Alias.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/Alias.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+/**
+ * Generic alias descriptor.
+ * @author Paul Ferraro
+ */
+ at XmlAccessorType(XmlAccessType.FIELD)
+ at XmlType
+public class Alias
+{
+   @XmlAttribute(name = "name")
+   private String name;
+   
+   @XmlValue
+   private String target;
+   
+   public String getName()
+   {
+      return this.name;
+   }
+   
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+   
+   public String getTarget()
+   {
+      return this.target;
+   }
+   
+   public void setTarget(String target)
+   {
+      this.target = target;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfiguration.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfiguration.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfiguration.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlIDREF;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * Root element for cache container registry configuration.
+ * @author Paul Ferraro
+ */
+ at XmlRootElement(name = "infinispan-configs")
+ at XmlAccessorType(XmlAccessType.FIELD)
+ at XmlType
+public class CacheContainerRegistryConfiguration
+{
+   @XmlIDREF
+   @XmlAttribute(name = "default", required = false)
+   private CacheContainerRegistryConfigurationEntry defaultEntry;
+
+   @XmlAttribute(name = "base-jndi-name", required = false)
+   private String baseJndiName = "java:CacheManager";
+   
+   @XmlElement(name = "infinispan-config")
+   private List<CacheContainerRegistryConfigurationEntry> entries;
+   
+   public CacheContainerRegistryConfigurationEntry getDefaultEntry()
+   {
+      return this.defaultEntry;
+   }
+   
+   public void setDefaultEntry(CacheContainerRegistryConfigurationEntry defaultEntry)
+   {
+      this.defaultEntry = defaultEntry;
+   }
+   
+   public List<CacheContainerRegistryConfigurationEntry> getEntries()
+   {
+      return this.entries;
+   }
+
+   public void setEntries(List<CacheContainerRegistryConfigurationEntry> entries)
+   {
+      this.entries = entries;
+   }
+
+   public String getBaseJndiName()
+   {
+      return this.baseJndiName;
+   }
+
+   public void setBaseJndiName(String baseJndiName)
+   {
+      this.baseJndiName = baseJndiName;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationEntry.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationEntry.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationEntry.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlType;
+
+import org.infinispan.config.InfinispanConfiguration;
+
+/**
+ * A cache container registry configuration entry.
+ * @author Paul Ferraro
+ */
+ at XmlAccessorType(XmlAccessType.FIELD)
+ at XmlType
+public class CacheContainerRegistryConfigurationEntry
+{
+   @XmlID
+   @XmlAttribute(name = "name", required = true)
+   private String id;
+   @XmlAttribute(name = "jndi-name", required = false)
+   private String jndiName;
+   
+   @XmlElement(name = "alias")
+   private List<Alias> aliases;
+   
+   @XmlElementRef
+   private InfinispanConfiguration configuration;
+
+   public String getId()
+   {
+      return this.id;
+   }
+   
+   public void setId(String id)
+   {
+      this.id = id;
+   }
+   
+   public String getJndiName()
+   {
+      return this.jndiName;
+   }
+
+   public void setJndiName(String jndiName)
+   {
+      this.jndiName = jndiName;
+   }
+   
+   public List<Alias> getAliases()
+   {
+      return this.aliases;
+   }
+   
+   public void setAliases(List<Alias> aliases)
+   {
+      this.aliases = aliases;
+   }
+   
+   public InfinispanConfiguration getConfiguration()
+   {
+      return this.configuration;
+   }
+   
+   public void setConfiguration(InfinispanConfiguration configuration)
+   {
+      this.configuration = configuration;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationSource.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationSource.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/CacheContainerRegistryConfigurationSource.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+/**
+ * A source of cache container registry configuration.
+ * @author Paul Ferraro
+ */
+public interface CacheContainerRegistryConfigurationSource
+{
+   /**
+    * Retrieves a cache container registry configuration.
+    * @return a cache container registry configuration
+    * @throws Exception if the configuration could not be retrieved.
+    */
+   CacheContainerRegistryConfiguration getRegistryConfiguration() throws Exception;
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SimpleCacheContainerRegistryConfigurationSource.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SimpleCacheContainerRegistryConfigurationSource.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SimpleCacheContainerRegistryConfigurationSource.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+/**
+ * A trivial cache container registry source implementation.
+ * @author Paul Ferraro
+ */
+public class SimpleCacheContainerRegistryConfigurationSource implements CacheContainerRegistryConfigurationSource
+{
+   private final CacheContainerRegistryConfiguration configuration;
+   
+   /**
+    * Creates a new SimpleCacheContainerRegistryConfigurationSource using the specified configuration.
+    * @param configuration the cache container registry configuration.
+    */
+   public SimpleCacheContainerRegistryConfigurationSource(CacheContainerRegistryConfiguration configuration)
+   {
+      this.configuration = configuration;
+   }
+   
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource#getRegistryConfiguration()
+    */
+   @Override
+   public CacheContainerRegistryConfiguration getRegistryConfiguration()
+   {
+      return this.configuration;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SingleCacheContainerRegistryConfigurationSource.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SingleCacheContainerRegistryConfigurationSource.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/SingleCacheContainerRegistryConfigurationSource.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.infinispan.config.InfinispanConfiguration;
+
+/**
+ * A source for a cache container registry that parses an single Infinispan configuration file.
+ * @author Paul Ferraro
+ */
+public class SingleCacheContainerRegistryConfigurationSource implements CacheContainerRegistryConfigurationSource
+{
+   public static final String DEFAULT_ID = "default";
+   
+   private final String resource;
+   
+   private String id = DEFAULT_ID;
+   private String jndiName;
+   
+   /**
+    * Creates a new SingleCacheContainerRegistryConfigurationSource
+    * @param id the identifier of the singleton cache container
+    * @param jndiName the jndi name for the cache container
+    * @param resource the classpath resource containing the infinispan cache container configuration.
+    */
+   public SingleCacheContainerRegistryConfigurationSource(String resource)
+   {
+      this.resource = resource;
+   }
+
+   public void setId(String id)
+   {
+      this.id = id;
+   }
+   
+   public void setJndiName(String jndiName)
+   {
+      this.jndiName = jndiName;
+   }
+   
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource#getRegistryConfiguration()
+    */
+   @Override
+   public CacheContainerRegistryConfiguration getRegistryConfiguration() throws IOException
+   {
+      CacheContainerRegistryConfigurationEntry entry = new CacheContainerRegistryConfigurationEntry();
+      entry.setId(this.id);
+      entry.setJndiName(this.jndiName);
+      entry.setConfiguration(InfinispanConfiguration.newInfinispanConfiguration(this.resource));
+      
+      CacheContainerRegistryConfiguration registry = new CacheContainerRegistryConfiguration();
+      registry.setDefaultEntry(entry);
+      registry.setEntries(Collections.singletonList(entry));
+      
+      return registry;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/package-info.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/package-info.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/package-info.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,26 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ at XmlSchema(namespace = "urn:jboss:infinispan-configs:1.0", elementFormDefault = XmlNsForm.QUALIFIED)
+package org.jboss.ha.ispn.config;
+
+import javax.xml.bind.annotation.XmlNsForm;
+import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolver.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolver.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolver.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config.xml;
+
+import java.net.URL;
+import java.util.Map;
+
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+
+/**
+ * A custom resource resolver that can override the locations for resources by namespace.
+ * 
+ * @author Paul Ferraro
+ */
+public class NamespaceResourceResolver implements LSResourceResolver
+{
+   private final Map<String, Map<String, URL>> types;
+   private final DOMImplementationLS implementation;
+   
+   /**
+    * Creates a new NamespaceResourceResolver using the specified set of target resource URLs, identified by namespace, per resource type.
+    * Uses the default DOM load-store implementation.
+    * @param types a map of resource type to map of namespace to resource location
+    */
+   public NamespaceResourceResolver(Map<String, Map<String, URL>> types)
+   {
+      this(types, defaultImplementation());
+   }
+   
+   /**
+    * Creates a new NamespaceResourceResolver using the specified set of target resource URLs, identified by namespace, per resource type.
+    * @param types a map of resource type to map of namespace to resource location
+    * @param implementation a DOM load-store implementation
+    */
+   public NamespaceResourceResolver(Map<String, Map<String, URL>> types, DOMImplementationLS implementation)
+   {
+      this.types = types;
+      this.implementation = implementation;
+   }
+   
+   private static DOMImplementationLS defaultImplementation()
+   {
+      try
+      {
+         return (DOMImplementationLS) DOMImplementationRegistry.newInstance().getDOMImplementation("LS");
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new IllegalStateException(e);
+      }
+      catch (InstantiationException e)
+      {
+         throw new IllegalStateException(e);
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new IllegalStateException(e);
+      }
+   }
+
+   /**
+    * {@inheritDoc}
+    * @see org.w3c.dom.ls.LSResourceResolver#resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+    */
+   @Override
+   public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI)
+   {
+      LSInput input = this.implementation.createLSInput();
+      
+      input.setPublicId(publicId);
+      input.setSystemId(systemId);
+      input.setBaseURI(baseURI);
+      
+      Map<String, URL> namespaces = this.types.get(type);
+      
+      if (namespaces != null)
+      {
+         URL url = namespaces.get(namespaceURI);
+         
+         if (url != null)
+         {
+            // Substitute our system id, since we have a matching type and namespace
+            input.setSystemId(url.toString());
+         }
+      }
+      
+      return input;
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/XMLCacheContainerRegistryConfigurationSource.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/XMLCacheContainerRegistryConfigurationSource.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/config/xml/XMLCacheContainerRegistryConfigurationSource.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,115 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ha.ispn.config.xml;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.validation.SchemaFactory;
+
+import org.infinispan.config.InfinispanConfiguration;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfiguration;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource;
+import org.xml.sax.SAXException;
+
+/**
+ * A source for a cache container registry that parses an XML file containing a series of infinispan cache container configurations.
+ * @author Paul Ferraro
+ */
+public class XMLCacheContainerRegistryConfigurationSource implements CacheContainerRegistryConfigurationSource
+{
+   private static final String SCHEMA = "META-INF/infinispan-configs.xsd";
+   private static final String DEFAULT_XML = "infinispan-configs.xml";
+   
+   private static final String INFINISPAN_NAMESPACE = "urn:infinispan:config:4.0";   
+   private static final String INFINISPAN_SCHEMA = InfinispanConfiguration.resolveSchemaPath();
+
+   private final URL infinispanSchemaURL;
+   private final URL schemaURL;
+   private final URL xmlURL;
+   
+   /**
+    * Creates a new XMLCacheContainerRegistryConfigurationSource using the {@link #DEFAULT_XML} classpath resource
+    * containing the cache container registry configuration.
+    */
+   public XMLCacheContainerRegistryConfigurationSource()
+   {
+      this(DEFAULT_XML);
+   }
+   
+   /**
+    * Creates a new XMLCacheContainerRegistryConfigurationSource using the specified location containing
+    * the cache container registry configuration.
+    * @param url the location of the cache container registry configuration
+    */
+   public XMLCacheContainerRegistryConfigurationSource(URL url)
+   {
+      this.xmlURL = url;
+      this.schemaURL = findResource(SCHEMA);
+      this.infinispanSchemaURL = findResource(INFINISPAN_SCHEMA);
+   }
+   
+   /**
+    * Creates a new XMLCacheContainerRegistryConfigurationSource using the specified classpath resource containing
+    * the cache container registry configuration.
+    * @param resource the classpath resource containing the cache container registry configuration
+    */
+   public XMLCacheContainerRegistryConfigurationSource(String resource)
+   {
+      this(findResource(resource));
+   }
+   
+   private static URL findResource(String resource)
+   {
+      URL url = Thread.currentThread().getContextClassLoader().getResource(resource);
+      
+      if (url == null)
+      {
+         throw new IllegalArgumentException("Failed to locate resource: " + resource);
+      }
+      
+      return url;
+   }
+   
+   /**
+    * {@inheritDoc}
+    * @see org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource#getRegistryConfiguration()
+    */
+   @Override
+   public CacheContainerRegistryConfiguration getRegistryConfiguration() throws JAXBException, SAXException
+   {
+      SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+      // Resolve Infinispan schema against schema found in classpath
+      Map<String, URL> schemaURLs = Collections.singletonMap(INFINISPAN_NAMESPACE, this.infinispanSchemaURL);
+      schemaFactory.setResourceResolver(new NamespaceResourceResolver(Collections.singletonMap(XMLConstants.W3C_XML_SCHEMA_NS_URI, schemaURLs)));
+      
+      Unmarshaller unmarshaller = JAXBContext.newInstance(CacheContainerRegistryConfiguration.class).createUnmarshaller();
+      unmarshaller.setSchema(schemaFactory.newSchema(this.schemaURL));
+      
+      return (CacheContainerRegistryConfiguration) unmarshaller.unmarshal(this.xmlURL);
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/main/resources/META-INF/infinispan-configs.xsd
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/resources/META-INF/infinispan-configs.xsd	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/main/resources/META-INF/infinispan-configs.xsd	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<xs:schema targetNamespace="urn:jboss:infinispan-configs:1.0" xmlns:tns="urn:jboss:infinispan-configs:1.0" xmlns:ispn="urn:infinispan:config:4.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0">
+
+  <xs:import namespace="urn:infinispan:config:4.0" schemaLocation="http://docs.jboss.org/infinispan/schemas/infinispan-config-4.1.xsd"/>
+  
+  <xs:element name="infinispan-configs" type="tns:cacheContainerRegistryConfiguration"/>
+  
+  <xs:complexType name="cacheContainerRegistryConfiguration">
+  	<xs:sequence>
+  	  <xs:element name="infinispan-config" type="tns:cacheContainerRegistryConfigurationEntry" maxOccurs="unbounded"/>
+  	</xs:sequence>
+    <xs:attribute name="default" type="xs:IDREF"/>
+    <xs:attribute name="base-jndi-name" type="xs:string" default="java:CacheManager"/>
+  </xs:complexType>
+  
+  <xs:complexType name="cacheContainerRegistryConfigurationEntry">
+  	<xs:sequence>
+      <xs:element name="alias" type="tns:alias" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element ref="ispn:infinispan"/>
+  	</xs:sequence>
+  	<xs:attribute name="name" type="xs:ID" use="required"/>
+    <xs:attribute name="jndi-name" type="xs:string"/>
+  </xs:complexType>
+  
+  <xs:complexType name="alias">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute name="name" type="xs:string" use="required"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+  
+</xs:schema>
\ No newline at end of file

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,114 @@
+package org.jboss.ha.ispn;
+
+import java.net.URL;
+import java.util.Collections;
+
+import junit.framework.Assert;
+
+import org.easymock.EasyMock;
+import org.infinispan.Cache;
+import org.infinispan.config.Configuration;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.lifecycle.ComponentStatus;
+import org.infinispan.manager.CacheContainer;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.jgroups.ChannelFactory;
+import org.jgroups.JChannel;
+import org.junit.Test;
+
+ at SuppressWarnings("deprecation")
+public class DefaultCacheContainerFactoryTest
+{
+   @Test
+   public void test() throws Exception
+   {
+      CacheContainerConfiguration configuration = EasyMock.createStrictMock(CacheContainerConfiguration.class);
+      ChannelFactory channelFactory = EasyMock.createStrictMock(ChannelFactory.class);
+      GlobalConfiguration globalConfiguration = new GlobalConfiguration();
+      globalConfiguration.setTransportClass(JGroupsTransport.class.getName());
+      globalConfiguration.setClusterName("mychannel");
+      
+      Configuration defaultConfiguration = new Configuration();
+      Configuration namedConfiguration = new NamedConfiguration("custom");
+
+      CacheContainerFactory factory = new DefaultCacheContainerFactory(channelFactory);
+      
+      EasyMock.expect(configuration.getGlobalConfiguration()).andReturn(globalConfiguration);
+      EasyMock.expect(configuration.getDefaultConfiguration()).andReturn(defaultConfiguration);
+      EasyMock.expect(configuration.getConfigurations()).andReturn(Collections.singletonList(namedConfiguration));
+      
+      EasyMock.replay(configuration, channelFactory);
+      
+      CacheContainer result = factory.createCacheContainer(configuration, Collections.singletonMap("alias", CacheContainer.DEFAULT_CACHE_NAME));
+      
+      try
+      {
+         EasyMock.verify(configuration, channelFactory);
+         
+         EasyMock.reset(configuration, channelFactory);
+   
+         URL url = Thread.currentThread().getContextClassLoader().getResource("config-samples/jgroups-udp.xml");
+         EasyMock.expect(channelFactory.createMultiplexerChannel(DefaultCacheContainerFactory.ChannelFactoryChannelLookup.DEFAULT_STACK, "mychannel")).andReturn(new JChannel(url));
+         
+         EasyMock.replay(channelFactory);
+         
+         Cache<?, ?> cache = result.getCache();
+
+         try
+         {
+            EasyMock.verify(channelFactory);
+      
+            Assert.assertSame(ComponentStatus.RUNNING, cache.getStatus());
+            
+            EmbeddedCacheManager manager = (EmbeddedCacheManager) cache.getCacheManager();
+            
+            Assert.assertSame(manager, cache.getCacheManager());
+            Assert.assertSame(ComponentStatus.RUNNING, manager.getStatus());
+            Assert.assertTrue(manager.isCoordinator());
+            Assert.assertEquals(Collections.singletonList(manager.getAddress()), manager.getMembers());
+            
+            Cache<?, ?> aliasCache = result.getCache("alias");
+            
+            try
+            {
+               Assert.assertSame(cache, aliasCache);
+               
+               Cache<?, ?> otherCache = result.getCache("other");
+               
+               try
+               {
+                  Assert.assertNotSame(cache, otherCache);
+                  Assert.assertNotSame(aliasCache, otherCache);
+               }
+               finally
+               {
+                  otherCache.stop();
+               }
+            }
+            finally
+            {
+               aliasCache.stop();
+            }
+         }
+         finally
+         {
+            cache.stop();
+         }
+      }
+      finally
+      {
+         result.stop();
+      }
+   }
+   
+   public static class NamedConfiguration extends Configuration
+   {
+      private static final long serialVersionUID = -6362167959914418561L;
+
+      public NamedConfiguration(String name)
+      {
+         this.name = name;
+      }
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,195 @@
+package org.jboss.ha.ispn;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.naming.Context;
+
+import junit.framework.Assert;
+
+import org.easymock.Capture;
+import org.easymock.CaptureType;
+import org.easymock.EasyMock;
+import org.infinispan.config.Configuration;
+import org.infinispan.config.InfinispanConfiguration;
+import org.infinispan.manager.CacheContainer;
+import org.jboss.ha.ispn.config.Alias;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfiguration;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationEntry;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource;
+import org.junit.Test;
+
+public class DefaultCacheContainerRegistryTest
+{
+   /**
+    * Test with unspecified default config and default base jndi name
+    * @throws Exception
+    */
+   @Test
+   public void defaults() throws Exception
+   {
+      CacheContainerFactory factory = EasyMock.createStrictMock(CacheContainerFactory.class);
+      CacheContainerRegistryConfigurationSource source = EasyMock.createStrictMock(CacheContainerRegistryConfigurationSource.class);
+      CacheContainer defaultCacheManager = EasyMock.createStrictMock(CacheContainer.class);
+      CacheContainer otherCacheManager = EasyMock.createStrictMock(CacheContainer.class);
+      Context context = EasyMock.createStrictMock(Context.class);
+      Capture<CacheContainerConfiguration> capturedConfiguration = new Capture<CacheContainerConfiguration>(CaptureType.ALL);
+      
+      InfinispanConfiguration config = InfinispanConfiguration.newInfinispanConfiguration("config-samples/minimal.xml");
+
+      CacheContainerRegistryConfigurationEntry entry1 = new CacheContainerRegistryConfigurationEntry();
+      
+      entry1.setId("default");
+      entry1.setConfiguration(config);
+
+      CacheContainerRegistryConfigurationEntry entry2 = new CacheContainerRegistryConfigurationEntry();
+      
+      entry2.setId("other");
+      entry2.setConfiguration(config);
+      
+      CacheContainerRegistryConfiguration configRegistry = new CacheContainerRegistryConfiguration();
+      configRegistry.setEntries(Arrays.asList(entry1, entry2));
+      
+      DefaultCacheContainerRegistry registry = new DefaultCacheContainerRegistry(factory, source, context);
+      
+      EasyMock.expect(source.getRegistryConfiguration()).andReturn(configRegistry);
+      
+      EasyMock.expect(factory.createCacheContainer(EasyMock.capture(capturedConfiguration), EasyMock.eq(Collections.<String, String>emptyMap()))).andReturn(defaultCacheManager);
+      EasyMock.expect(context.composeName("default", "java:CacheManager")).andReturn("java:CacheManager/default");
+      
+      context.bind("java:CacheManager/default", defaultCacheManager);
+
+      EasyMock.expect(factory.createCacheContainer(EasyMock.capture(capturedConfiguration), EasyMock.eq(Collections.<String, String>emptyMap()))).andReturn(otherCacheManager);
+      EasyMock.expect(context.composeName("other", "java:CacheManager")).andReturn("java:CacheManager/other");
+      
+      context.bind("java:CacheManager/other", otherCacheManager);
+
+      EasyMock.replay(factory, source, context, defaultCacheManager, otherCacheManager);
+      
+      registry.start();
+      
+      EasyMock.verify(factory, source, context, defaultCacheManager, otherCacheManager);
+      
+      Set<String> names = registry.getCacheContainers();
+      Assert.assertEquals(2, names.size());
+      Assert.assertTrue(names.contains("default"));
+      Assert.assertTrue(names.contains("other"));
+      
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer(null));
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer("default"));
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer("unknown"));
+      Assert.assertSame(otherCacheManager, registry.getCacheContainer("other"));
+
+      List<CacheContainerConfiguration> configurations = capturedConfiguration.getValues();
+      Assert.assertEquals(2, configurations.size());
+      
+      for (CacheContainerConfiguration configuration: configurations)
+      {
+         Assert.assertSame(config.parseGlobalConfiguration(), configuration.getGlobalConfiguration());
+         Assert.assertSame(config.parseDefaultConfiguration(), configuration.getDefaultConfiguration());
+         Map<String, Configuration> namedConfigurations = config.parseNamedConfigurations();
+         Collection<Configuration> configs = configuration.getConfigurations();
+         Assert.assertEquals(namedConfigurations.size(), configs.size());
+         for (Configuration c: configs)
+         {
+            Assert.assertSame(namedConfigurations.get(c.getName()), c);
+         }
+      }
+      
+      EasyMock.reset(factory, source, context, defaultCacheManager, otherCacheManager);
+   }
+   
+   /**
+    * Test with custom default config and custom base jndi name
+    * @throws Exception
+    */
+   @Test
+   public void custom() throws Exception
+   {
+      CacheContainerFactory factory = EasyMock.createStrictMock(CacheContainerFactory.class);
+      CacheContainerRegistryConfigurationSource provider = EasyMock.createStrictMock(CacheContainerRegistryConfigurationSource.class);
+      CacheContainer defaultCacheManager = EasyMock.createStrictMock(CacheContainer.class);
+      CacheContainer otherCacheManager = EasyMock.createStrictMock(CacheContainer.class);
+      Context context = EasyMock.createStrictMock(Context.class);
+      Capture<CacheContainerConfiguration> capturedConfiguration = new Capture<CacheContainerConfiguration>(CaptureType.ALL);
+      
+      InfinispanConfiguration config = InfinispanConfiguration.newInfinispanConfiguration("config-samples/minimal.xml");
+
+      CacheContainerRegistryConfigurationEntry entry1 = new CacheContainerRegistryConfigurationEntry();
+      
+      entry1.setId("other");
+      entry1.setConfiguration(config);
+      entry1.setJndiName("java:other");
+      
+      Alias alias1 = new Alias();
+      alias1.setName("legacy-other-cache");
+      alias1.setTarget("other-cache");
+      entry1.setAliases(Collections.singletonList(alias1));
+      
+      CacheContainerRegistryConfigurationEntry entry2 = new CacheContainerRegistryConfigurationEntry();
+      
+      entry2.setId("default");
+      entry2.setConfiguration(config);
+      
+      Alias alias2 = new Alias();
+      alias2.setName("legacy-default-cache");
+      alias2.setTarget("default-cache");
+      entry2.setAliases(Collections.singletonList(alias2));
+      
+      CacheContainerRegistryConfiguration configRegistry = new CacheContainerRegistryConfiguration();
+      configRegistry.setEntries(Arrays.asList(entry1, entry2));
+      configRegistry.setDefaultEntry(entry2);
+      configRegistry.setBaseJndiName("java:Infinispan");
+      
+      DefaultCacheContainerRegistry registry = new DefaultCacheContainerRegistry(factory, provider, context);
+      
+      EasyMock.expect(provider.getRegistryConfiguration()).andReturn(configRegistry);
+      
+      EasyMock.expect(factory.createCacheContainer(EasyMock.capture(capturedConfiguration), EasyMock.eq(Collections.singletonMap("legacy-other-cache", "other-cache")))).andReturn(otherCacheManager);
+      
+      context.bind("java:other", otherCacheManager);
+
+      EasyMock.expect(factory.createCacheContainer(EasyMock.capture(capturedConfiguration), EasyMock.eq(Collections.singletonMap("legacy-default-cache", "default-cache")))).andReturn(defaultCacheManager);
+      EasyMock.expect(context.composeName("default", "java:Infinispan")).andReturn("java:Infinispan/default");
+      
+      context.bind("java:Infinispan/default", defaultCacheManager);
+
+      EasyMock.replay(factory, provider, context, defaultCacheManager, otherCacheManager);
+      
+      registry.start();
+      
+      EasyMock.verify(factory, provider, context, defaultCacheManager, otherCacheManager);
+      
+      Set<String> names = registry.getCacheContainers();
+      Assert.assertEquals(2, names.size());
+      Assert.assertTrue(names.contains("default"));
+      Assert.assertTrue(names.contains("other"));
+      
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer(null));
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer("default"));
+      Assert.assertSame(defaultCacheManager, registry.getCacheContainer("unknown"));
+      Assert.assertSame(otherCacheManager, registry.getCacheContainer("other"));
+
+      List<CacheContainerConfiguration> configurations = capturedConfiguration.getValues();
+      Assert.assertEquals(2, configurations.size());
+      
+      for (CacheContainerConfiguration configuration: configurations)
+      {
+         Assert.assertSame(config.parseGlobalConfiguration(), configuration.getGlobalConfiguration());
+         Assert.assertSame(config.parseDefaultConfiguration(), configuration.getDefaultConfiguration());
+         Map<String, Configuration> namedConfigurations = config.parseNamedConfigurations();
+         Collection<Configuration> configs = configuration.getConfigurations();
+         Assert.assertEquals(namedConfigurations.size(), configs.size());
+         for (Configuration c: configs)
+         {
+            Assert.assertSame(namedConfigurations.get(c.getName()), c);
+         }
+      }
+      
+      EasyMock.reset(factory, provider, context, defaultCacheManager, otherCacheManager);
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SimpleCacheManagerRegistryConfigurationSourceTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SimpleCacheManagerRegistryConfigurationSourceTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SimpleCacheManagerRegistryConfigurationSourceTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,17 @@
+package org.jboss.ha.ispn.config;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SimpleCacheManagerRegistryConfigurationSourceTest
+{
+   @Test
+   public void test() throws Exception
+   {
+      CacheContainerRegistryConfiguration configuration = new CacheContainerRegistryConfiguration();
+      
+      CacheContainerRegistryConfigurationSource source = new SimpleCacheContainerRegistryConfigurationSource(configuration);
+      
+      Assert.assertSame(configuration, source.getRegistryConfiguration());
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SingleCacheManagerRegistryConfigurationSourceTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SingleCacheManagerRegistryConfigurationSourceTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/SingleCacheManagerRegistryConfigurationSourceTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,56 @@
+package org.jboss.ha.ispn.config;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SingleCacheManagerRegistryConfigurationSourceTest
+{
+   @Test
+   public void testDefault() throws Exception
+   {
+      CacheContainerRegistryConfigurationSource source = new SingleCacheContainerRegistryConfigurationSource("config-samples/minimal.xml");
+      
+      CacheContainerRegistryConfiguration configuration = source.getRegistryConfiguration();
+      
+      Assert.assertEquals("java:CacheManager", configuration.getBaseJndiName());
+      
+      List<CacheContainerRegistryConfigurationEntry> entries = configuration.getEntries();
+      
+      Assert.assertEquals(1, entries.size());
+      
+      CacheContainerRegistryConfigurationEntry entry = entries.get(0);
+      
+      Assert.assertSame(entry, configuration.getDefaultEntry());
+      
+      Assert.assertEquals("default", entry.getId());
+      Assert.assertNull(entry.getJndiName());
+      Assert.assertEquals(0, entry.getConfiguration().parseNamedConfigurations().size());
+   }
+   
+   @Test
+   public void testCustom() throws Exception
+   {
+      SingleCacheContainerRegistryConfigurationSource source = new SingleCacheContainerRegistryConfigurationSource("config-samples/minimal.xml");
+
+      source.setId("custom");
+      source.setJndiName("java:SingleCacheManager");
+      
+      CacheContainerRegistryConfiguration configuration = source.getRegistryConfiguration();
+      
+      Assert.assertEquals("java:CacheManager", configuration.getBaseJndiName());
+      
+      List<CacheContainerRegistryConfigurationEntry> entries = configuration.getEntries();
+      
+      Assert.assertEquals(1, entries.size());
+      
+      CacheContainerRegistryConfigurationEntry entry = entries.get(0);
+      
+      Assert.assertSame(entry, configuration.getDefaultEntry());
+      
+      Assert.assertEquals("custom", entry.getId());
+      Assert.assertEquals("java:SingleCacheManager", entry.getJndiName());
+      Assert.assertEquals(0, entry.getConfiguration().parseNamedConfigurations().size());
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolverTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolverTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/NamespaceResourceResolverTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,70 @@
+package org.jboss.ha.ispn.config.xml;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+
+public class NamespaceResourceResolverTest
+{
+   @Test
+   public void test() throws IOException
+   {
+      File file = File.createTempFile("test", "test");
+      file.deleteOnExit();
+      
+      URL url = file.toURI().toURL();
+      String type = "my-type";
+      String namespace = "urn:my:namespace:1.0";
+      String publicId = "my-public-id";
+      String systemId = "my-system-id";
+      String baseURI = "my-base-uri";
+      
+      LSResourceResolver resolver = new NamespaceResourceResolver(Collections.singletonMap(type, Collections.singletonMap(namespace, url)));
+      
+      LSInput result = resolver.resolveResource("some-type", "namespace-uri", publicId, systemId, baseURI);
+      
+      Assert.assertNull(result.getByteStream());
+      Assert.assertNull(result.getCharacterStream());
+      Assert.assertNull(result.getStringData());
+      Assert.assertFalse(result.getCertifiedText());
+      Assert.assertSame(publicId, result.getPublicId());
+      Assert.assertSame(systemId, result.getSystemId());
+      Assert.assertSame(baseURI, result.getBaseURI());
+      
+      result = resolver.resolveResource(type, "namespace-uri", publicId, systemId, baseURI);
+      
+      Assert.assertNull(result.getByteStream());
+      Assert.assertNull(result.getCharacterStream());
+      Assert.assertNull(result.getStringData());
+      Assert.assertFalse(result.getCertifiedText());
+      Assert.assertSame(publicId, result.getPublicId());
+      Assert.assertSame(systemId, result.getSystemId());
+      Assert.assertSame(baseURI, result.getBaseURI());
+      
+      result = resolver.resolveResource("some-type", namespace, publicId, systemId, baseURI);
+      
+      Assert.assertNull(result.getByteStream());
+      Assert.assertNull(result.getCharacterStream());
+      Assert.assertNull(result.getStringData());
+      Assert.assertFalse(result.getCertifiedText());
+      Assert.assertSame(publicId, result.getPublicId());
+      Assert.assertSame(systemId, result.getSystemId());
+      Assert.assertSame(baseURI, result.getBaseURI());
+      
+      result = resolver.resolveResource(type, namespace, publicId, systemId, baseURI);
+      
+      Assert.assertNull(result.getByteStream());
+      Assert.assertNull(result.getCharacterStream());
+      Assert.assertNull(result.getStringData());
+      Assert.assertFalse(result.getCertifiedText());
+      Assert.assertSame(publicId, result.getPublicId());
+      Assert.assertEquals(url.toString(), result.getSystemId());
+      Assert.assertSame(baseURI, result.getBaseURI());
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/XMLCacheManagerRegistryConfigurationSourceTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/XMLCacheManagerRegistryConfigurationSourceTest.java	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/config/xml/XMLCacheManagerRegistryConfigurationSourceTest.java	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,81 @@
+package org.jboss.ha.ispn.config.xml;
+
+import java.util.List;
+
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfiguration;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationEntry;
+import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class XMLCacheManagerRegistryConfigurationSourceTest
+{
+   @Test
+   public void testDefault() throws Exception
+   {
+      CacheContainerRegistryConfigurationSource provider = new XMLCacheContainerRegistryConfigurationSource();
+      
+      CacheContainerRegistryConfiguration configuration = provider.getRegistryConfiguration();
+      
+      Assert.assertEquals("java:CacheManager", configuration.getBaseJndiName());
+      Assert.assertNull(configuration.getDefaultEntry());
+      
+      List<CacheContainerRegistryConfigurationEntry> entries = configuration.getEntries();
+      
+      Assert.assertEquals(1, entries.size());
+      
+      CacheContainerRegistryConfigurationEntry entry = entries.get(0);
+      
+      Assert.assertEquals("default", entry.getId());
+      Assert.assertNull(entry.getJndiName());
+      Assert.assertEquals(7, entry.getConfiguration().parseNamedConfigurations().size());
+   }
+   
+   @Test
+   public void testMultiple() throws Exception
+   {
+      CacheContainerRegistryConfigurationSource provider = new XMLCacheContainerRegistryConfigurationSource("infinispan-configs-multiple.xml");
+      
+      CacheContainerRegistryConfiguration registry = provider.getRegistryConfiguration();
+      
+      Assert.assertEquals("java:CacheContainer", registry.getBaseJndiName());
+      
+      List<CacheContainerRegistryConfigurationEntry> entries = registry.getEntries();
+      
+      Assert.assertEquals(3, entries.size());
+      
+      CacheContainerRegistryConfigurationEntry entry = entries.get(0);
+      
+      Assert.assertEquals("manager0", entry.getId());
+      Assert.assertNull(entry.getJndiName());
+      Assert.assertNotSame(entry, registry.getDefaultEntry());
+      Assert.assertEquals(0, entry.getConfiguration().parseNamedConfigurations().size());
+      Assert.assertNull(entry.getAliases());
+      
+      entry = entries.get(1);
+      
+      Assert.assertEquals("manager1", entry.getId());
+      Assert.assertNull(entry.getJndiName());
+      Assert.assertSame(entry, registry.getDefaultEntry());
+      Assert.assertEquals(0, entry.getConfiguration().parseNamedConfigurations().size());
+      Assert.assertNotNull(entry.getAliases());
+      Assert.assertEquals(2, entry.getAliases().size());
+      Assert.assertEquals("alias1", entry.getAliases().get(0).getName());
+      Assert.assertEquals("default", entry.getAliases().get(0).getTarget());
+      Assert.assertEquals("alias2", entry.getAliases().get(1).getName());
+      Assert.assertEquals("default", entry.getAliases().get(1).getTarget());
+      
+      entry = entries.get(2);
+      
+      Assert.assertEquals("manager2", entry.getId());
+      Assert.assertEquals("java:CacheManager", entry.getJndiName());
+      Assert.assertNotSame(entry, registry.getDefaultEntry());
+      Assert.assertEquals(0, entry.getConfiguration().parseNamedConfigurations().size());
+      Assert.assertNotNull(entry.getAliases());
+      Assert.assertEquals(2, entry.getAliases().size());
+      Assert.assertEquals("alias1", entry.getAliases().get(0).getName());
+      Assert.assertEquals("default1", entry.getAliases().get(0).getTarget());
+      Assert.assertEquals("alias2", entry.getAliases().get(1).getName());
+      Assert.assertEquals("default2", entry.getAliases().get(1).getTarget());
+   }
+}

Added: projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs-multiple.xml
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs-multiple.xml	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs-multiple.xml	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<infinispan-configs default="manager1" base-jndi-name="java:CacheContainer" xmlns="urn:jboss:infinispan-configs:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:infinispan-configs:1.0 ../../src/main/resources/infinispan-configs.xsd">
+  <infinispan-config name="manager0">
+    <infinispan xmlns="urn:infinispan:config:4.0"/>
+  </infinispan-config>
+  <infinispan-config name="manager1">
+    <alias name="alias1">default</alias>
+    <alias name="alias2">default</alias>
+    <infinispan xmlns="urn:infinispan:config:4.0"/>
+  </infinispan-config>
+  <infinispan-config name="manager2" jndi-name="java:CacheManager">
+    <alias name="alias1">default1</alias>
+    <alias name="alias2">default2</alias>
+    <infinispan xmlns="urn:infinispan:config:4.0"/>
+  </infinispan-config>
+</infinispan-configs>
\ No newline at end of file

Added: projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs.xml
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs.xml	                        (rev 0)
+++ projects/cluster/ha-server-ispn/trunk/src/test/resources/infinispan-configs.xml	2010-07-09 20:10:10 UTC (rev 106539)
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<infinispan-configs xmlns="urn:jboss:infinispan-configs:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:infinispan-configs:1.0 ../../src/main/resources/infinispan-configs.xsd">
+  <infinispan-config name="default">
+     <!-- *************************** -->
+     <!-- System-wide global settings -->
+     <!-- *************************** -->
+     <infinispan xmlns="urn:infinispan:config:4.0">
+
+       <global>
+
+          <!-- Note that if these are left blank, defaults are used.  See the user guide for what these defaults are -->
+          <asyncListenerExecutor factory="org.infinispan.executors.DefaultExecutorFactory">
+             <properties>
+              <property name="maxThreads" value="5"/>
+              <property name="threadNamePrefix" value="AsyncListenerThread"/>
+             </properties>
+          </asyncListenerExecutor>
+    
+          <asyncTransportExecutor factory="org.infinispan.executors.DefaultExecutorFactory">
+             <properties>
+              <property name="maxThreads" value="25"/>
+              <property name="threadNamePrefix" value="AsyncSerializationThread"/>
+             </properties>
+          </asyncTransportExecutor>
+    
+          <evictionScheduledExecutor factory="org.infinispan.executors.DefaultScheduledExecutorFactory">
+             <properties>
+              <property name="threadNamePrefix" value="EvictionThread"/>
+             </properties>
+          </evictionScheduledExecutor>
+    
+          <replicationQueueScheduledExecutor factory="org.infinispan.executors.DefaultScheduledExecutorFactory">
+             <properties>
+              <property name="threadNamePrefix" value="ReplicationQueueThread"/>
+             </properties>
+          </replicationQueueScheduledExecutor>
+    
+          <globalJmxStatistics enabled="true" jmxDomain="infinispan"/>
+    
+          <!--
+             If the transport is omitted, there is no way to create distributed or clustered caches.
+             There is no added cost to defining a transport but not creating a cache that uses one, since the transport
+             is created and initialized lazily.
+          -->
+          <transport clusterName="infinispan-cluster" distributedSyncTimeout="50000" nodeName="Jalapeno"/>
+             <!-- Note that the JGroups transport uses sensible defaults if no configuration property is defined. -->
+             <!-- See the JGroupsTransport javadocs for more flags -->
+    
+          <!-- Again, sensible defaults are used here if this is omitted.  -->
+          <serialization marshallerClass="org.infinispan.marshall.VersionAwareMarshaller" version="1.0"/>
+    
+          <!--
+             Used to register JVM shutdown hooks.
+             hookBehavior: DEFAULT, REGISTER, DONT_REGISTER
+          -->
+          <shutdown hookBehavior="DEFAULT"/>
+       </global>
+    
+       <!-- *************************** -->
+       <!-- Default "template" settings -->
+       <!-- *************************** -->
+       <!-- this is used as a "template" configuration for all caches in the system. -->
+       <default xmlns="urn:infinispan:config:4.0">
+          <!--
+             isolation levels supported: READ_COMMITTED and REPEATABLE_READ
+          -->
+          <locking
+                isolationLevel="REPEATABLE_READ"
+                lockAcquisitionTimeout="20000"
+                writeSkewCheck="false"
+                concurrencyLevel="500"
+                useLockStriping="true"
+                />
+    
+          <!--
+          Used to register a transaction manager and participate in ongoing transactions.
+          -->
+          <transaction
+                transactionManagerLookupClass="org.infinispan.transaction.lookup.GenericTransactionManagerLookup"
+                syncRollbackPhase="false"
+                syncCommitPhase="false"
+                useEagerLocking="false"/>
+    
+          <!--
+          Used to register JMX statistics in any available MBean server
+          -->
+          <jmxStatistics enabled="false"/>
+    
+          <lazyDeserialization enabled="false"/>
+    
+          <!--
+             Used to enable invocation batching and allow the use of Cache.startBatch()/endBatch() methods.
+          -->
+          <invocationBatching enabled="false"/>
+    
+          <!--
+             This element specifies that the cache is clustered.
+             modes supported: distribution (d), replication (r) or invalidation (i).
+          -->
+          <clustering mode="replication">
+    
+             <!--
+                Defines whether to retrieve state on startup
+             -->
+             <stateRetrieval timeout="20000" fetchInMemoryState="false"/>
+    
+             <!--
+                Network calls are synchronous.
+             -->
+             <sync replTimeout="20000"/>
+             <!--
+                Uncomment this for async replication.
+             -->
+             <!--<async useReplQueue="true" replQueueInterval="10000" replQueueMaxElements="500"/>-->
+          </clustering>
+    
+       </default>
+    
+       <!-- ************************************** -->
+       <!-- Individually configured "named" caches -->
+       <!-- ************************************** -->
+    
+       <namedCache name="asyncCache">
+          <clustering mode="replication">
+             <async asyncMarshalling="true"/>
+          </clustering>
+       </namedCache>
+    
+       <!-- Note that any of the elements appearing in a namedCache section can also appear in the default section as a template. -->
+       <namedCache name="evictionCache">
+    
+          <!--
+             Eviction configuration.  WakeupInterval defines how often the eviction thread runs, in milliseconds.  0 means
+             the eviction thread will never run.  A separate executor is used for eviction in each cache.
+          -->
+          <eviction wakeUpInterval="500" maxEntries="5000" strategy="FIFO"  threadPolicy="PIGGYBACK"/>
+          <expiration lifespan="60000" maxIdle="1000"/>
+       </namedCache>
+    
+    
+       <namedCache name="persistentCache">
+          <!--
+                Cache loaders.
+    
+                If passivation is enabled, state is offloaded to the cache loaders ONLY when evicted.  Similarly, when the state
+                is accessed again, it is removed from the cache loaderold and loaded into memory.
+    
+                Otherwise, state is always maintained in the cache loaderold as well as in memory.
+    
+                Set 'shared' to true if all instances in the cluster use the same cache loaderold instance, e.g., are talking to the
+                same database.
+    
+                If "preload" is true, all keys are loaded from the cache loaderold into memory upon starting the cache.
+             -->
+          <loaders passivation="false" shared="false" preload="true">
+    
+             <!--
+                We can have multiple cache loaders, which get chained
+             -->
+             <loader class="org.infinispan.loaders.file.FileCacheStore" fetchPersistentState="true"
+                     ignoreModifications="true" purgeOnStartup="true">
+    
+                <!-- See the documentation for more configuration examples and flags. -->
+                <properties>
+                   <property name="location" value="${java.io.tmpdir}"/>
+                </properties>
+                <singletonStore enabled="true" pushStateWhenCoordinator="true" pushStateTimeout="20000"/>
+                <async enabled="true" flushLockTimeout="15000" threadPoolSize="5"/>
+             </loader>
+          </loaders>
+    
+          <deadlockDetection enabled="true" spinDuration="1000"/>
+    
+       </namedCache>
+    
+       <namedCache name="distributedCache">
+          <clustering mode="distribution">
+             <sync/>
+             <!--
+                num owners: number of owners for each key.  The larger this number is, the safer your data will be, but the
+                            slower the cluster will be.
+    
+                rehashRpcTimeout: timeout used for RPC calls relating to rehashing.  This defaults to 600000 (10 minutes).
+             -->
+             <hash numOwners="3" rehashWait="120000" rehashRpcTimeout="600000"/>
+             <l1 enabled="true" lifespan="600000"/>
+          </clustering>
+       </namedCache>
+    
+       <namedCache name="withReplicatinQueue">
+          <clustering>
+             <async useReplQueue="true" replQueueInterval="100" replQueueMaxElements="200"/>
+          </clustering>
+       </namedCache>
+    
+       <namedCache name="lockPerEntry">
+          <locking useLockStriping="false" />
+       </namedCache>
+    
+       <namedCache name="cacheWithCustomInterceptors">
+          <!--
+          Define custom interceptors.  All custom interceptors need to extend org.jboss.cache.interceptors.base.CommandInterceptor
+          -->
+          <!--
+          <customInterceptors>
+             <interceptor position="first" class="com.mycompany.CustomInterceptor1">
+                <property name="com.mycompany.attributeOne" value="value1" />
+                <property name="com.mycompany.attributeTwo" value="value2" />
+             </interceptor>
+             <interceptor position="last" class="com.mycompany.CustomInterceptor2"/>
+             <interceptor index="3" class="com.mycompany.CustomInterceptor1"/>
+             <interceptor before="org.infinispanpan.interceptors.CallInterceptor" class="com.mycompany.CustomInterceptor2"/>
+             <interceptor after="org.infinispanpan.interceptors.CallInterceptor" class="com.mycompany.CustomInterceptor1"/>
+          </customInterceptors>
+          -->
+       </namedCache>
+    </infinispan>
+  </infinispan-config>
+</infinispan-configs>
\ No newline at end of file



More information about the jboss-cvs-commits mailing list