From 9b5132ce5386ecf1fade727bd52cc9b4fb99814e Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 10 Jul 2017 14:24:28 +0200 Subject: [PATCH] LinkedCaseInsensitiveMap exposes its locale for key conversion Issue: SPR-15752 --- .../util/LinkedCaseInsensitiveMap.java | 48 ++++++++++++------- .../util/LinkedCaseInsensitiveMapTests.java | 3 ++ 2 files changed, 35 insertions(+), 16 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 6eda25a33cc..ab243f4f5f3 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java @@ -49,18 +49,19 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable /** - * Create a new LinkedCaseInsensitiveMap for the default Locale. - * @see java.lang.String#toLowerCase() + * Create a new LinkedCaseInsensitiveMap that stores case-insensitive keys + * according to the default Locale (by default in lower case). + * @see #convertKey(String) */ public LinkedCaseInsensitiveMap() { this((Locale) null); } /** - * Create a new LinkedCaseInsensitiveMap that stores lower-case keys - * according to the given Locale. - * @param locale the Locale to use for lower-case conversion - * @see java.lang.String#toLowerCase(java.util.Locale) + * Create a new LinkedCaseInsensitiveMap that stores case-insensitive keys + * according to the given Locale (by default in lower case). + * @param locale the Locale to use for case-insensitive key conversion + * @see #convertKey(String) */ public LinkedCaseInsensitiveMap(@Nullable Locale locale) { this(16, locale); @@ -68,10 +69,10 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable /** * Create a new LinkedCaseInsensitiveMap that wraps a {@link LinkedHashMap} - * with the given initial capacity and stores lower-case keys according - * to the default Locale. + * with the given initial capacity and stores case-insensitive keys + * according to the default Locale (by default in lower case). * @param initialCapacity the initial capacity - * @see java.lang.String#toLowerCase() + * @see #convertKey(String) */ public LinkedCaseInsensitiveMap(int initialCapacity) { this(initialCapacity, null); @@ -79,11 +80,11 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable /** * Create a new LinkedCaseInsensitiveMap that wraps a {@link LinkedHashMap} - * with the given initial capacity and stores lower-case keys according - * to the given Locale. + * with the given initial capacity and stores case-insensitive keys + * according to the given Locale (by default in lower case). * @param initialCapacity the initial capacity - * @param locale the Locale to use for lower-case conversion - * @see java.lang.String#toLowerCase(java.util.Locale) + * @param locale the Locale to use for case-insensitive key conversion + * @see #convertKey(String) */ public LinkedCaseInsensitiveMap(int initialCapacity, @Nullable Locale locale) { this.targetMap = new LinkedHashMap(initialCapacity) { @@ -115,6 +116,8 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable } + // Implementation of java.util.Map + @Override public int size() { return this.targetMap.size(); @@ -159,7 +162,7 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable } @Override - public V put(String key, V value) { + public V put(String key, @Nullable V value) { String oldKey = this.caseInsensitiveKeys.put(convertKey(key), key); if (oldKey != null && !oldKey.equals(key)) { this.targetMap.remove(oldKey); @@ -229,16 +232,29 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable } + // Specific to LinkedCaseInsensitiveMap + + /** + * Return the locale used by this {@code LinkedCaseInsensitiveMap}. + * Used for case-insensitive key conversion. + * @since 4.3.10 + * @see #LinkedCaseInsensitiveMap(Locale) + * @see #convertKey(String) + */ + public Locale getLocale() { + return this.locale; + } + /** * Convert the given key to a case-insensitive key. *

The default implementation converts the key * to lower-case according to this Map's Locale. * @param key the user-specified key * @return the key to use for storing - * @see java.lang.String#toLowerCase(java.util.Locale) + * @see String#toLowerCase(Locale) */ protected String convertKey(String key) { - return key.toLowerCase(this.locale); + return key.toLowerCase(getLocale()); } /** 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 369e1b50266..e632c28ea27 100644 --- a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java @@ -108,12 +108,15 @@ public class LinkedCaseInsensitiveMapTests { public void mapClone() { map.put("key", "value1"); LinkedCaseInsensitiveMap copy = map.clone(); + + assertEquals(map.getLocale(), copy.getLocale()); 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());