Applying Benjamin Bentmann's second patch from COLLECTIONS-294, fixing the locale issue in CaseInsensitiveMap by converting each character individually and not using toLowerCase

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/trunk@711168 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Henri Yandell 2008-11-04 03:58:37 +00:00
parent f3eaf2ceae
commit 0725e476d4
2 changed files with 39 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;
@ -117,4 +118,33 @@ public class TestCaseInsensitiveMap extends AbstractTestIterableMap {
writeExternalFormToDisk((java.io.Serializable) map, "/home/phil/jakarta-commons/collections/data/test/CaseInsensitiveMap.fullCollection.version3.obj");
}
*/
// 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);
}
}
}