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>