Skip to content

Commit 26e0f55

Browse files
TerryTaoYYbclozel
authored andcommitted
Fix LinkedCaseInsensitiveMap entrySet case-insensitivity
See gh-36056 Signed-off-by: Terry Tao <yueyang.tao@gmail.com>
1 parent 012fb29 commit 26e0f55

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,18 @@ public int size() {
448448

449449
@Override
450450
public boolean contains(Object o) {
451-
return this.delegate.contains(o);
451+
if (!(o instanceof Map.Entry<?, ?> entry)) {
452+
return false;
453+
}
454+
Object key = entry.getKey();
455+
if (!(key instanceof String stringKey)) {
456+
return false;
457+
}
458+
if (!LinkedCaseInsensitiveMap.this.containsKey(stringKey)) {
459+
return false;
460+
}
461+
V value = LinkedCaseInsensitiveMap.this.get(stringKey);
462+
return ObjectUtils.nullSafeEquals(value, entry.getValue());
452463
}
453464

454465
@Override
@@ -457,13 +468,23 @@ public Iterator<Entry<String, V>> iterator() {
457468
}
458469

459470
@Override
460-
@SuppressWarnings("unchecked")
461471
public boolean remove(Object o) {
462-
if (this.delegate.remove(o)) {
463-
removeCaseInsensitiveKey(((Map.Entry<String, V>) o).getKey());
464-
return true;
472+
if (!(o instanceof Map.Entry<?, ?> entry)) {
473+
return false;
474+
}
475+
Object key = entry.getKey();
476+
if (!(key instanceof String stringKey)) {
477+
return false;
478+
}
479+
if (!LinkedCaseInsensitiveMap.this.containsKey(stringKey)) {
480+
return false;
481+
}
482+
V value = LinkedCaseInsensitiveMap.this.get(stringKey);
483+
if (!ObjectUtils.nullSafeEquals(value, entry.getValue())) {
484+
return false;
465485
}
466-
return false;
486+
LinkedCaseInsensitiveMap.this.remove(stringKey);
487+
return true;
467488
}
468489

469490
@Override

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.util;
1818

1919
import java.util.Iterator;
20+
import java.util.Map;
2021

2122
import org.junit.jupiter.api.Test;
2223

@@ -218,6 +219,21 @@ void removeFromEntrySetViaIterator() {
218219
assertThat(map.get("key")).isEqualTo("newvalue");
219220
}
220221

222+
@Test
223+
void entrySetContainsIsCaseInsensitive() {
224+
map.put("Key", "value");
225+
assertThat(map.entrySet().contains(Map.entry("KEY", "value"))).isTrue();
226+
assertThat(map.entrySet().contains(Map.entry("key", "value"))).isTrue();
227+
assertThat(map.entrySet().contains(Map.entry("Key", "value"))).isTrue();
228+
}
229+
230+
@Test
231+
void entrySetRemoveIsCaseInsensitive() {
232+
map.put("Key", "value");
233+
assertThat(map.entrySet().remove(Map.entry("KEY", "value"))).isTrue();
234+
assertThat(map).isEmpty();
235+
}
236+
221237
private void nextAndRemove(Iterator<?> iterator) {
222238
iterator.next();
223239
iterator.remove();

0 commit comments

Comments
 (0)