You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2009/09/13 09:35:40 UTC

svn commit: r814274 [2/2] - in /camel/trunk: components/ components/camel-cache/ components/camel-cache/src/ components/camel-cache/src/main/ components/camel-cache/src/main/java/ components/camel-cache/src/main/java/org/ components/camel-cache/src/mai...

Added: camel/trunk/components/camel-cache/src/main/resources/ehcache.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/main/resources/ehcache.xml?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/main/resources/ehcache.xml (added)
+++ camel/trunk/components/camel-cache/src/main/resources/ehcache.xml Sun Sep 13 07:35:39 2009
@@ -0,0 +1,607 @@
+<?xml version="1.0" encoding="UTF-8"?>
+        
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="ehcache.xsd" >
+
+    <!--
+    CacheManager Configuration
+    ==========================
+    An ehcache.xml corresponds to a single CacheManager.
+    
+    See instructions below or the ehcache schema (ehcache.xsd) on how to configure.
+
+    System property tokens can be specified in this file which are replaced when the configuration
+    is loaded. For example multicastGroupPort=${multicastGroupPort} can be replaced with the
+    System property either from an environment variable or a system property specified with a
+    command line switch such as -DmulticastGroupPort=4446.
+
+    DiskStore configuration
+    =======================
+
+    The diskStore element is optional. To turn off disk store path creation, comment out the diskStore
+    element below.
+
+    Configure it if you have overflowToDisk or diskPersistent enabled for any cache.
+
+    If it is not configured, and a cache is created which requires a disk store, a warning will be
+     issued and java.io.tmpdir will automatically be used.
+
+    diskStore has only one attribute - "path". It is the path to the directory where
+    .data and .index files will be created.
+
+    If the path is one of the following Java System Property it is replaced by its value in the
+    running VM. For backward compatibility these are not specified without being enclosed in the ${token}
+    replacement syntax.
+
+    The following properties are translated:
+    * user.home - User's home directory
+    * user.dir - User's current working directory
+    * java.io.tmpdir - Default temp file path
+    * ehcache.disk.store.dir - A system property you would normally specify on the command line
+      e.g. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...
+
+    Subdirectories can be specified below the property e.g. java.io.tmpdir/one
+
+    -->
+    <diskStore path="java.io.tmpdir"/>
+
+    <!--
+    CacheManagerEventListener
+    =========================
+    Specifies a CacheManagerEventListenerFactory which is notified when Caches are added
+    or removed from the CacheManager.
+
+    The attributes of CacheManagerEventListenerFactory are:
+    * class - a fully qualified factory class name
+    * properties - comma separated properties having meaning only to the factory.
+
+    Sets the fully qualified class name to be registered as the CacheManager event listener.
+
+    The events include:
+    * adding a Cache
+    * removing a Cache
+
+    Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility
+    of the implementer to safely handle the potential performance and thread safety issues
+    depending on what their listener is doing.
+
+    If no class is specified, no listener is created. There is no default.
+    -->
+    <cacheManagerEventListenerFactory class="" properties=""/>
+
+
+    <!--
+    CacheManagerPeerProvider
+    ========================
+    (For distributed operation)
+
+    Specifies a CacheManagerPeerProviderFactory which will be used to create a
+    CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.
+
+    One or more providers can be configured. The first one in the ehcache.xml is the default, which is used
+    for replication and bootstrapping.
+
+    The attributes of cacheManagerPeerProviderFactory are:
+    * class - a fully qualified factory class name
+    * properties - comma separated properties having meaning only to the factory.
+
+    Providers are available for RMI, JGroups and JMS as shown following.
+
+    RMICacheManagerPeerProvider
+    +++++++++++++++++++++++++++
+
+    Ehcache comes with a built-in RMI-based distribution system with two means of discovery of
+    CacheManager peers participating in the cluster:
+    * automatic, using a multicast group. This one automatically discovers peers and detects
+      changes such as peers entering and leaving the group
+    * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at
+      configuration time.
+
+    Configuring Automatic Discovery:
+    Automatic discovery is configured as per the following example:
+    <cacheManagerPeerProviderFactory
+                        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
+                        properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
+                                    multicastGroupPort=4446, timeToLive=32"/>
+
+    Valid properties are:
+    * peerDiscovery (mandatory) - specify "automatic"
+    * multicastGroupAddress (mandatory) - specify a valid multicast group address
+    * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat
+      traffic
+    * timeToLive - specify a value between 0 and 255 which determines how far the packets will
+      propagate.
+
+      By convention, the restrictions are:
+      0   - the same host
+      1   - the same subnet
+      32  - the same site
+      64  - the same region
+      128 - the same continent
+      255 - unrestricted
+
+    Configuring Manual Discovery:
+    Manual discovery is configured as per the following example:
+    <cacheManagerPeerProviderFactory class=
+                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
+                          properties="peerDiscovery=manual,
+                          rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
+                          | //server1:40000/sampleCache2|//server2:40000/sampleCache2"
+                          propertySeparator="," />
+
+    Valid properties are:
+    * peerDiscovery (mandatory) - specify "manual"
+    * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form
+                            //hostname:port
+
+    The hostname is the hostname of the remote CacheManager peer. The port is the listening
+    port of the RMICacheManagerPeerListener of the remote CacheManager peer.
+    
+    JGroupsCacheManagerPeerProvider
+    +++++++++++++++++++++++++++++++
+    <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
+                                     properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;
+                                     mcast_send_buf_size=150000;mcast_recv_buf_size=80000):
+                                     PING(timeout=2000;num_initial_members=6):
+                                     MERGE2(min_interval=5000;max_interval=10000):
+                                     FD_SOCK:VERIFY_SUSPECT(timeout=1500):
+                                     pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):
+                                     UNICAST(timeout=5000):
+                                     pbcast.STABLE(desired_avg_gossip=20000):
+                                     FRAG:
+                                     pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)"
+                                     propertySeparator="::"
+            />
+     The only property necessary is the connect String used by jgroups to configure itself. Refer to the Jgroups documentation for explanation
+     of all the protocols. The example above uses UDP multicast. If the connect property is not specified the default JGroups connection will be
+     used.       
+
+
+    JMSCacheManagerPeerProviderFactory
+    ++++++++++++++++++++++++++++++++++
+    <cacheManagerPeerProviderFactory
+            class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
+            properties="..."
+            propertySeparator=","
+            />
+
+    The JMS PeerProviderFactory uses JNDI to maintain message queue independence. Refer to the manual for full configuration
+    examples using ActiveMQ and Open Message Queue.
+
+    Valid properties are:
+    * initialContextFactoryName (mandatory) - the name of the factory used to create the message queue initial context.
+    * providerURL (mandatory) - the JNDI configuration information for the service provider to use.
+    * topicConnectionFactoryBindingName (mandatory) - the JNDI binding name for the TopicConnectionFactory
+    * topicBindingName (mandatory) - the JNDI binding name for the topic name
+    * getQueueBindingName (mandatory only if using jmsCacheLoader) - the JNDI binding name for the queue name
+    * securityPrincipalName - the JNDI java.naming.security.principal
+    * securityCredentials - the JNDI java.naming.security.credentials
+    * urlPkgPrefixes - the JNDI java.naming.factory.url.pkgs
+    * userName - the user name to use when creating the TopicConnection to the Message Queue
+    * password - the password to use when creating the TopicConnection to the Message Queue
+    * acknowledgementMode - the JMS Acknowledgement mode for both publisher and subscriber. The available choices are
+                            AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE and SESSION_TRANSACTED. The default is AUTO_ACKNOWLEDGE.
+    -->
+    <cacheManagerPeerProviderFactory
+            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
+            properties="peerDiscovery=automatic,
+                        multicastGroupAddress=230.0.0.1,
+                        multicastGroupPort=4446, timeToLive=1"
+            propertySeparator=","
+            />
+
+
+    <!--
+    CacheManagerPeerListener
+    ========================
+    (Enable for distributed operation)
+
+    Specifies a CacheManagerPeerListenerFactory which will be used to create a
+    CacheManagerPeerListener, which
+    listens for messages from cache replicators participating in the cluster.
+
+    The attributes of cacheManagerPeerListenerFactory are:
+    class - a fully qualified factory class name
+    properties - comma separated properties having meaning only to the factory.
+
+    Ehcache comes with a built-in RMI-based distribution system. The listener component is
+    RMICacheManagerPeerListener which is configured using
+    RMICacheManagerPeerListenerFactory. It is configured as per the following example:
+
+    <cacheManagerPeerListenerFactory
+        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
+        properties="hostName=fully_qualified_hostname_or_ip,
+                    port=40001,
+                    remoteObjectPort=40002,
+                    socketTimeoutMillis=120000"
+                    propertySeparator="," />
+
+    All properties are optional. They are:
+    * hostName - the hostName of the host the listener is running on. Specify
+      where the host is multihomed and you want to control the interface over which cluster
+      messages are received. Defaults to the host name of the default interface if not
+      specified.
+    * port - the port the RMI Registry listener listens on. This defaults to a free port if not specified.
+    * remoteObjectPort - the port number on which the remote objects bound in the registry receive calls.
+                         This defaults to a free port if not specified.
+    * socketTimeoutMillis - the number of ms client sockets will stay open when sending
+      messages to the listener. This should be long enough for the slowest message.
+      If not specified it defaults to 120000ms.
+
+    -->
+    <cacheManagerPeerListenerFactory
+            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
+
+
+    <!--
+    Cache configuration
+    ===================
+
+    The following attributes are required.
+
+    name:
+    Sets the name of the cache. This is used to identify the cache. It must be unique.
+
+    maxElementsInMemory:
+    Sets the maximum number of objects that will be created in memory
+
+	maxElementsOnDisk:
+    Sets the maximum number of objects that will be maintained in the DiskStore
+	The default value is zero, meaning unlimited.
+
+    eternal:
+    Sets whether elements are eternal. If eternal,  timeouts are ignored and the
+    element is never expired.
+
+    overflowToDisk:
+    Sets whether elements can overflow to disk when the memory store
+    has reached the maxInMemory limit.
+
+    The following attributes and elements are optional.
+
+    timeToIdleSeconds:
+    Sets the time to idle for an element before it expires.
+    i.e. The maximum amount of time between accesses before an element expires
+    Is only used if the element is not eternal.
+    Optional attribute. A value of 0 means that an Element can idle for infinity.
+    The default value is 0.
+
+    timeToLiveSeconds:
+    Sets the time to live for an element before it expires.
+    i.e. The maximum time between creation time and when an element expires.
+    Is only used if the element is not eternal.
+    Optional attribute. A value of 0 means that and Element can live for infinity.
+    The default value is 0.
+
+    diskPersistent:
+    Whether the disk store persists between restarts of the Virtual Machine.
+    The default value is false.
+
+    diskExpiryThreadIntervalSeconds:
+    The number of seconds between runs of the disk expiry thread. The default value
+    is 120 seconds.
+
+    diskSpoolBufferSizeMB:
+    This is the size to allocate the DiskStore for a spool buffer. Writes are made
+    to this area and then asynchronously written to disk. The default size is 30MB.
+    Each spool buffer is used only by its cache. If you get OutOfMemory errors consider
+    lowering this value. To improve DiskStore performance consider increasing it. Trace level
+    logging in the DiskStore will show if put back ups are occurring.
+
+    clearOnFlush:
+    whether the MemoryStore should be cleared when flush() is called on the cache.
+    By default, this is true i.e. the MemoryStore is cleared.
+
+    memoryStoreEvictionPolicy:
+    Policy would be enforced upon reaching the maxElementsInMemory limit. Default
+    policy is Least Recently Used (specified as LRU). Other policies available -
+    First In First Out (specified as FIFO) and Less Frequently Used
+    (specified as LFU)
+
+    Cache elements can also contain sub elements which take the same format of a factory class
+    and properties. Defined sub-elements are:
+
+    * cacheEventListenerFactory - Enables registration of listeners for cache events, such as
+      put, remove, update, and expire.
+
+    * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader, which is called by a
+      cache on initialisation to prepopulate itself.
+
+    * cacheExtensionFactory - Specifies a CacheExtension, a generic mechansim to tie a class
+      which holds a reference to a cache to the cache lifecycle.
+
+    * cacheExceptionHandlerFactory - Specifies a CacheExceptionHandler, which is called when
+      cache exceptions occur.
+
+    * cacheLoaderFactory - Specifies a CacheLoader, which can be used both asynchronously and
+      synchronously to load objects into a cache. More than one cacheLoaderFactory element
+      can be added, in which case the loaders form a chain which are executed in order. If a
+      loader returns null, the next in chain is called.
+
+    RMI Cache Replication
+    +++++++++++++++++++++
+
+    Each cache that will be distributed needs to set a cache event listener which replicates
+    messages to the other CacheManager peers. For the built-in RMI implementation this is done
+    by adding a cacheEventListenerFactory element of type RMICacheReplicatorFactory to each
+    distributed cache's configuration as per the following example:
+
+    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
+         properties="replicateAsynchronously=true,
+         replicatePuts=true,
+         replicatePutsViaCopy=false,
+         replicateUpdates=true,
+         replicateUpdatesViaCopy=true,
+         replicateRemovals=true
+         asynchronousReplicationIntervalMillis=<number of milliseconds"
+         propertySeparator="," />
+
+    The RMICacheReplicatorFactory recognises the following properties:
+
+    * replicatePuts=true|false - whether new elements placed in a cache are
+      replicated to others. Defaults to true.
+
+    * replicatePutsViaCopy=true|false - whether the new elements are
+      copied to other caches (true), or whether a remove message is sent. Defaults to true.  
+
+    * replicateUpdates=true|false - whether new elements which override an
+      element already existing with the same key are replicated. Defaults to true.
+
+    * replicateRemovals=true - whether element removals are replicated. Defaults to true.
+
+    * replicateAsynchronously=true | false - whether replications are
+      asynchronous (true) or synchronous (false). Defaults to true.
+
+    * replicateUpdatesViaCopy=true | false - whether the new elements are
+      copied to other caches (true), or whether a remove message is sent. Defaults to true.
+
+    * asynchronousReplicationIntervalMillis=<number of milliseconds> - The asynchronous
+      replicator runs at a set interval of milliseconds. The default is 1000. The minimum
+      is 10. This property is only applicable if replicateAsynchronously=true
+
+
+    JGroups Replication
+    +++++++++++++++++++
+
+	For the Jgroups replication this is done with:
+	<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
+                            properties="replicateAsynchronously=true, replicatePuts=true,
+ 							replicateUpdates=true, replicateUpdatesViaCopy=false,
+ 							replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"/>
+    This listener supports the same properties as the RMICacheReplicationFactory.
+
+
+    JMS Replication
+    +++++++++++++++
+
+	For JMS-based replication this is done with:
+	<cacheEventListenerFactory
+          class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory"
+          properties="replicateAsynchronously=true,
+                       replicatePuts=true,
+                       replicateUpdates=true,
+                       replicateUpdatesViaCopy=true,
+                       replicateRemovals=true,
+                       asynchronousReplicationIntervalMillis=1000"
+           propertySeparator=","/>
+
+    This listener supports the same properties as the RMICacheReplicationFactory.
+    
+    Cluster Bootstrapping
+    +++++++++++++++++++++
+
+    Bootstrapping a cluster may use a different mechanism to replication. e.g you can mix
+    JMS replication with bootstrap via RMI - just make sure you have the cacheManagerPeerProviderFactory
+    and cacheManagerPeerListenerFactory configured.
+
+    There are two bootstrapping mechanisms: RMI and JGroups.
+
+    RMI Bootstrap
+
+    The RMIBootstrapCacheLoader bootstraps caches in clusters where RMICacheReplicators are
+    used. It is configured as per the following example:
+
+    <bootstrapCacheLoaderFactory
+        class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
+        properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"
+        propertySeparator="," />
+
+    The RMIBootstrapCacheLoaderFactory recognises the following optional properties:
+
+    * bootstrapAsynchronously=true|false - whether the bootstrap happens in the background
+      after the cache has started. If false, bootstrapping must complete before the cache is
+      made available. The default value is true.
+
+    * maximumChunkSizeBytes=<integer> - Caches can potentially be very large, larger than the
+      memory limits of the VM. This property allows the bootstraper to fetched elements in
+      chunks. The default chunk size is 5000000 (5MB).
+
+    JGroups Bootstrap
+
+    Here is an example of bootstrap configuration using JGroups boostrap:
+
+    <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory"
+                                    properties="bootstrapAsynchronously=true"/>
+
+    The configuration properties are the same as for RMI above. Note that JGroups bootstrap only supports
+    asynchronous bootstrap mode.                                
+
+
+    Cache Exception Handling
+
+    By default, most cache operations will propagate a runtime CacheException on failure. An
+    interceptor, using a dynamic proxy, may be configured so that a CacheExceptionHandler can
+    be configured to intercept Exceptions. Errors are not intercepted.
+
+    It is configured as per the following example:
+
+      <cacheExceptionHandlerFactory class="com.example.ExampleExceptionHandlerFactory"
+                                      properties="logLevel=FINE"/>
+
+    Caches with ExceptionHandling configured are not of type Cache, but are of type Ehcache only,
+    and are not available using CacheManager.getCache(), but using CacheManager.getEhcache().
+
+
+    Cache Loader
+
+    A default CacheLoader may be set which loads objects into the cache through asynchronous and
+    synchronous methods on Cache. This is different to the bootstrap cache loader, which is used
+    only in distributed caching.
+
+    It is configured as per the following example:
+
+        <cacheLoaderFactory class="com.example.ExampleCacheLoaderFactory"
+                                      properties="type=int,startCounter=10"/>
+
+    Cache Extension
+
+    CacheExtensions are a general purpose mechanism to allow generic extensions to a Cache.
+    CacheExtensions are tied into the Cache lifecycle.
+
+    CacheExtensions are created using the CacheExtensionFactory which has a
+    <code>createCacheCacheExtension()</code> method which takes as a parameter a
+    Cache and properties. It can thus call back into any public method on Cache, including, of
+    course, the load methods.
+
+    Extensions are added as per the following example:
+
+         <cacheExtensionFactory class="com.example.FileWatchingCacheRefresherExtensionFactory"
+                             properties="refreshIntervalMillis=18000, loaderTimeout=3000,
+                                         flushPeriod=whatever, someOtherProperty=someValue ..."/>
+
+    -->
+
+
+    <!--
+    Mandatory Default Cache configuration. These settings will be applied to caches
+    created programmtically using CacheManager.add(String cacheName).
+
+    The defaultCache has an implicit name "default" which is a reserved cache name.
+    -->
+    <defaultCache
+            maxElementsInMemory="10000"
+            eternal="false"
+            timeToIdleSeconds="120"
+            timeToLiveSeconds="120"
+            overflowToDisk="true"
+            diskSpoolBufferSizeMB="30"
+            maxElementsOnDisk="10000000"
+            diskPersistent="false"
+            diskExpiryThreadIntervalSeconds="120"
+            memoryStoreEvictionPolicy="LRU"
+            />
+
+    <!--
+    Sample caches. Following are some example caches. Remove these before use.
+    -->
+
+    <!--
+    Sample cache named sampleCache1
+    This cache contains a maximum in memory of 10000 elements, and will expire
+    an element if it is idle for more than 5 minutes and lives for more than
+    10 minutes.
+
+    If there are more than 10000 elements it will overflow to the
+    disk cache, which in this configuration will go to wherever java.io.tmp is
+    defined on your system. On a standard Linux system this will be /tmp"
+    -->
+    <cache name="sampleCache1"
+           maxElementsInMemory="10000"
+           maxElementsOnDisk="1000"
+           eternal="false"
+           overflowToDisk="true"
+           diskSpoolBufferSizeMB="20"
+           timeToIdleSeconds="300"
+           timeToLiveSeconds="600"
+           memoryStoreEvictionPolicy="LFU"
+            />
+
+
+    <!--
+    Sample cache named sampleCache2
+    This cache has a maximum of 1000 elements in memory. There is no overflow to disk, so 1000
+    is also the maximum cache size. Note that when a cache is eternal, timeToLive and
+    timeToIdle are not used and do not need to be specified.
+    -->
+    <cache name="sampleCache2"
+           maxElementsInMemory="1000"
+           eternal="true"
+           overflowToDisk="false"
+           memoryStoreEvictionPolicy="FIFO"
+            />
+
+
+    <!--
+    Sample cache named sampleCache3. This cache overflows to disk. The disk store is
+    persistent between cache and VM restarts. The disk expiry thread interval is set to 10
+    minutes, overriding the default of 2 minutes.
+    -->
+    <cache name="sampleCache3"
+           maxElementsInMemory="500"
+           eternal="false"
+           overflowToDisk="true"
+           timeToIdleSeconds="300"
+           timeToLiveSeconds="600"
+           diskPersistent="true"
+           diskExpiryThreadIntervalSeconds="1"
+           memoryStoreEvictionPolicy="LFU"
+            />
+
+
+    <!--
+    Sample distributed cache named sampleDistributedCache1.
+    This cache replicates using defaults.
+    It also bootstraps from the cluster, using default properties.
+    -->
+    <cache name="sampleDistributedCache1"
+           maxElementsInMemory="10"
+           eternal="false"
+           timeToIdleSeconds="100"
+           timeToLiveSeconds="100"
+           overflowToDisk="false">
+        <cacheEventListenerFactory
+                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
+        <bootstrapCacheLoaderFactory
+                class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
+    </cache>
+
+
+    <!--
+    Sample distributed cache named sampleDistributedCache2.
+    This cache replicates using specific properties.
+    It only replicates updates and does so synchronously via copy
+    -->
+    <cache name="sampleDistributedCache2"
+           maxElementsInMemory="10"
+           eternal="false"
+           timeToIdleSeconds="100"
+           timeToLiveSeconds="100"
+           overflowToDisk="false">
+        <cacheEventListenerFactory
+                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
+                properties="replicateAsynchronously=false, replicatePuts=false,
+                            replicatePutsViaCopy=false, replicateUpdates=true,
+                            replicateUpdatesViaCopy=true, replicateRemovals=false"/>
+    </cache>
+
+    <!--
+    Sample distributed cache named sampleDistributedCache3.
+    This cache replicates using defaults except that the asynchronous replication
+    interval is set to 200ms.
+    This one includes / and # which were illegal in ehcache 1.5.
+    -->
+    <cache name="sample/DistributedCache3"
+           maxElementsInMemory="10"
+           eternal="false"
+           timeToIdleSeconds="100"
+           timeToLiveSeconds="100"
+           overflowToDisk="true">
+        <cacheEventListenerFactory
+                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
+                properties="asynchronousReplicationIntervalMillis=200"/>
+    </cache>
+
+    
+
+
+</ehcache>

Propchange: camel/trunk/components/camel-cache/src/main/resources/ehcache.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/main/resources/ehcache.xml
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/main/resources/ehcache.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-cache/src/main/resources/ehcache.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl (added)
+++ camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl Sun Sep 13 07:35:39 2009
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+    <!-- input cacheValue -->
+    <xsl:param name="cacheValue" select="node-set"/>
+
+    <xsl:template match="##match_token##">
+        <xsl:apply-templates select="$cacheValue"/>
+    </xsl:template>
+
+    <!-- Identity transform template -->
+	<xsl:template match="node()|@*">
+        <!-- Copy the current node -->
+        <xsl:copy>
+            <!-- Including any attributes it has and any child nodes -->
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+
+</xsl:transform>

Propchange: camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-cache/src/main/resources/xpathreplacer.xsl
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java (added)
+++ camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java Sun Sep 13 07:35:39 2009
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.cache;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class CacheConsumerTest extends CamelTestSupport {
+    private static final transient Log LOG = LogFactory.getLog(CacheConsumerTest.class);
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint resultEndpoint;
+    @Produce(uri = "direct:start")
+    protected ProducerTemplate producerTemplate;
+
+
+    @Test
+    public void testReceivingFileFromCache() throws Exception {
+    	LOG.info("Beginning Test ---> testReceivingFileFromCache()");
+    	
+        resultEndpoint.expectedMessageCount(3);
+        
+        List<String> operations = new ArrayList<String>();
+        operations.add("ADD");
+        operations.add("UPDATE");
+        operations.add("DELETE");
+        for (final String operation : operations) {
+            producerTemplate.send(new Processor() {
+                public void process(Exchange exchange) throws Exception {
+                    exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                    Message in = exchange.getIn();
+                    in.setHeader("CACHE_OPERATION", operation);
+                    in.setHeader("CACHE_KEY", "greeting");
+                    in.setBody("Hello World");
+                }
+            });
+        }
+
+        resultEndpoint.assertIsSatisfied();
+    	LOG.info("Completed Test ---> testReceivingFileFromCache()");
+    }
+    
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("cache://TestCache1").
+                process(new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        String operation = (String) exchange.getIn().getHeader("CACHE_OPERATION");
+                        String key = (String) exchange.getIn().getHeader("CACHE_KEY");
+                        Object body = exchange.getIn().getBody();
+                        String data = exchange.getContext().getTypeConverter().convertTo(String.class, body);
+               
+                        LOG.info("------- Cache Event Notification ---------");
+                        LOG.info("Received notification for the following activity in cache TestCache1:");
+                        LOG.info("Operation = " + operation);
+                        LOG.info("key = " + key);
+                        LOG.info("value = " + data);
+                        LOG.info("------ End Cache Event Notification ------");
+                    }
+                    
+                }).
+                to("mock:result");
+            
+	            from("direct:start").
+	                to("cache://TestCache1");
+            }
+        };
+    }    
+        
+}

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheConsumerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java (added)
+++ camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java Sun Sep 13 07:35:39 2009
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.cache;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.converter.IOConverter;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class CacheProducerTest extends CamelTestSupport {
+    private static final transient Log LOG = LogFactory.getLog(CacheProducerTest.class);
+    
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    private void sendFile() throws Exception {
+        template.send("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+             // Read from an input stream
+                InputStream is = new BufferedInputStream(
+                    new FileInputStream("./src/test/resources/test.txt"));
+
+                byte buffer[] = IOConverter.toBytes(is);
+                is.close();
+                
+                // Set the property of the charset encoding
+                exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                Message in = exchange.getIn();
+                in.setBody(buffer);
+            }            
+        });
+    }
+    
+    private void sendUpdatedFile() throws Exception {
+        template.send("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+             // Read from an input stream
+                InputStream is = new BufferedInputStream(
+                    new FileInputStream("./src/test/resources/updatedtest.txt"));
+
+                byte buffer[] = IOConverter.toBytes(is);
+                is.close();
+                
+                // Set the property of the charset encoding
+                exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                Message in = exchange.getIn();
+                in.setBody(buffer);
+            }            
+        });
+    }    
+
+    @Test
+    public void testAddingDataToCache() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            public void configure() {
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("ADD")).
+                    setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
+                    to("cache://TestCache1");
+            }
+        });
+        context.start();
+        LOG.info("------------Beginning CacheProducer Add Test---------------");
+        sendFile();
+    }
+    
+    @Test
+    public void testUpdatingDataInCache() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            public void configure() {
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("UPDATE")).
+                    setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
+                    to("cache://TestCache1");
+            }
+        });
+        context.start();
+        LOG.info("------------Beginning CacheProducer Update Test---------------");
+        sendUpdatedFile();
+    }
+    
+    @Test
+    public void testDeletingDataFromCache() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            public void configure() {
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("DELETE")).
+                    setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
+                    to("cache://TestCache1");
+            }
+        });
+        context.start();
+        LOG.info("------------Beginning CacheProducer Delete Test---------------");
+        sendUpdatedFile();
+    }
+    
+    @Test
+    public void testDeletingAllDataFromCache() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            public void configure() {
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("ADD")).
+                    setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
+                    to("cache://TestCache1");
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("ADD")).
+                    setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson2")).
+                    to("cache://TestCache1");
+                from("direct:start").
+                    setHeader("CACHE_OPERATION", constant("DELETEALL")).
+                    to("cache://TestCache1");
+            }
+        });
+        context.start();
+        LOG.info("------------Beginning CacheProducer Delete All Elements Test---------------");
+        sendUpdatedFile();
+    }    
+    
+}

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/component/cache/CacheProducerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java (added)
+++ camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java Sun Sep 13 07:35:39 2009
@@ -0,0 +1,109 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.processor.cache;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Test;
+
+public class CacheBasedBodyReplacerTest extends CamelTestSupport {
+    private static final transient Log LOG = LogFactory.getLog(CacheBasedBodyReplacerTest.class);
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint resultEndpoint;
+
+    @Produce(uri = "direct:start")
+    protected ProducerTemplate producerTemplate;
+
+    
+    @Test
+    public void testCacheBasedBodyReplacer() throws Exception {
+    	LOG.info("Beginning Test ---> testCacheBasedBodyReplacer()");
+    	
+    	resultEndpoint.expectedMessageCount(1);
+        
+        List<String> keys = new ArrayList<String>();
+        keys.add("farewell");
+        keys.add("greeting");
+        for (final String key : keys) {
+            producerTemplate.send(new Processor() {
+                public void process(Exchange exchange) throws Exception {
+                    exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                    Message in = exchange.getIn();
+                    in.setHeader("CACHE_OPERATION", "ADD");
+                    in.setHeader("CACHE_KEY", key);
+                    if (key.equalsIgnoreCase("greeting")) {
+                        in.setBody("Hello World");
+                    } else {
+                        in.setBody("Bye World");
+                    }
+                }
+            });
+        }
+        
+        resultEndpoint.assertIsSatisfied();
+    	LOG.info("Completed Test ---> testCacheBasedBodyReplacer()");
+        
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("cache://TestCache1").
+                    filter(header("CACHE_KEY").isEqualTo("greeting")).
+                    process (new CacheBasedMessageBodyReplacer("cache://TestCache1","farewell")).
+                    to("direct:next");
+                
+                from("direct:next").
+                    process (new Processor() {
+                        public void process(Exchange exchange) throws Exception {
+                            String key = (String) exchange.getIn().getHeader("CACHE_KEY");
+                            Object body = exchange.getIn().getBody();
+                            String data = exchange.getContext().getTypeConverter().convertTo(String.class, body);                        
+                                
+                            LOG.info("------- Payload Replacement Results ---------");
+                            LOG.info("The following Payload was replaced from Cache: TestCache1");
+                            LOG.info("key = " + key);
+                            LOG.info("Before value = Hello World");
+                            LOG.info("After value = " + data);
+                            LOG.info("------ End  ------");   
+                        }
+                    }).
+                    to("mock:result");                 
+                
+                from("direct:start").
+                    to("cache://TestCache1");
+
+            }
+        };
+    }
+}

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedBodyReplacerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java (added)
+++ camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java Sun Sep 13 07:35:39 2009
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.processor.cache;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Test;
+
+public class CacheBasedTokenReplacerTest extends CamelTestSupport {
+    private static final transient Log LOG = LogFactory.getLog(CacheBasedTokenReplacerTest.class);
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint resultEndpoint;
+
+    @Produce(uri = "direct:loadcache")
+    protected ProducerTemplate producerTemplate;
+    
+    String quote = "#novel# - #author#\n" +
+                     "'Tis all a Chequer-board of Nights and Days\n" +
+                     "Where Destiny with Men for Pieces plays:\n" +
+                     "Hither and thither moves, and mates, and slays,\n" + 
+                     "And #number# by #number# back in the Closet lays.";
+    
+    @Test
+    public void testCacheBasedTokenReplacer() throws Exception {
+    	LOG.info("Beginning Test ---> testCacheBasedTokenReplacer()");
+    	
+    	resultEndpoint.expectedMessageCount(1);
+        
+        List<String> keys = new ArrayList<String>();
+        keys.add("novel");
+        keys.add("author");
+        keys.add("number");
+        keys.add("quote");
+        for (final String key : keys) {
+            producerTemplate.send(new Processor() {
+                public void process(Exchange exchange) throws Exception {
+                    exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                    Message in = exchange.getIn();
+                    in.setHeader("CACHE_OPERATION", "ADD");
+                    in.setHeader("CACHE_KEY", key);
+                    if (key.equalsIgnoreCase("novel")) {
+                        in.setBody("Rubaiyat");
+                    } else if (key.equalsIgnoreCase("author")) {
+                        in.setBody("Omar Khayyam");
+                    } else if (key.equalsIgnoreCase("number")) {
+                        in.setBody("one");
+                    } else {
+                        in.setBody(quote);
+                    }
+                }
+            });
+        }
+    	
+    	
+            
+        resultEndpoint.assertIsSatisfied();
+    	LOG.info("Completed Test ---> testCacheBasedTokenReplacer()");
+        
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("cache://TestCache1").
+                    filter(header("CACHE_KEY").isEqualTo("quote")).
+                    process (new CacheBasedTokenReplacer("cache://TestCache1","novel","#novel#")).
+                    process (new CacheBasedTokenReplacer("cache://TestCache1","author","#author#")).
+                    process (new CacheBasedTokenReplacer("cache://TestCache1","number","#number#")).
+                    to("direct:next");
+                
+                from("direct:next").
+                    process (new Processor() {
+                        public void process(Exchange exchange) throws Exception {
+                            String key = (String) exchange.getIn().getHeader("CACHE_KEY");
+                            Object body = exchange.getIn().getBody();
+                            String data = exchange.getContext().getTypeConverter().convertTo(String.class, body);                                  
+                                
+                            LOG.info("------- Payload Replacement Results ---------");
+                            LOG.info("The following Payload was replaced from Cache: TestCache1");
+                            LOG.info("key = " + key);
+                            LOG.info("Before Value = " + quote);
+                            LOG.info("After value = " + data);
+                            LOG.info("------ End  ------");   
+                        }
+                    }).
+                    to("mock:result");                 
+                
+                from("direct:loadcache").
+                    to("cache://TestCache1");
+
+            }
+        };
+    }
+}

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedTokenReplacerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java (added)
+++ camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java Sun Sep 13 07:35:39 2009
@@ -0,0 +1,130 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.processor.cache;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Test;
+
+public class CacheBasedXPathElementReplacerTest extends CamelTestSupport {
+    private static final transient Log LOG = LogFactory.getLog(CacheBasedXPathElementReplacerTest.class);
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint resultEndpoint;
+
+    @Produce(uri = "direct:loadcache")
+    protected ProducerTemplate producerTemplate;
+    
+    String XML_FRAGMENT = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
+                    + "<books>"
+                    + "<book1>"
+                    + "</book1>"
+                    + "<book2>"
+                    + "</book2>"
+                    + "</books>";
+
+    String book1 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
+                    + "<book1>" 
+                    + "<novel>My Man Jeeves</novel>" 
+                    + "<author>P.G Wodehouse</author>" 
+                    + "</book1>";
+    String book2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
+                    + "<book2>" 
+                    + "<novel>The Jungle Book</novel>" 
+                    + "<author>Rudyard Kipling</author>" 
+                    + "</book2>";
+    
+    @Test
+    public void testCacheBasedXPathElementReplacer() throws Exception {
+    	LOG.info("Beginning Test ---> testCacheBasedXPathElementReplacer()");
+    	
+    	resultEndpoint.expectedMessageCount(1);
+        
+        List<String> keys = new ArrayList<String>();
+        keys.add("book1");
+        keys.add("book2");
+        keys.add("XML_FRAGMENT");
+        for (final String key : keys) {
+            producerTemplate.send(new Processor() {
+                public void process(Exchange exchange) throws Exception {
+                    exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");
+                    Message in = exchange.getIn();
+                    in.setHeader("CACHE_OPERATION", "ADD");
+                    in.setHeader("CACHE_KEY", key);
+                    if (key.equalsIgnoreCase("book1")) {
+                        in.setBody(book1);
+                    } else if(key.equalsIgnoreCase("book2")) {
+                        in.setBody(book2);
+                    } else {
+                        in.setBody(XML_FRAGMENT);
+                    }
+                }
+            });
+        } 	
+            
+        resultEndpoint.assertIsSatisfied();
+    	LOG.info("Completed Test ---> testCacheBasedXPathElementReplacer()");
+        
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("cache://TestCache1").
+                    filter(header("CACHE_KEY").isEqualTo("XML_FRAGMENT")).
+                    process (new CacheBasedXPathReplacer("cache://TestCache1","book1","/books/book1")).
+                    process (new CacheBasedXPathReplacer("cache://TestCache1","book2","/books/book2")).
+                    to("direct:next");
+                   
+                from("direct:next").
+                    process (new Processor() {
+                        public void process(Exchange exchange) throws Exception {
+                            String key = (String) exchange.getIn().getHeader("CACHE_KEY");
+                            Object body = exchange.getIn().getBody();
+                            String data = exchange.getContext().getTypeConverter().convertTo(String.class, body);                                  
+                                
+                            LOG.info("------- Payload Replacement Results ---------");
+                            LOG.info("The following Payload was replaced from Cache: TestCache1");
+                            LOG.info("key = " + key);
+                            LOG.info("Before Value = " + XML_FRAGMENT);
+                            LOG.info("After value = " + data);
+                            LOG.info("------ End  ------");   
+                        }
+                    }).
+                    to("mock:result");                 
+                
+                from("direct:loadcache").
+                    to("cache://TestCache1");
+
+            }
+        };
+    }
+}

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/java/org/apache/camel/processor/cache/CacheBasedXPathElementReplacerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-cache/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/resources/log4j.properties?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/resources/log4j.properties (added)
+++ camel/trunk/components/camel-cache/src/test/resources/log4j.properties Sun Sep 13 07:35:39 2009
@@ -0,0 +1,38 @@
+## ------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ------------------------------------------------------------------------
+
+#
+# The logging properties used for eclipse testing, We want to see debug output on the console.
+#
+log4j.rootLogger=INFO, file
+
+# uncomment the following to enable camel debugging
+log4j.logger.org.apache.camel.component.cache=INFO
+#log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.commons.net=TRACE
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+#log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+# File appender
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+log4j.appender.file.file=target/camel-cache-test.log
\ No newline at end of file

Propchange: camel/trunk/components/camel-cache/src/test/resources/log4j.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/resources/log4j.properties
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/resources/log4j.properties
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-cache/src/test/resources/log4j.properties
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: camel/trunk/components/camel-cache/src/test/resources/test.txt
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/resources/test.txt?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/resources/test.txt (added)
+++ camel/trunk/components/camel-cache/src/test/resources/test.txt Sun Sep 13 07:35:39 2009
@@ -0,0 +1,22 @@
+Brahma
+by: Ralph Waldo Emerson
+
+If the red slayer think he slays,
+Or if the slain think he is slain,
+They know not well the subtle ways
+I keep, and pass, and turn again.
+
+Far or forgot to me is near;
+Shadow and sunlight are the same;
+The vanished gods to me appear;
+And one to me are shame and fame.
+
+They reckon ill who leave me out;
+When me they fly, I am the wings;
+I am the doubter and the doubt,
+And I the hymn the Brahmin sings.
+
+The strong gods pine for my abode,
+And pine in vain the sacred Seven;
+But thou, meek lover of the good!
+Find me, and turn thy back on heaven.
\ No newline at end of file

Propchange: camel/trunk/components/camel-cache/src/test/resources/test.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/resources/test.txt
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/resources/test.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt?rev=814274&view=auto
==============================================================================
--- camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt (added)
+++ camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt Sun Sep 13 07:35:39 2009
@@ -0,0 +1,23 @@
+Brahma
+------
+by: Ralph Waldo Emerson
+
+If the red slayer think he slays,
+Or if the slain think he is slain,
+They know not well the subtle ways
+I keep, and pass, and turn again.
+
+Far or forgot to me is near;
+Shadow and sunlight are the same;
+The vanished gods to me appear;
+And one to me are shame and fame.
+
+They reckon ill who leave me out;
+When me they fly, I am the wings;
+I am the doubter and the doubt,
+And I the hymn the Brahmin sings.
+
+The strong gods pine for my abode,
+And pine in vain the sacred Seven;
+But thou, meek lover of the good!
+Find me, and turn thy back on heaven.
\ No newline at end of file

Propchange: camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt
------------------------------------------------------------------------------
    svn:executable = *

Propchange: camel/trunk/components/camel-cache/src/test/resources/updatedtest.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: camel/trunk/components/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/pom.xml?rev=814274&r1=814273&r2=814274&view=diff
==============================================================================
--- camel/trunk/components/pom.xml (original)
+++ camel/trunk/components/pom.xml Sun Sep 13 07:35:39 2009
@@ -35,6 +35,7 @@
     <module>camel-bam</module>
     <module>camel-bindy</module>
     <module>camel-cometd</module>
+    <module>camel-cache</module>
     <module>camel-csv</module>
     <module>camel-cxf</module>
     <module>camel-flatpack</module>

Modified: camel/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/parent/pom.xml?rev=814274&r1=814273&r2=814274&view=diff
==============================================================================
--- camel/trunk/parent/pom.xml (original)
+++ camel/trunk/parent/pom.xml Sun Sep 13 07:35:39 2009
@@ -42,6 +42,7 @@
     <cxf-version>2.2.3</cxf-version>
     <felix-version>1.4.1</felix-version>
     <felix-osgi-version>1.2.0</felix-osgi-version>
+    <fuse-commons-management-version>1.0</fuse-commons-management-version>
     <geronimo-jms-spec-version>1.1.1</geronimo-jms-spec-version>
     <geronimo-jpa-spec-version>1.1.1</geronimo-jpa-spec-version>
     <geronimo-jta-spec-version>1.1.1</geronimo-jta-spec-version>
@@ -134,6 +135,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-cache</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-cometd</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -483,6 +489,13 @@
         <version>${commons-logging-api-version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>org.fusesource.commonman</groupId>
+        <artifactId>commons-management</artifactId>
+        <version>${fuse-commons-management-version}</version>
+      </dependency>
+
+
       <!-- optional dependencies -->
       <dependency>
         <groupId>javax.xml.bind</groupId>