Author: davsclaus
Date: Tue Oct 26 14:31:52 2010
New Revision: 1027579

URL: http://svn.apache.org/viewvc?rev=1027579&view=rev
Log:
CAMEL-3275: Fxied concurrency issue with case insensitive map when copying 
using putAll.

Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/util/CaseInsensitiveMapTest.java

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=1027579&r1=1027578&r2=1027579&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
 Tue Oct 26 14:31:52 2010
@@ -85,7 +85,7 @@ public class CaseInsensitiveMap extends 
     }
 
     @Override
-    public void putAll(Map<? extends String, ?> map) {
+    public synchronized void putAll(Map<? extends String, ?> map) {
         if (map != null && !map.isEmpty()) {
             for (Map.Entry<? extends String, ?> entry : map.entrySet()) {
                 put(entry.getKey(), entry.getValue());

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/CaseInsensitiveMapTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/CaseInsensitiveMapTest.java?rev=1027579&r1=1027578&r2=1027579&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/CaseInsensitiveMapTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/CaseInsensitiveMapTest.java
 Tue Oct 26 14:31:52 2010
@@ -25,6 +25,10 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 import junit.framework.TestCase;
 
@@ -435,4 +439,41 @@ public class CaseInsensitiveMapTest exte
         assertEquals(2, other.size());
     }
 
+    public void testConcurrent() throws Exception {
+        ExecutorService service = Executors.newFixedThreadPool(5);
+
+        final CountDownLatch latch = new CountDownLatch(1000);
+        final Map<String, Object> map = new CaseInsensitiveMap();
+
+        // do some stuff concurrently
+        for (int i = 0; i < 1000; i++) {
+            final int count = i;
+            service.submit(new Runnable() {
+                public void run() {
+                    Map<String, Object> foo = new CaseInsensitiveMap();
+                    foo.put("counter" + count, count);
+                    foo.put("foo", 123);
+                    foo.put("bar", 456);
+                    foo.put("cake", "cheese");
+
+                    // copy foo to map as map is a shared resource
+                    map.putAll(foo);
+
+                    latch.countDown();
+                }
+            });
+        }
+
+        latch.await(10, TimeUnit.SECONDS);
+
+        assertEquals(1003, map.size());
+        assertEquals(true, map.containsKey("counter0"));
+        assertEquals(true, map.containsKey("counter500"));
+        assertEquals(true, map.containsKey("counter999"));
+
+        assertEquals(123, map.get("FOO"));
+        assertEquals(456, map.get("Bar"));
+        assertEquals("cheese", map.get("cAKe"));
+    }
+
 }
\ No newline at end of file


Reply via email to