Author: davsclaus
Date: Wed Jan  5 17:32:37 2011
New Revision: 1055545

URL: http://svn.apache.org/viewvc?rev=1055545&view=rev
Log:
CAMEL-3500: Headers on message and properties on Exchange is now using string 
interning for Camel keys, to reduce memory consumption.

Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=1055545&r1=1055544&r2=1055545&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java 
Wed Jan  5 17:32:37 2011
@@ -83,7 +83,9 @@ public final class DefaultExchange imple
     public Exchange copy() {
         DefaultExchange exchange = new DefaultExchange(this);
 
-        exchange.setProperties(safeCopy(getProperties()));
+        if (hasProperties()) {
+            exchange.setProperties(safeCopy(getProperties()));
+        }
         safeCopy(exchange.getIn(), getIn());
         if (hasOut()) {
             safeCopy(exchange.getOut(), getOut());
@@ -111,16 +113,16 @@ public final class DefaultExchange imple
 
     public Object getProperty(String name) {
         if (hasProperties()) {
+            if (name.startsWith("Camel")) {
+                name = name.intern();
+            }
             return properties.get(name);
         }
         return null;
     }
 
     public Object getProperty(String name, Object defaultValue) {
-        Object answer = null;
-        if (hasProperties()) {
-            answer = properties.get(name);
-        }
+        Object answer = getProperty(name);
         return answer != null ? answer : defaultValue;
     }
 
@@ -149,6 +151,11 @@ public final class DefaultExchange imple
     }
 
     public void setProperty(String name, Object value) {
+        // use intern String for properties which is Camel* properties
+        // this reduces memory allocations needed for those common properties
+        if (name != null && name.startsWith("Camel")) {
+            name = name.intern();
+        }
         if (value != null) {
             // avoid the NullPointException
             getProperties().put(name, value);

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java?rev=1055545&r1=1055544&r2=1055545&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
 Wed Jan  5 17:32:37 2011
@@ -55,12 +55,12 @@ public class CaseInsensitiveMap extends 
 
     public CaseInsensitiveMap(int initialCapacity, float loadFactor) {
         super(initialCapacity, loadFactor);
-        originalKeys = new HashMap<String, String>(initialCapacity);
+        originalKeys = new HashMap<String, String>(initialCapacity, 
loadFactor);
     }
 
     public CaseInsensitiveMap(int initialCapacity) {
         super(initialCapacity);
-        originalKeys = new HashMap<String, String>();
+        originalKeys = new HashMap<String, String>(initialCapacity);
     }
 
     @Override
@@ -80,15 +80,32 @@ public class CaseInsensitiveMap extends 
         // invalidate views as we mutate
         entrySetView = null;
         String s = assembleKey(key);
-        originalKeys.put(s, key);
+        if (key.startsWith("Camel")) {
+            // use intern String for headers which is Camel* headers
+            // this reduces memory allocations needed for those common headers
+            originalKeys.put(s, key.intern());
+        } else {
+            originalKeys.put(s, key);
+        }
         return super.put(s, value);
     }
 
     @Override
     public synchronized void putAll(Map<? extends String, ?> map) {
+        entrySetView = null;
         if (map != null && !map.isEmpty()) {
             for (Map.Entry<? extends String, ?> entry : map.entrySet()) {
-                put(entry.getKey(), entry.getValue());
+                String key = entry.getKey();
+                Object value = entry.getValue();
+                String s = assembleKey(key);
+                if (key.startsWith("Camel")) {
+                    // use intern String for headers which is Camel* headers
+                    // this reduces memory allocations needed for those common 
headers
+                    originalKeys.put(s, key.intern());
+                } else {
+                    originalKeys.put(s, key);
+                }
+                super.put(s, value);
             }
         }
     }


Reply via email to