From 4178a00735fc9dec0def556f1fcd7d5bd17ad3d7 Mon Sep 17 00:00:00 2001 From: Terry Tao Date: Fri, 19 Dec 2025 17:26:39 -0500 Subject: [PATCH] Fix LinkedCaseInsensitiveMap entrySet case-insensitivity Signed-off-by: Terry Tao --- .../util/LinkedCaseInsensitiveMap.java | 33 +++++++++++++++---- .../util/LinkedCaseInsensitiveMapTests.java | 16 +++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) 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 02c60c1201bd..849d38b33fd0 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java @@ -448,7 +448,18 @@ public int size() { @Override public boolean contains(Object o) { - return this.delegate.contains(o); + if (!(o instanceof Map.Entry entry)) { + return false; + } + Object key = entry.getKey(); + if (!(key instanceof String stringKey)) { + return false; + } + if (!LinkedCaseInsensitiveMap.this.containsKey(stringKey)) { + return false; + } + V value = LinkedCaseInsensitiveMap.this.get(stringKey); + return ObjectUtils.nullSafeEquals(value, entry.getValue()); } @Override @@ -457,13 +468,23 @@ public Iterator> iterator() { } @Override - @SuppressWarnings("unchecked") public boolean remove(Object o) { - if (this.delegate.remove(o)) { - removeCaseInsensitiveKey(((Map.Entry) o).getKey()); - return true; + if (!(o instanceof Map.Entry entry)) { + return false; + } + Object key = entry.getKey(); + if (!(key instanceof String stringKey)) { + return false; + } + if (!LinkedCaseInsensitiveMap.this.containsKey(stringKey)) { + return false; + } + V value = LinkedCaseInsensitiveMap.this.get(stringKey); + if (!ObjectUtils.nullSafeEquals(value, entry.getValue())) { + return false; } - return false; + LinkedCaseInsensitiveMap.this.remove(stringKey); + return true; } @Override 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 21799eccf3ce..43840c6168d2 100644 --- a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java @@ -17,6 +17,7 @@ package org.springframework.util; import java.util.Iterator; +import java.util.Map; import org.junit.jupiter.api.Test; @@ -218,6 +219,21 @@ void removeFromEntrySetViaIterator() { assertThat(map.get("key")).isEqualTo("newvalue"); } + @Test + void entrySetContainsIsCaseInsensitive() { + map.put("Key", "value"); + assertThat(map.entrySet().contains(Map.entry("KEY", "value"))).isTrue(); + assertThat(map.entrySet().contains(Map.entry("key", "value"))).isTrue(); + assertThat(map.entrySet().contains(Map.entry("Key", "value"))).isTrue(); + } + + @Test + void entrySetRemoveIsCaseInsensitive() { + map.put("Key", "value"); + assertThat(map.entrySet().remove(Map.entry("KEY", "value"))).isTrue(); + assertThat(map).isEmpty(); + } + private void nextAndRemove(Iterator iterator) { iterator.next(); iterator.remove();