From dadd2c3709900a019ee021c1f6073e19349f9065 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 25 Jul 2016 12:08:55 +0200 Subject: [PATCH] LinkedCaseInsensitiveMap properly overrides HashMap.clone() Issue: SPR-14509 (cherry picked from commit 6459559) --- .../util/LinkedCaseInsensitiveMap.java | 10 ++++++++- .../util/LinkedCaseInsensitiveMapTests.java | 22 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java index cde4e615ef4..51dd02c6060 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java @@ -36,7 +36,7 @@ import java.util.Map; @SuppressWarnings("serial") public class LinkedCaseInsensitiveMap extends LinkedHashMap { - private final Map caseInsensitiveKeys; + private Map caseInsensitiveKeys; private final Locale locale; @@ -151,6 +151,14 @@ public class LinkedCaseInsensitiveMap extends LinkedHashMap { super.clear(); } + @Override + @SuppressWarnings("unchecked") + public Object clone() { + LinkedCaseInsensitiveMap copy = (LinkedCaseInsensitiveMap) super.clone(); + copy.caseInsensitiveKeys = new HashMap(this.caseInsensitiveKeys); + return copy; + } + /** * Convert the given key to a case-insensitive key. diff --git a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java index 4f4492ef5ae..16e3e29cfdf 100644 --- a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java @@ -74,4 +74,26 @@ public class LinkedCaseInsensitiveMapTests { assertEquals("N", map.getOrDefault(new Object(), "N")); } + @Test + @SuppressWarnings("unchecked") + public void mapClone() { + map.put("key", "value1"); + LinkedCaseInsensitiveMap copy = (LinkedCaseInsensitiveMap) map.clone(); + assertEquals("value1", map.get("key")); + assertEquals("value1", map.get("KEY")); + assertEquals("value1", map.get("Key")); + assertEquals("value1", copy.get("key")); + assertEquals("value1", copy.get("KEY")); + assertEquals("value1", copy.get("Key")); + copy.put("Key", "value2"); + assertEquals(1, map.size()); + assertEquals(1, copy.size()); + assertEquals("value1", map.get("key")); + assertEquals("value1", map.get("KEY")); + assertEquals("value1", map.get("Key")); + assertEquals("value2", copy.get("key")); + assertEquals("value2", copy.get("KEY")); + assertEquals("value2", copy.get("Key")); + } + }