<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Congrats on your first contribution, Christophe! The first of many, I hope.<br><div><br><div>Begin forwarded message:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" color="#000000" style="font: 12.0px Helvetica; color: #000000"><b>From: </b></font><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><a href="mailto:infinispan-commits@lists.jboss.org">infinispan-commits@lists.jboss.org</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" color="#000000" style="font: 12.0px Helvetica; color: #000000"><b>Date: </b></font><font face="Helvetica" size="3" style="font: 12.0px Helvetica">9 June 2009 22:29:03 BST</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" color="#000000" style="font: 12.0px Helvetica; color: #000000"><b>To: </b></font><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><a href="mailto:infinispan-commits@lists.jboss.org">infinispan-commits@lists.jboss.org</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" color="#000000" style="font: 12.0px Helvetica; color: #000000"><b>Subject: </b></font><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><b>[infinispan-commits] Infinispan SVN: r420 - in trunk/core/src: main/resources/xslt and 2 other directories.</b></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" color="#000000" style="font: 12.0px Helvetica; color: #000000"><b>Reply-To: </b></font><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><a href="mailto:infinispan-commits@lists.jboss.org">infinispan-commits@lists.jboss.org</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> </div><div>Author: chivert<br>Date: 2009-06-09 17:29:03 -0400 (Tue, 09 Jun 2009)<br>New Revision: 420<br><br>Added:<br> trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt<br> trunk/core/src/test/resources/configs/ehcache16/<br> trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml<br> trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd<br>Modified:<br> trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java<br>Log:<br>[ISPN-56] (Create migration script for EHCache) Adding style sheet for Ehcache configuration.<br>Changing ConfigFilesConvertor to use this stylesheet. <br>Adding Ehcache configuration examples and xsd for unit test. The unit test is not included in this change list though.<br><br><br>Modified: trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java<br>===================================================================<br>--- trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java<span class="Apple-tab-span" style="white-space:pre">        </span>2009-06-09 15:55:01 UTC (rev 419)<br>+++ trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java<span class="Apple-tab-span" style="white-space:pre">        </span>2009-06-09 21:29:03 UTC (rev 420)<br>@@ -53,9 +53,9 @@<br> */<br> public class ConfigFilesConvertor {<br><br>-<br> private static final String JBOSS_CACHE3X = "JBossCache3x";<br>- public static final String[] SUPPORTED_FORMATS = {JBOSS_CACHE3X};<br>+ private static final String EHCACHE_CACHE16X = "Ehcache16x";<br>+ public static final String[] SUPPORTED_FORMATS = {JBOSS_CACHE3X, EHCACHE_CACHE16X};<br><br> public void parse(InputStream is, OutputStream os, String xsltFile) throws Exception {<br> InputStream xsltInStream = new FileLookup().lookupFile(xsltFile);<br>@@ -136,6 +136,8 @@<br><br> if (type.equals(JBOSS_CACHE3X)) {<br> transformFromJbossCache3x(sourceName, destinationName);<br>+ } else if (type.equals(EHCACHE_CACHE16X)) {<br>+ transformFromEhcache16x(sourceName, destinationName);<br> }<br><br> System.out.println("---");<br>@@ -143,6 +145,7 @@<br> System.out.println("---");<br> }<br><br>+<br> private static void mustExist(String sourceName, String what) {<br> if (sourceName == null) {<br> System.err.println("Missing '" + what + "', cannot proceed");<br>@@ -182,6 +185,28 @@<br> }<br> }<br><br>+ private static void transformFromEhcache16x(String sourceName, String destinationName) throws Exception {<br>+ File oldConfig = new File(sourceName);<br>+ if (!oldConfig.exists()) {<br>+ System.err.println("File specified as input ('" + sourceName + ") does not exist.");<br>+ System.exit(1);<br>+ }<br>+ ConfigFilesConvertor convertor = new ConfigFilesConvertor();<br>+ FileInputStream is = new FileInputStream(oldConfig);<br>+ File destination = new File(destinationName);<br>+ if (!destination.exists()) {<br>+ destination.createNewFile();<br>+ }<br>+ <br>+ FileOutputStream fos = new FileOutputStream(destinationName);<br>+ try {<br>+ convertor.parse(is, fos, "xslt/ehcache16x2infinispan4x.xslt");<br>+ } finally {<br>+ fos.close();<br>+ is.close();<br>+ }<br>+ }<br>+<br> private Transformer getTransformer(InputStream xsltInStream) throws TransformerConfigurationException {<br> TransformerFactory tFactory = TransformerFactory.newInstance();<br> StreamSource stylesource = new StreamSource(xsltInStream);<br><br>Added: trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt<br>===================================================================<br>--- trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt<span class="Apple-tab-span" style="white-space:pre">        </span> (rev 0)<br>+++ trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt<span class="Apple-tab-span" style="white-space:pre">        </span>2009-06-09 21:29:03 UTC (rev 420)<br>@@ -0,0 +1,145 @@<br>+<?xml version="1.0" encoding="UTF-8"?><br>+<br>+<xsl:stylesheet xmlns="urn:infinispan:config:4.0" xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>" version="1.0"><br>+ <xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="no"/><br>+ <xsl:template match="/ehcache"><br>+ <xsl:comment><br>+ This XSL stylesheet is used to convert an Ehcache 1.6.x configuration into an Infinispan 4.0.x configuration.<br>+ Note that Infinispan supports JGroups only, caches are migrated to using JGroups.<br>+ Peer discovery will also be using JGroups. Eviction policies are translated to LRU, FIFO or NONE.<br>+ </xsl:comment><br>+ <xsl:element name="infinispan"><br>+<br>+ <xsl:element name="global"><br>+ <xsl:element name="asyncListenerExecutor"><br>+ <xsl:attribute name="factory">org.infinispan.executors.DefaultExecutorFactory</xsl:attribute><br>+ <property name="threadNamePrefix" value="AsyncListenerThread"/><br>+ </xsl:element><br>+<br>+ <xsl:element name="asyncSerializationExecutor"><br>+ <xsl:attribute name="factory">org.infinispan.executors.DefaultExecutorFactory</xsl:attribute><br>+ <property name="threadNamePrefix" value="AsyncSerializationThread"/><br>+ </xsl:element><br>+<br>+ <evictionScheduledExecutor factory="org.infinispan.executors.DefaultScheduledExecutorFactory"><br>+ <property name="threadNamePrefix" value="EvictionThread"/><br>+ </evictionScheduledExecutor><br>+<br>+ <replicationQueueScheduledExecutor factory="org.infinispan.executors.DefaultScheduledExecutorFactory"><br>+ <property name="threadNamePrefix" value="ReplicationQueueThread"/><br>+ </replicationQueueScheduledExecutor><br>+<br>+ <xsl:element name="globalJmxStatistics"><br>+ <xsl:attribute name="jmxDomain">infinispan</xsl:attribute><br>+ <xsl:attribute name="enabled"><br>+ <xsl:text>true</xsl:text><br>+ </xsl:attribute><br>+ </xsl:element><br>+<br>+ <xsl:element name="shutdown"><br>+ <xsl:attribute name="hookBehavior"><br>+ <xsl:text>DEFAULT</xsl:text><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:element><br>+<br>+ <xsl:element name="default"><br>+ <xsl:if test="defaultCache[@memoryStoreEvictionPolicy]"><br>+ <xsl:if test="contains(defaultCache[@memoryStoreEvictionPolicy], 'LRU')"><br>+ <xsl:element name="eviction"><br>+ <xsl:attribute name="strategy"><br>+ <xsl:value-of select="defaultCache/@memoryStoreEvictionPolicy"/><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:if><br>+ <xsl:if test="contains(defaultCache[@memoryStoreEvictionPolicy], 'FIFO')"><br>+ <xsl:element name="eviction"><br>+ <xsl:attribute name="strategy"><br>+ <xsl:value-of select="defaultCache/@memoryStoreEvictionPolicy"/><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:if><br>+ <xsl:if test="contains(defaultCache[@memoryStoreEvictionPolicy], 'LFU')"><br>+ <xsl:message terminate="no">WARNING!!! Infinispan does not support LFU eviction. Using LRU instead.<br>+ </xsl:message><br>+ <xsl:element name="eviction"><br>+ <xsl:attribute name="strategy"><br>+ <xsl:text>LRU</xsl:text><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:if><br>+ </xsl:if><br>+<br>+ </xsl:element><br>+ <xsl:for-each select="cache"><br>+ <xsl:element name="namedCache"><br>+ <xsl:attribute name="name"><br>+ <xsl:value-of select="@name"/><br>+ </xsl:attribute><br>+ <xsl:element name="eviction"><br>+ <xsl:attribute name="strategy"><br>+ <xsl:choose><br>+ <xsl:when test="contains(@memoryStoreEvictionPolicy, 'LRU')"><br>+ <xsl:text>LRU</xsl:text><br>+ </xsl:when><br>+ <xsl:otherwise><br>+ <xsl:choose><br>+ <xsl:when test="contains(@memoryStoreEvictionPolicy, 'FIFO')"><br>+ <xsl:text>FIFO</xsl:text><br>+ </xsl:when><br>+ <xsl:otherwise><br>+ <xsl:choose><br>+ <xsl:when test="contains(@memoryStoreEvictionPolicy, 'LFU')"><br>+ <xsl:text>LRU</xsl:text><br>+ </xsl:when><br>+ <xsl:otherwise><br>+ <xsl:text>NONE</xsl:text><br>+ </xsl:otherwise><br>+ </xsl:choose><br>+ </xsl:otherwise><br>+ </xsl:choose><br>+ </xsl:otherwise><br>+ </xsl:choose><br>+ </xsl:attribute><br>+ </xsl:element><br>+ <!-- <expiration lifespan="60000" maxIdle="1000" /> --><br>+ <xsl:element name="expiration"><br>+ <br>+ </xsl:element><br>+<br>+ <xsl:if test="cacheEventListenerFactory"><br>+ <xsl:element name="clustering"><br>+ <xsl:if test="cacheEventListenerFactory/@properties"><br>+ <xsl:attribute name="mode"><br>+ <!-- Replication, Invalidation, Distribution--><br>+ <xsl:text>distribution</xsl:text><br>+ </xsl:attribute><br>+ <!-- TODO remove spaces --><br>+ <xsl:choose><br>+ <xsl:when test="contains(cacheEventListenerFactory/@properties, 'replicateAsynchronously=false')"><br>+ <xsl:element name="sync"><br>+ <!-- replQueueInterval="100" replQueueMaxElements="200" ?? --><br>+ <xsl:attribute name="useReplQueue"><br>+ <xsl:text>true</xsl:text><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:when><br>+ <xsl:otherwise><br>+ <xsl:element name="async"><br>+ <!-- replQueueInterval="100" replQueueMaxElements="200" ?? --><br>+ <xsl:attribute name="useReplQueue"><br>+ <xsl:text>true</xsl:text><br>+ </xsl:attribute><br>+ </xsl:element><br>+ </xsl:otherwise><br>+ </xsl:choose><br>+ </xsl:if><br>+ </xsl:element><br>+ </xsl:if><br>+ </xsl:element><br>+ </xsl:for-each><br>+ </xsl:element><br>+<br>+<br>+ </xsl:template><br>+</xsl:stylesheet><br><br>Added: trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml<br>===================================================================<br>--- trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml<span class="Apple-tab-span" style="white-space:pre">        </span> (rev 0)<br>+++ trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml<span class="Apple-tab-span" style="white-space:pre">        </span>2009-06-09 21:29:03 UTC (rev 420)<br>@@ -0,0 +1,584 @@<br>+<?xml version="1.0" encoding="UTF-8"?><br>+<br>+<ehcache xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br>+ xsi:noNamespaceSchemaLocation="ehcache.xsd" ><br>+<br>+ <!--<br>+ CacheManager Configuration<br>+ ==========================<br>+ An ehcache.xml corresponds to a single CacheManager.<br>+<br>+ See instructions below or the ehcache schema (ehcache.xsd) on how to configure.<br>+<br>+ System property tokens can be specified in this file which are replaced when the configuration<br>+ is loaded. For example multicastGroupPort=${multicastGroupPort} can be replaced with the<br>+ System property either from an environment variable or a system property specified with a<br>+ command line switch such as -DmulticastGroupPort=4446.<br>+<br>+ DiskStore configuration<br>+ =======================<br>+<br>+ The diskStore element is optional. To turn off disk store path creation, comment out the diskStore<br>+ element below.<br>+<br>+ Configure it if you have overflowToDisk or diskPersistent enabled for any cache.<br>+<br>+ If it is not configured, and a cache is created which requires a disk store, a warning will be<br>+ issued and java.io.tmpdir will automatically be used.<br>+<br>+ diskStore has only one attribute - "path". It is the path to the directory where<br>+ .data and .index files will be created.<br>+<br>+ If the path is one of the following Java System Property it is replaced by its value in the<br>+ running VM. For backward compatibility these are not specified without being enclosed in the ${token}<br>+ replacement syntax.<br>+<br>+ The following properties are translated:<br>+ * user.home - User's home directory<br>+ * user.dir - User's current working directory<br>+ * java.io.tmpdir - Default temp file path<br>+ * ehcache.disk.store.dir - A system property you would normally specify on the command line<br>+ e.g. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...<br>+<br>+ Subdirectories can be specified below the property e.g. java.io.tmpdir/one<br>+ --><br>+ <diskStore path="java.io.tmpdir"/><br>+<br>+ <!--<br>+ CacheManagerEventListener<br>+ =========================<br>+ Specifies a CacheManagerEventListenerFactory which is notified when Caches are added<br>+ or removed from the CacheManager.<br>+<br>+ The attributes of CacheManagerEventListenerFactory are:<br>+ * class - a fully qualified factory class name<br>+ * properties - comma separated properties having meaning only to the factory.<br>+<br>+ Sets the fully qualified class name to be registered as the CacheManager event listener.<br>+<br>+ The events include:<br>+ * adding a Cache<br>+ * removing a Cache<br>+<br>+ Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility<br>+ of the implementer to safely handle the potential performance and thread safety issues<br>+ depending on what their listener is doing.<br>+<br>+ If no class is specified, no listener is created. There is no default.<br>+ --><br>+ <cacheManagerEventListenerFactory class="" properties=""/><br>+<br>+<br>+ <!--<br>+ CacheManagerPeerProvider<br>+ ========================<br>+ (For distributed operation)<br>+<br>+ Specifies a CacheManagerPeerProviderFactory which will be used to create a<br>+ CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.<br>+<br>+ One or more providers can be configured. The first one in the ehcache.xml is the default, which is used<br>+ for replication and bootstrapping.<br>+<br>+ The attributes of cacheManagerPeerProviderFactory are:<br>+ * class - a fully qualified factory class name<br>+ * properties - comma separated properties having meaning only to the factory.<br>+<br>+ Providers are available for RMI, JGroups and JMS as shown following.<br>+<br>+ RMICacheManagerPeerProvider<br>+ +++++++++++++++++++++++++++<br>+<br>+ Ehcache comes with a built-in RMI-based distribution system with two means of discovery of<br>+ CacheManager peers participating in the cluster:<br>+ * automatic, using a multicast group. This one automatically discovers peers and detects<br>+ changes such as peers entering and leaving the group<br>+ * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at<br>+ configuration time.<br>+<br>+ Configuring Automatic Discovery:<br>+ Automatic discovery is configured as per the following example:<br>+ <cacheManagerPeerProviderFactory<br>+ class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"<br>+ properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,<br>+ multicastGroupPort=4446, timeToLive=32"/><br>+<br>+ Valid properties are:<br>+ * peerDiscovery (mandatory) - specify "automatic"<br>+ * multicastGroupAddress (mandatory) - specify a valid multicast group address<br>+ * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat<br>+ traffic<br>+ * timeToLive - specify a value between 0 and 255 which determines how far the packets will<br>+ propagate.<br>+<br>+ By convention, the restrictions are:<br>+ 0 - the same host<br>+ 1 - the same subnet<br>+ 32 - the same site<br>+ 64 - the same region<br>+ 128 - the same continent<br>+ 255 - unrestricted<br>+<br>+ Configuring Manual Discovery:<br>+ Manual discovery is configured as per the following example:<br>+ <cacheManagerPeerProviderFactory class=<br>+ "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"<br>+ properties="peerDiscovery=manual,<br>+ rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1<br>+ | //server1:40000/sampleCache2|//server2:40000/sampleCache2"<br>+ propertySeparator="," /><br>+<br>+ Valid properties are:<br>+ * peerDiscovery (mandatory) - specify "manual"<br>+ * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form<br>+ //hostname:port<br>+<br>+ The hostname is the hostname of the remote CacheManager peer. The port is the listening<br>+ port of the RMICacheManagerPeerListener of the remote CacheManager peer.<br>+<br>+ JGroupsCacheManagerPeerProvider<br>+ +++++++++++++++++++++++++++++++<br>+ <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"<br>+ properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;<br>+ mcast_send_buf_size=150000;mcast_recv_buf_size=80000):<br>+ PING(timeout=2000;num_initial_members=6):<br>+ MERGE2(min_interval=5000;max_interval=10000):<br>+ FD_SOCK:VERIFY_SUSPECT(timeout=1500):<br>+ pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):<br>+ UNICAST(timeout=5000):<br>+ pbcast.STABLE(desired_avg_gossip=20000):<br>+ FRAG:<br>+ pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)"<br>+ propertySeparator="::"<br>+ /><br>+ The only property necessary is the connect String used by jgroups to configure itself. Refer to the Jgroups documentation for explanation<br>+ of all the protocols. The example above uses UDP multicast. If the connect property is not specified the default JGroups connection will be<br>+ used.<br>+<br>+<br>+ JMSCacheManagerPeerProviderFactory<br>+ ++++++++++++++++++++++++++++++++++<br>+ <cacheManagerPeerProviderFactory<br>+ class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"<br>+ properties="..."<br>+ propertySeparator=","<br>+ /><br>+<br>+ The JMS PeerProviderFactory uses JNDI to maintain message queue independence. Refer to the manual for full configuration<br>+ examples using ActiveMQ and Open Message Queue.<br>+<br>+ Valid properties are:<br>+ * initialContextFactoryName (mandatory) - the name of the factory used to create the message queue initial context.<br>+ * providerURL (mandatory) - the JNDI configuration information for the service provider to use.<br>+ * topicConnectionFactoryBindingName (mandatory) - the JNDI binding name for the TopicConnectionFactory<br>+ * topicBindingName (mandatory) - the JNDI binding name for the topic name<br>+ * getQueueBindingName (mandatory only if using jmsCacheLoader) - the JNDI binding name for the queue name<br>+ * securityPrincipalName - the JNDI java.naming.security.principal<br>+ * securityCredentials - the JNDI java.naming.security.credentials<br>+ * urlPkgPrefixes - the JNDI java.naming.factory.url.pkgs<br>+ * userName - the user name to use when creating the TopicConnection to the Message Queue<br>+ * password - the password to use when creating the TopicConnection to the Message Queue<br>+ * acknowledgementMode - the JMS Acknowledgement mode for both publisher and subscriber. The available choices are<br>+ AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE and SESSION_TRANSACTED. The default is AUTO_ACKNOWLEDGE.<br>+ --><br>+<br>+ <cacheManagerPeerProviderFactory<br>+ class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"<br>+ properties="peerDiscovery=automatic,<br>+ multicastGroupAddress=230.0.0.1,<br>+ multicastGroupPort=4446, timeToLive=1"<br>+ propertySeparator=","<br>+ /><br>+<br>+<br>+ <!--<br>+ CacheManagerPeerListener<br>+ ========================<br>+ (Enable for distributed operation)<br>+<br>+ Specifies a CacheManagerPeerListenerFactory which will be used to create a<br>+ CacheManagerPeerListener, which<br>+ listens for messages from cache replicators participating in the cluster.<br>+<br>+ The attributes of cacheManagerPeerListenerFactory are:<br>+ class - a fully qualified factory class name<br>+ properties - comma separated properties having meaning only to the factory.<br>+<br>+ Ehcache comes with a built-in RMI-based distribution system. The listener component is<br>+ RMICacheManagerPeerListener which is configured using<br>+ RMICacheManagerPeerListenerFactory. It is configured as per the following example:<br>+<br>+ <cacheManagerPeerListenerFactory<br>+ class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"<br>+ properties="hostName=fully_qualified_hostname_or_ip,<br>+ port=40001,<br>+ remoteObjectPort=40002,<br>+ socketTimeoutMillis=120000"<br>+ propertySeparator="," /><br>+<br>+ All properties are optional. They are:<br>+ * hostName - the hostName of the host the listener is running on. Specify<br>+ where the host is multihomed and you want to control the interface over which cluster<br>+ messages are received. Defaults to the host name of the default interface if not<br>+ specified.<br>+ * port - the port the RMI Registry listener listens on. This defaults to a free port if not specified.<br>+ * remoteObjectPort - the port number on which the remote objects bound in the registry receive calls.<br>+ This defaults to a free port if not specified.<br>+ * socketTimeoutMillis - the number of ms client sockets will stay open when sending<br>+ messages to the listener. This should be long enough for the slowest message.<br>+ If not specified it defaults to 120000ms.<br>+<br>+ --><br>+ <cacheManagerPeerListenerFactory<br>+ class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/><br>+<br>+<br>+ <!--<br>+ Cache configuration<br>+ ===================<br>+<br>+ The following attributes are required.<br>+<br>+ name:<br>+ Sets the name of the cache. This is used to identify the cache. It must be unique.<br>+<br>+ maxElementsInMemory:<br>+ Sets the maximum number of objects that will be created in memory<br>+<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>maxElementsOnDisk:<br>+ Sets the maximum number of objects that will be maintained in the DiskStore<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>The default value is zero, meaning unlimited.<br>+<br>+ eternal:<br>+ Sets whether elements are eternal. If eternal, timeouts are ignored and the<br>+ element is never expired.<br>+<br>+ overflowToDisk:<br>+ Sets whether elements can overflow to disk when the memory store<br>+ has reached the maxInMemory limit.<br>+<br>+ The following attributes and elements are optional.<br>+<br>+ timeToIdleSeconds:<br>+ Sets the time to idle for an element before it expires.<br>+ i.e. The maximum amount of time between accesses before an element expires<br>+ Is only used if the element is not eternal.<br>+ Optional attribute. A value of 0 means that an Element can idle for infinity.<br>+ The default value is 0.<br>+<br>+ timeToLiveSeconds:<br>+ Sets the time to live for an element before it expires.<br>+ i.e. The maximum time between creation time and when an element expires.<br>+ Is only used if the element is not eternal.<br>+ Optional attribute. A value of 0 means that and Element can live for infinity.<br>+ The default value is 0.<br>+<br>+ diskPersistent:<br>+ Whether the disk store persists between restarts of the Virtual Machine.<br>+ The default value is false.<br>+<br>+ diskExpiryThreadIntervalSeconds:<br>+ The number of seconds between runs of the disk expiry thread. The default value<br>+ is 120 seconds.<br>+<br>+ diskSpoolBufferSizeMB:<br>+ This is the size to allocate the DiskStore for a spool buffer. Writes are made<br>+ to this area and then asynchronously written to disk. The default size is 30MB.<br>+ Each spool buffer is used only by its cache. If you get OutOfMemory errors consider<br>+ lowering this value. To improve DiskStore performance consider increasing it. Trace level<br>+ logging in the DiskStore will show if put back ups are occurring.<br>+<br>+ memoryStoreEvictionPolicy:<br>+ Policy would be enforced upon reaching the maxElementsInMemory limit. Default<br>+ policy is Least Recently Used (specified as LRU). Other policies available -<br>+ First In First Out (specified as FIFO) and Less Frequently Used<br>+ (specified as LFU)<br>+<br>+ Cache elements can also contain sub elements which take the same format of a factory class<br>+ and properties. Defined sub-elements are:<br>+<br>+ * cacheEventListenerFactory - Enables registration of listeners for cache events, such as<br>+ put, remove, update, and expire.<br>+<br>+ * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader, which is called by a<br>+ cache on initialisation to prepopulate itself.<br>+<br>+ * cacheExtensionFactory - Specifies a CacheExtension, a generic mechansim to tie a class<br>+ which holds a reference to a cache to the cache lifecycle.<br>+<br>+ * cacheExceptionHandlerFactory - Specifies a CacheExceptionHandler, which is called when<br>+ cache exceptions occur.<br>+<br>+ * cacheLoaderFactory - Specifies a CacheLoader, which can be used both asynchronously and<br>+ synchronously to load objects into a cache. More than one cacheLoaderFactory element<br>+ can be added, in which case the loaders form a chain which are executed in order. If a<br>+ loader returns null, the next in chain is called.<br>+<br>+ RMI Cache Replication<br>+ +++++++++++++++++++++<br>+<br>+ Each cache that will be distributed needs to set a cache event listener which replicates<br>+ messages to the other CacheManager peers. For the built-in RMI implementation this is done<br>+ by adding a cacheEventListenerFactory element of type RMICacheReplicatorFactory to each<br>+ distributed cache's configuration as per the following example:<br>+<br>+ <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"<br>+ properties="replicateAsynchronously=true,<br>+ replicatePuts=true,<br>+ replicatePutsViaCopy=false,<br>+ replicateUpdates=true,<br>+ replicateUpdatesViaCopy=true,<br>+ replicateRemovals=true<br>+ asynchronousReplicationIntervalMillis=<number of milliseconds"<br>+ propertySeparator="," /><br>+<br>+ The RMICacheReplicatorFactory recognises the following properties:<br>+<br>+ * replicatePuts=true|false - whether new elements placed in a cache are<br>+ replicated to others. Defaults to true.<br>+<br>+ * replicatePutsViaCopy=true|false - whether the new elements are<br>+ copied to other caches (true), or whether a remove message is sent. Defaults to true.<br>+<br>+ * replicateUpdates=true|false - whether new elements which override an<br>+ element already existing with the same key are replicated. Defaults to true.<br>+<br>+ * replicateRemovals=true - whether element removals are replicated. Defaults to true.<br>+<br>+ * replicateAsynchronously=true | false - whether replications are<br>+ asynchronous (true) or synchronous (false). Defaults to true.<br>+<br>+ * replicateUpdatesViaCopy=true | false - whether the new elements are<br>+ copied to other caches (true), or whether a remove message is sent. Defaults to true.<br>+<br>+ * asynchronousReplicationIntervalMillis=<number of milliseconds> - The asynchronous<br>+ replicator runs at a set interval of milliseconds. The default is 1000. The minimum<br>+ is 10. This property is only applicable if replicateAsynchronously=true<br>+<br>+<br>+ JGroups Replication<br>+ +++++++++++++++++++<br>+<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>For the Jgroups replication this is done with:<br>+<span class="Apple-tab-span" style="white-space:pre">        </span><cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"<br>+ properties="replicateAsynchronously=true, replicatePuts=true,<br>+ <span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>replicateUpdates=true, replicateUpdatesViaCopy=false,<br>+ <span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"/><br>+ This listener supports the same properties as the RMICacheReplicationFactory.<br>+<br>+<br>+ JMS Replication<br>+ +++++++++++++++<br>+<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>For JMS-based replication this is done with:<br>+<span class="Apple-tab-span" style="white-space:pre">        </span><cacheEventListenerFactory<br>+ class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory"<br>+ properties="replicateAsynchronously=true,<br>+ replicatePuts=true,<br>+ replicateUpdates=true,<br>+ replicateUpdatesViaCopy=true,<br>+ replicateRemovals=true,<br>+ asynchronousReplicationIntervalMillis=1000"<br>+ propertySeparator=","/><br>+<br>+ This listener supports the same properties as the RMICacheReplicationFactory.<br>+<br>+ Cluster Bootstrapping<br>+ +++++++++++++++++++++<br>+ (RMI clusters only)<br>+<br>+ The RMIBootstrapCacheLoader bootstraps caches in clusters where RMICacheReplicators are<br>+ used. It is configured as per the following example:<br>+<br>+ <bootstrapCacheLoaderFactory<br>+ class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"<br>+ properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"<br>+ propertySeparator="," /><br>+<br>+ The RMIBootstrapCacheLoaderFactory recognises the following optional properties:<br>+<br>+ * bootstrapAsynchronously=true|false - whether the bootstrap happens in the background<br>+ after the cache has started. If false, bootstrapping must complete before the cache is<br>+ made available. The default value is true.<br>+<br>+ * maximumChunkSizeBytes=<integer> - Caches can potentially be very large, larger than the<br>+ memory limits of the VM. This property allows the bootstraper to fetched elements in<br>+ chunks. The default chunk size is 5000000 (5MB).<br>+<br>+<br>+ Cache Exception Handling<br>+<br>+ By default, most cache operations will propagate a runtime CacheException on failure. An<br>+ interceptor, using a dynamic proxy, may be configured so that a CacheExceptionHandler can<br>+ be configured to intercept Exceptions. Errors are not intercepted.<br>+<br>+ It is configured as per the following example:<br>+<br>+ <cacheExceptionHandlerFactory class="com.example.ExampleExceptionHandlerFactory"<br>+ properties="logLevel=FINE"/><br>+<br>+ Caches with ExceptionHandling configured are not of type Cache, but are of type Ehcache only,<br>+ and are not available using CacheManager.getCache(), but using CacheManager.getEhcache().<br>+<br>+<br>+ Cache Loader<br>+<br>+ A default CacheLoader may be set which loads objects into the cache through asynchronous and<br>+ synchronous methods on Cache. This is different to the bootstrap cache loader, which is used<br>+ only in distributed caching.<br>+<br>+ It is configured as per the following example:<br>+<br>+ <cacheLoaderFactory class="com.example.ExampleCacheLoaderFactory"<br>+ properties="type=int,startCounter=10"/><br>+<br>+ Cache Extension<br>+<br>+ CacheExtensions are a general purpose mechanism to allow generic extensions to a Cache.<br>+ CacheExtensions are tied into the Cache lifecycle.<br>+<br>+ CacheExtensions are created using the CacheExtensionFactory which has a<br>+ <code>createCacheCacheExtension()</code> method which takes as a parameter a<br>+ Cache and properties. It can thus call back into any public method on Cache, including, of<br>+ course, the load methods.<br>+<br>+ Extensions are added as per the following example:<br>+<br>+ <cacheExtensionFactory class="com.example.FileWatchingCacheRefresherExtensionFactory"<br>+ properties="refreshIntervalMillis=18000, loaderTimeout=3000,<br>+ flushPeriod=whatever, someOtherProperty=someValue ..."/><br>+<br>+ --><br>+<br>+<br>+ <!--<br>+ Mandatory Default Cache configuration. These settings will be applied to caches<br>+ created programmtically using CacheManager.add(String cacheName).<br>+<br>+ The defaultCache has an implicit name "default" which is a reserved cache name.<br>+ --><br>+ <defaultCache<br>+ maxElementsInMemory="10000"<br>+ eternal="false"<br>+ timeToIdleSeconds="120"<br>+ timeToLiveSeconds="120"<br>+ overflowToDisk="true"<br>+ diskSpoolBufferSizeMB="30"<br>+ maxElementsOnDisk="10000000"<br>+ diskPersistent="false"<br>+ diskExpiryThreadIntervalSeconds="120"<br>+ memoryStoreEvictionPolicy="LRU"<br>+ /><br>+<br>+ <!--<br>+ Sample caches. Following are some example caches. Remove these before use.<br>+ --><br>+<br>+ <!--<br>+ Sample cache named sampleCache1<br>+ This cache contains a maximum in memory of 10000 elements, and will expire<br>+ an element if it is idle for more than 5 minutes and lives for more than<br>+ 10 minutes.<br>+<br>+ If there are more than 10000 elements it will overflow to the<br>+ disk cache, which in this configuration will go to wherever java.io.tmp is<br>+ defined on your system. On a standard Linux system this will be /tmp"<br>+ --><br>+ <cache name="sampleCache1"<br>+ maxElementsInMemory="10000"<br>+ maxElementsOnDisk="1000"<br>+ eternal="false"<br>+ overflowToDisk="true"<br>+ diskSpoolBufferSizeMB="20"<br>+ timeToIdleSeconds="300"<br>+ timeToLiveSeconds="600"<br>+ memoryStoreEvictionPolicy="LFU"<br>+ /><br>+<br>+<br>+ <!--<br>+ Sample cache named sampleCache2<br>+ This cache has a maximum of 1000 elements in memory. There is no overflow to disk, so 1000<br>+ is also the maximum cache size. Note that when a cache is eternal, timeToLive and<br>+ timeToIdle are not used and do not need to be specified.<br>+ --><br>+ <cache name="sampleCache2"<br>+ maxElementsInMemory="1000"<br>+ eternal="true"<br>+ overflowToDisk="false"<br>+ memoryStoreEvictionPolicy="FIFO"<br>+ /><br>+<br>+<br>+ <!--<br>+ Sample cache named sampleCache3. This cache overflows to disk. The disk store is<br>+ persistent between cache and VM restarts. The disk expiry thread interval is set to 10<br>+ minutes, overriding the default of 2 minutes.<br>+ --><br>+<br>+ <cache name="sampleCache3"<br>+ maxElementsInMemory="500"<br>+ eternal="false"<br>+ overflowToDisk="true"<br>+ timeToIdleSeconds="300"<br>+ timeToLiveSeconds="600"<br>+ diskPersistent="true"<br>+ diskExpiryThreadIntervalSeconds="1"<br>+ memoryStoreEvictionPolicy="LFU"<br>+ /><br>+<br>+<br>+ <!--<br>+ Sample distributed cache named sampleDistributedCache1.<br>+ This cache replicates using defaults.<br>+ It also bootstraps from the cluster, using default properties.<br>+ --><br>+ <cache name="sampleDistributedCache1"<br>+ maxElementsInMemory="10"<br>+ eternal="false"<br>+ timeToIdleSeconds="100"<br>+ timeToLiveSeconds="100"<br>+ overflowToDisk="false"><br>+ <cacheEventListenerFactory<br>+ class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/><br>+ <bootstrapCacheLoaderFactory<br>+ class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/><br>+ </cache><br>+<br>+<br>+ <!--<br>+ Sample distributed cache named sampleDistributedCache2.<br>+ This cache replicates using specific properties.<br>+ It only replicates updates and does so synchronously via copy<br>+ --><br>+<br>+ <cache name="sampleDistributedCache2"<br>+ maxElementsInMemory="10"<br>+ eternal="false"<br>+ timeToIdleSeconds="100"<br>+ timeToLiveSeconds="100"<br>+ overflowToDisk="false"><br>+ <cacheEventListenerFactory<br>+ class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"<br>+ properties="replicateAsynchronously=false, replicatePuts=false,<br>+ replicatePutsViaCopy=false, replicateUpdates=true,<br>+ replicateUpdatesViaCopy=true, replicateRemovals=false"/><br>+ </cache><br>+<br>+ <!--<br>+ Sample distributed cache named sampleDistributedCache3.<br>+ This cache replicates using defaults except that the asynchronous replication<br>+ interval is set to 200ms.<br>+ --><br>+ <cache name="sampleDistributedCache3"<br>+ maxElementsInMemory="10"<br>+ eternal="false"<br>+ timeToIdleSeconds="100"<br>+ timeToLiveSeconds="100"<br>+ overflowToDisk="false"><br>+ <cacheEventListenerFactory<br>+ class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"<br>+ properties="asynchronousReplicationIntervalMillis=200"/><br>+ </cache><br>+<br>+</ehcache><br><br>Added: trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd<br>===================================================================<br>--- trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd<span class="Apple-tab-span" style="white-space:pre">        </span> (rev 0)<br>+++ trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd<span class="Apple-tab-span" style="white-space:pre">        </span>2009-06-09 21:29:03 UTC (rev 420)<br>@@ -0,0 +1,122 @@<br>+<xs:schema xmlns:xs="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" elementFormDefault="qualified" version="1.6"><br>+ <xs:element name="ehcache" ><br>+ <xs:complexType><br>+ <xs:sequence><br>+ <xs:element minOccurs="0" maxOccurs="1" ref="diskStore"/><br>+ <xs:element minOccurs="0" maxOccurs="1"<br>+ ref="cacheManagerEventListenerFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded"<br>+ ref="cacheManagerPeerProviderFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded"<br>+ ref="cacheManagerPeerListenerFactory"/><br>+ <xs:element ref="defaultCache"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cache"/><br>+ </xs:sequence><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="diskStore"><br>+ <xs:complexType><br>+ <xs:attribute name="path" use="optional" /><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheManagerEventListenerFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheManagerPeerProviderFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheManagerPeerListenerFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <!-- add clone support for addition of cacheExceptionHandler. Important! --><br>+ <xs:element name="defaultCache"><br>+ <xs:complexType><br>+ <xs:sequence><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/><br>+ </xs:sequence><br>+ <xs:attribute name="diskExpiryThreadIntervalSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="diskSpoolBufferSizeMB" use="optional" type="xs:integer"/><br>+ <xs:attribute name="diskPersistent" use="optional" type="xs:boolean"/><br>+ <xs:attribute name="eternal" use="required" type="xs:boolean"/><br>+ <xs:attribute name="maxElementsInMemory" use="required" type="xs:integer"/><br>+ <xs:attribute name="memoryStoreEvictionPolicy" use="optional" type="xs:string"/><br>+ <xs:attribute name="overflowToDisk" use="required" type="xs:boolean"/><br>+ <xs:attribute name="timeToIdleSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="timeToLiveSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="maxElementsOnDisk" use="optional" type="xs:integer"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cache"><br>+ <xs:complexType><br>+ <xs:sequence ><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/><br>+ <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/><br>+ </xs:sequence><br>+ <xs:attribute name="diskExpiryThreadIntervalSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="diskSpoolBufferSizeMB" use="optional" type="xs:integer"/><br>+ <xs:attribute name="diskPersistent" use="optional" type="xs:boolean"/><br>+ <xs:attribute name="eternal" use="required" type="xs:boolean"/><br>+ <xs:attribute name="maxElementsInMemory" use="required" type="xs:integer"/><br>+ <xs:attribute name="memoryStoreEvictionPolicy" use="optional" type="xs:string"/><br>+ <xs:attribute name="name" use="required" type="xs:string"/><br>+ <xs:attribute name="overflowToDisk" use="required" type="xs:boolean"/><br>+ <xs:attribute name="timeToIdleSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="timeToLiveSeconds" use="optional" type="xs:integer"/><br>+ <xs:attribute name="maxElementsOnDisk" use="optional" type="xs:integer"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheEventListenerFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="bootstrapCacheLoaderFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheExtensionFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheExceptionHandlerFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+ <xs:element name="cacheLoaderFactory"><br>+ <xs:complexType><br>+ <xs:attribute name="class" use="required"/><br>+ <xs:attribute name="properties" use="optional"/><br>+ <xs:attribute name="propertySeparator" use="optional"/><br>+ </xs:complexType><br>+ </xs:element><br>+</xs:schema><br><br>_______________________________________________<br>infinispan-commits mailing list<br><a href="mailto:infinispan-commits@lists.jboss.org">infinispan-commits@lists.jboss.org</a><br>https://lists.jboss.org/mailman/listinfo/infinispan-commits<br></div></blockquote></div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>--</div><div>Manik Surtani</div><div><a href="mailto:manik@jboss.org">manik@jboss.org</a></div><div>Lead, Infinispan</div><div>Lead, JBoss Cache</div><div><a href="http://www.infinispan.org">http://www.infinispan.org</a></div><div><a href="http://www.jbosscache.org">http://www.jbosscache.org</a></div><div><br></div></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"> </div><br></body></html>