Author: davsclaus Date: Wed Feb 10 08:28:50 2010 New Revision: 908385 URL: http://svn.apache.org/viewvc?rev=908385&view=rev Log: CAMEL-1631: Added cache option to properties component to cache loaded properties to avoid overhead of loading them when to be used.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java?rev=908385&r1=908384&r2=908385&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java Wed Feb 10 08:28:50 2010 @@ -21,19 +21,23 @@ import org.apache.camel.Endpoint; import org.apache.camel.impl.DefaultComponent; +import org.apache.camel.util.LRUCache; import org.apache.camel.util.ObjectHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** + * The <a href="http://camel.apache.org/properties">properties</a> component. + * * @version $Revision$ */ public class PropertiesComponent extends DefaultComponent { private static final transient Log LOG = LogFactory.getLog(PropertiesComponent.class); - // TODO: cache loading properties - private String[] locations; + private final Map<String[], Properties> cacheMap = new LRUCache<String[], Properties>(1000); private PropertiesResolver propertiesResolver = new DefaultPropertiesResolver(); + private String[] locations; + private boolean cache = true; @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { @@ -61,7 +65,15 @@ public String parseUri(String uri, String... paths) throws Exception { ObjectHelper.notNull(paths, "paths"); - Properties prop = propertiesResolver.resolveProperties(getCamelContext(), paths); + + // check cache first + Properties prop = cache ? cacheMap.get(paths) : null; + if (prop == null) { + prop = propertiesResolver.resolveProperties(getCamelContext(), paths); + if (cache) { + cacheMap.put(paths, prop); + } + } if (LOG.isTraceEnabled()) { LOG.trace("Parsing uri " + uri + " with properties: " + prop); @@ -88,4 +100,19 @@ public void setPropertiesResolver(PropertiesResolver propertiesResolver) { this.propertiesResolver = propertiesResolver; } + + public boolean isCache() { + return cache; + } + + public void setCache(boolean cache) { + this.cache = cache; + } + + @Override + protected void doStop() throws Exception { + cacheMap.clear(); + super.doStop(); + } + } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java?rev=908385&r1=908384&r2=908385&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java Wed Feb 10 08:28:50 2010 @@ -166,6 +166,45 @@ } } + public void testPropertiesComponentCacheDefault() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("properties:#{cool.end}"); + from("direct:foo").to("properties:mock:#{cool.result}"); + } + }); + context.start(); + + getMockEndpoint("mock:result").expectedMessageCount(2); + + template.sendBody("direct:start", "Hello World"); + template.sendBody("direct:foo", "Hello Foo"); + + assertMockEndpointsSatisfied(); + } + + public void testPropertiesComponentCacheDisabled() throws Exception { + PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); + pc.setCache(false); + + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("properties:#{cool.end}"); + from("direct:foo").to("properties:mock:#{cool.result}"); + } + }); + context.start(); + + getMockEndpoint("mock:result").expectedMessageCount(2); + + template.sendBody("direct:start", "Hello World"); + template.sendBody("direct:foo", "Hello Foo"); + + assertMockEndpointsSatisfied(); + } + @Override protected CamelContext createCamelContext() throws Exception { CamelContext context = super.createCamelContext();