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();


Reply via email to