am cac5dab2: Merge "Fix getISO3Country and getISO3Language."
* commit 'cac5dab299b4e83dbf9c41c1d253a427828d127b':
Fix getISO3Country and getISO3Language.
diff --git a/luni/src/main/java/java/util/Locale.java b/luni/src/main/java/java/util/Locale.java
index b59385b..a3eaf21 100644
--- a/luni/src/main/java/java/util/Locale.java
+++ b/luni/src/main/java/java/util/Locale.java
@@ -1167,7 +1167,10 @@
* @throws MissingResourceException if there's no 3-letter country code for this locale.
*/
public String getISO3Country() {
- String code = ICU.getISO3Country(this);
+ // The results of getISO3Country do not depend on the languageCode,
+ // so we pass an arbitrarily selected language code here. This guards
+ // against errors caused by malformed or invalid language codes.
+ String code = ICU.getISO3Country("en-" + countryCode);
if (!countryCode.isEmpty() && code.isEmpty()) {
throw new MissingResourceException("No 3-letter country code for locale: " + this, "FormatData_" + this, "ShortCountry");
}
@@ -1187,8 +1190,9 @@
return "";
}
- String code = ICU.getISO3Language(this);
-
+ // The results of getISO3Language do not depend on the country code
+ // or any of the other locale fields, so we pass just the language here.
+ String code = ICU.getISO3Language(languageCode);
if (!languageCode.isEmpty() && code.isEmpty()) {
throw new MissingResourceException("No 3-letter language code for locale: " + this, "FormatData_" + this, "ShortLanguage");
}
diff --git a/luni/src/main/java/libcore/icu/ICU.java b/luni/src/main/java/libcore/icu/ICU.java
index 407ebfd..5978a5b 100644
--- a/luni/src/main/java/libcore/icu/ICU.java
+++ b/luni/src/main/java/libcore/icu/ICU.java
@@ -434,17 +434,9 @@
private static native String getDisplayScriptNative(String targetLanguageTag, String languageTag);
- public static String getISO3Country(Locale locale) {
- return getISO3CountryNative(locale.toLanguageTag());
- }
+ public static native String getISO3Country(String languageTag);
- private static native String getISO3CountryNative(String languageTag);
-
- public static String getISO3Language(Locale locale) {
- return getISO3LanguageNative(locale.toLanguageTag());
- }
-
- private static native String getISO3LanguageNative(String languageTag);
+ public static native String getISO3Language(String languageTag);
public static native String addLikelySubtags(String locale);
public static native String getScript(String locale);
diff --git a/luni/src/main/native/libcore_icu_ICU.cpp b/luni/src/main/native/libcore_icu_ICU.cpp
index 8cf58bc..163d19c 100644
--- a/luni/src/main/native/libcore_icu_ICU.cpp
+++ b/luni/src/main/native/libcore_icu_ICU.cpp
@@ -328,7 +328,7 @@
return env->NewString(str.getBuffer(), str.length());
}
-static jstring ICU_getISO3CountryNative(JNIEnv* env, jclass, jstring javaLanguageTag) {
+static jstring ICU_getISO3Country(JNIEnv* env, jclass, jstring javaLanguageTag) {
ScopedIcuLocale icuLocale(env, javaLanguageTag);
if (!icuLocale.valid()) {
return NULL;
@@ -336,7 +336,7 @@
return env->NewStringUTF(icuLocale.locale().getISO3Country());
}
-static jstring ICU_getISO3LanguageNative(JNIEnv* env, jclass, jstring javaLanguageTag) {
+static jstring ICU_getISO3Language(JNIEnv* env, jclass, jstring javaLanguageTag) {
ScopedIcuLocale icuLocale(env, javaLanguageTag);
if (!icuLocale.valid()) {
return NULL;
@@ -813,8 +813,8 @@
NATIVE_METHOD(ICU, getDisplayLanguageNative, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"),
NATIVE_METHOD(ICU, getDisplayScriptNative, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"),
NATIVE_METHOD(ICU, getDisplayVariantNative, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"),
- NATIVE_METHOD(ICU, getISO3CountryNative, "(Ljava/lang/String;)Ljava/lang/String;"),
- NATIVE_METHOD(ICU, getISO3LanguageNative, "(Ljava/lang/String;)Ljava/lang/String;"),
+ NATIVE_METHOD(ICU, getISO3Country, "(Ljava/lang/String;)Ljava/lang/String;"),
+ NATIVE_METHOD(ICU, getISO3Language, "(Ljava/lang/String;)Ljava/lang/String;"),
NATIVE_METHOD(ICU, getISOCountriesNative, "()[Ljava/lang/String;"),
NATIVE_METHOD(ICU, getISOLanguagesNative, "()[Ljava/lang/String;"),
NATIVE_METHOD(ICU, getIcuVersion, "()Ljava/lang/String;"),
diff --git a/luni/src/test/java/libcore/java/util/LocaleTest.java b/luni/src/test/java/libcore/java/util/LocaleTest.java
index 0512b13..f3b31bb 100644
--- a/luni/src/test/java/libcore/java/util/LocaleTest.java
+++ b/luni/src/test/java/libcore/java/util/LocaleTest.java
@@ -186,6 +186,10 @@
assertEquals("CAN", new Locale("", "CA").getISO3Country());
assertEquals("CAN", new Locale("en", "CA").getISO3Country());
assertEquals("CAN", new Locale("xx", "CA").getISO3Country());
+
+ // 3 letter country codes.
+ assertEquals("CAN", new Locale("en", "CAN").getISO3Country());
+ assertEquals("CAN", new Locale("frankenderp", "CAN").getISO3Country());
}
public void test_getISO3Language() {
@@ -205,6 +209,10 @@
assertEquals("eng", new Locale("en", "").getISO3Language());
assertEquals("eng", new Locale("en", "CA").getISO3Language());
assertEquals("eng", new Locale("en", "XX").getISO3Language());
+
+ // 3 letter language code.
+ assertEquals("eng", new Locale("eng", "USA").getISO3Language());
+ assertEquals("eng", new Locale("eng", "US").getISO3Language());
}
public void test_Builder_setLanguage() {