Backport COLLECTIONS-294 to 3.2.2. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/branches/COLLECTIONS_3_2_X@1713181 13f79535-47bb-0310-9956-ffa450edef68
Project: http://git-wip-us.apache.org/repos/asf/commons-collections/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-collections/commit/eb693a74 Tree: http://git-wip-us.apache.org/repos/asf/commons-collections/tree/eb693a74 Diff: http://git-wip-us.apache.org/repos/asf/commons-collections/diff/eb693a74 Branch: refs/heads/COLLECTIONS_3_2_X Commit: eb693a74697659d226b5e4058d3c0e0313e46d07 Parents: c274882 Author: Thomas Neidhart <t...@apache.org> Authored: Sat Nov 7 21:17:00 2015 +0000 Committer: Thomas Neidhart <t...@apache.org> Committed: Sat Nov 7 21:17:00 2015 +0000 ---------------------------------------------------------------------- src/changes/changes.xml | 8 +++--- .../collections/map/CaseInsensitiveMap.java | 16 ++++++----- .../collections/map/TestCaseInsensitiveMap.java | 28 +++++++++++++++++++- 3 files changed, 41 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-collections/blob/eb693a74/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8695e33..66cee68 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -29,6 +29,10 @@ <action issue="COLLECTIONS-335" dev="jochen" type="fix" due-to="sebb"> Fixed cache assignment for "TreeBidiMap#entrySet". </action> + <action issue="COLLECTIONS-294" dev="bayard" type="fix" due-to="Benjamin Bentmann"> + "CaseInsensitiveMap" will now convert input strings to lower-case in a + locale-independent manner. + </action> <action issue="COLLECTIONS-266" dev="bayard" type="fix" due-to="Joerg Schaible"> "MultiKey" will now be correctly serialized/de-serialized. </action> @@ -71,10 +75,6 @@ <action issue="COLLECTIONS-304" dev="bayard" type="fix" due-to="RafaÅ Figas,Bjorn Townsend"> "SetUniqueList#set(int, Object)" will now correctly enforce the uniqueness constraint. </action> - <action issue="COLLECTIONS-294" dev="bayard" type="fix" due-to="Benjamin Bentmann"> - "CaseInsensitiveMap" will now convert input strings to lower-case in a - locale-independant manner. - </action> <action issue="COLLECTIONS-261" dev="bayard" type="fix" due-to="ori"> "Flat3Map#remove(Object)" will now return the correct value mapped to the removed key if the size of the map is less or equal 3. http://git-wip-us.apache.org/repos/asf/commons-collections/blob/eb693a74/src/java/org/apache/commons/collections/map/CaseInsensitiveMap.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/commons/collections/map/CaseInsensitiveMap.java b/src/java/org/apache/commons/collections/map/CaseInsensitiveMap.java index ba9650d..237c05a 100644 --- a/src/java/org/apache/commons/collections/map/CaseInsensitiveMap.java +++ b/src/java/org/apache/commons/collections/map/CaseInsensitiveMap.java @@ -25,9 +25,9 @@ import java.util.Map; /** * A case-insensitive <code>Map</code>. * <p> - * As entries are added to the map, keys are converted to all lowercase. A new - * key is compared to existing keys by comparing <code>newKey.toString().toLower()</code> - * to the lowercase values in the current <code>KeySet.</code> + * Before keys are added to the map or compared to other existing keys, they are converted + * to all lowercase in a locale-independent fashion by using information from the Unicode + * data file. * <p> * Null keys are supported. * <p> @@ -111,14 +111,18 @@ public class CaseInsensitiveMap extends AbstractHashedMap implements Serializabl * Overrides convertKey() from {@link AbstractHashedMap} to convert keys to * lower case. * <p> - * Returns null if key is null. - * + * Returns {@link AbstractHashedMap#NULL} if key is null. + * * @param key the key convert * @return the converted key */ protected Object convertKey(Object key) { if (key != null) { - return key.toString().toLowerCase(); + char[] chars = key.toString().toCharArray(); + for (int i = chars.length - 1; i >= 0; i--) { + chars[i] = Character.toLowerCase(Character.toUpperCase(chars[i])); + } + return new String(chars); } else { return AbstractHashedMap.NULL; } http://git-wip-us.apache.org/repos/asf/commons-collections/blob/eb693a74/src/test/org/apache/commons/collections/map/TestCaseInsensitiveMap.java ---------------------------------------------------------------------- diff --git a/src/test/org/apache/commons/collections/map/TestCaseInsensitiveMap.java b/src/test/org/apache/commons/collections/map/TestCaseInsensitiveMap.java index b3f27a5..0b7266e 100644 --- a/src/test/org/apache/commons/collections/map/TestCaseInsensitiveMap.java +++ b/src/test/org/apache/commons/collections/map/TestCaseInsensitiveMap.java @@ -17,6 +17,7 @@ package org.apache.commons.collections.map; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -108,7 +109,32 @@ public class TestCaseInsensitiveMap extends AbstractTestIterableMap { assertEquals(map.size(), cloned.size()); assertSame(map.get("1"), cloned.get("1")); } - + + // COLLECTIONS-294 + public void testLocaleIndependence() { + Locale orig = Locale.getDefault(); + Locale[] locales = { Locale.ENGLISH, new Locale("tr"), Locale.getDefault() }; + String[][] data = { + { "i", "I" }, + { "\u03C2", "\u03C3" }, + { "\u03A3", "\u03C2" }, + { "\u03A3", "\u03C3" }, + }; + try { + for (int i = 0; i < locales.length; i++) { + Locale.setDefault(locales[i]); + for (int j = 0; j < data.length; j++) { + assertTrue("Test data corrupt: " + j, data[j][0].equalsIgnoreCase(data[j][1])); + CaseInsensitiveMap map = new CaseInsensitiveMap(); + map.put(data[j][0], "value"); + assertEquals(Locale.getDefault() + ": " + j, "value", map.get(data[j][1])); + } + } + } finally { + Locale.setDefault(orig); + } + } + /* public void testCreate() throws Exception { resetEmpty();