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