Skip to content

Commit dadd2c3

Browse files
committed
LinkedCaseInsensitiveMap properly overrides HashMap.clone()
Issue: SPR-14509 (cherry picked from commit 6459559)
1 parent f1fc74c commit dadd2c3

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
@SuppressWarnings("serial")
3737
public class LinkedCaseInsensitiveMap<V> extends LinkedHashMap<String, V> {
3838

39-
private final Map<String, String> caseInsensitiveKeys;
39+
private Map<String, String> caseInsensitiveKeys;
4040

4141
private final Locale locale;
4242

@@ -151,6 +151,14 @@ public void clear() {
151151
super.clear();
152152
}
153153

154+
@Override
155+
@SuppressWarnings("unchecked")
156+
public Object clone() {
157+
LinkedCaseInsensitiveMap<V> copy = (LinkedCaseInsensitiveMap<V>) super.clone();
158+
copy.caseInsensitiveKeys = new HashMap<String, String>(this.caseInsensitiveKeys);
159+
return copy;
160+
}
161+
154162

155163
/**
156164
* Convert the given key to a case-insensitive key.

spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,26 @@ public void getOrDefaultWithNullValue() {
7474
assertEquals("N", map.getOrDefault(new Object(), "N"));
7575
}
7676

77+
@Test
78+
@SuppressWarnings("unchecked")
79+
public void mapClone() {
80+
map.put("key", "value1");
81+
LinkedCaseInsensitiveMap<String> copy = (LinkedCaseInsensitiveMap<String>) map.clone();
82+
assertEquals("value1", map.get("key"));
83+
assertEquals("value1", map.get("KEY"));
84+
assertEquals("value1", map.get("Key"));
85+
assertEquals("value1", copy.get("key"));
86+
assertEquals("value1", copy.get("KEY"));
87+
assertEquals("value1", copy.get("Key"));
88+
copy.put("Key", "value2");
89+
assertEquals(1, map.size());
90+
assertEquals(1, copy.size());
91+
assertEquals("value1", map.get("key"));
92+
assertEquals("value1", map.get("KEY"));
93+
assertEquals("value1", map.get("Key"));
94+
assertEquals("value2", copy.get("key"));
95+
assertEquals("value2", copy.get("KEY"));
96+
assertEquals("value2", copy.get("Key"));
97+
}
98+
7799
}

0 commit comments

Comments
 (0)