From: Yoshito Umaoka Date: Tue, 14 Mar 2017 21:11:57 +0000 (+0000) Subject: ICU-12724 Do not lazily initialize CANONICAL_MAP / variantsToKeywords with potentiall... X-Git-Tag: release-59-rc~111 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48687762500e23de83e7eb8b9e21f1466aa94e59;p=icu ICU-12724 Do not lazily initialize CANONICAL_MAP / variantsToKeywords with potentially problematic initialization code. X-SVN-Rev: 39802 --- diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java b/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java index 7332d6ee14f..4d5a31f7ac6 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java @@ -336,96 +336,75 @@ public final class ULocale implements Serializable, Comparable { private transient volatile BaseLocale baseLocale; private transient volatile LocaleExtensions extensions; + /** + * This table lists pairs of locale ids for canonicalization. The + * The 1st item is the normalized id. The 2nd item is the + * canonicalized id. The 3rd is the keyword. The 4th is the keyword value. + */ + private static String[][] CANONICALIZE_MAP = { + { "C", "en_US_POSIX", null, null }, /* POSIX name */ + { "art_LOJBAN", "jbo", null, null }, /* registered name */ + { "az_AZ_CYRL", "az_Cyrl_AZ", null, null }, /* .NET name */ + { "az_AZ_LATN", "az_Latn_AZ", null, null }, /* .NET name */ + { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" }, + { "cel_GAULISH", "cel__GAULISH", null, null }, /* registered name */ + { "de_1901", "de__1901", null, null }, /* registered name */ + { "de_1906", "de__1906", null, null }, /* registered name */ + { "de__PHONEBOOK", "de", "collation", "phonebook" }, /* Old ICU name */ + { "de_AT_PREEURO", "de_AT", "currency", "ATS" }, + { "de_DE_PREEURO", "de_DE", "currency", "DEM" }, + { "de_LU_PREEURO", "de_LU", "currency", "EUR" }, + { "el_GR_PREEURO", "el_GR", "currency", "GRD" }, + { "en_BOONT", "en__BOONT", null, null }, /* registered name */ + { "en_SCOUSE", "en__SCOUSE", null, null }, /* registered name */ + { "en_BE_PREEURO", "en_BE", "currency", "BEF" }, + { "en_IE_PREEURO", "en_IE", "currency", "IEP" }, + { "es__TRADITIONAL", "es", "collation", "traditional" }, /* Old ICU name */ + { "es_ES_PREEURO", "es_ES", "currency", "ESP" }, + { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" }, + { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" }, + { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" }, + { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" }, + { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" }, + { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" }, + { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" }, + { "hi__DIRECT", "hi", "collation", "direct" }, /* Old ICU name */ + { "it_IT_PREEURO", "it_IT", "currency", "ITL" }, + { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, + //{ "nb_NO_NY", "nn_NO", null, null }, + { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" }, + { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, + { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, + { "sl_ROZAJ", "sl__ROZAJ", null, null }, /* registered name */ + { "sr_SP_CYRL", "sr_Cyrl_RS", null, null }, /* .NET name */ + { "sr_SP_LATN", "sr_Latn_RS", null, null }, /* .NET name */ + { "sr_YU_CYRILLIC", "sr_Cyrl_RS", null, null }, /* Linux name */ + { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, /* Old ICU name */ + { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", null, null }, /* Linux name */ + { "uz_UZ_CYRL", "uz_Cyrl_UZ", null, null }, /* .NET name */ + { "uz_UZ_LATN", "uz_Latn_UZ", null, null }, /* .NET name */ + { "zh_CHS", "zh_Hans", null, null }, /* .NET name */ + { "zh_CHT", "zh_Hant", null, null }, /* .NET name */ + { "zh_GAN", "zh__GAN", null, null }, /* registered name */ + { "zh_GUOYU", "zh", null, null }, /* registered name */ + { "zh_HAKKA", "zh__HAKKA", null, null }, /* registered name */ + { "zh_MIN", "zh__MIN", null, null }, /* registered name */ + { "zh_MIN_NAN", "zh__MINNAN", null, null }, /* registered name */ + { "zh_WUU", "zh__WUU", null, null }, /* registered name */ + { "zh_XIANG", "zh__XIANG", null, null }, /* registered name */ + { "zh_YUE", "zh__YUE", null, null } /* registered name */ + }; - private static String[][] CANONICALIZE_MAP; - private static String[][] variantsToKeywords; + /** + * This table lists pairs of locale ids for canonicalization. + * The first item is the normalized variant id. + */ + private static String[][] variantsToKeywords = { + { "EURO", "currency", "EUR" }, + { "PINYIN", "collation", "pinyin" }, /* Solaris variant */ + { "STROKE", "collation", "stroke" } /* Solaris variant */ + }; - private static void initCANONICALIZE_MAP() { - if (CANONICALIZE_MAP == null) { - /** - * This table lists pairs of locale ids for canonicalization. The - * The 1st item is the normalized id. The 2nd item is the - * canonicalized id. The 3rd is the keyword. The 4th is the keyword value. - */ - String[][] tempCANONICALIZE_MAP = { - // { EMPTY_STRING, "en_US_POSIX", null, null }, /* .NET name */ - { "C", "en_US_POSIX", null, null }, /* POSIX name */ - { "art_LOJBAN", "jbo", null, null }, /* registered name */ - { "az_AZ_CYRL", "az_Cyrl_AZ", null, null }, /* .NET name */ - { "az_AZ_LATN", "az_Latn_AZ", null, null }, /* .NET name */ - { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" }, - { "cel_GAULISH", "cel__GAULISH", null, null }, /* registered name */ - { "de_1901", "de__1901", null, null }, /* registered name */ - { "de_1906", "de__1906", null, null }, /* registered name */ - { "de__PHONEBOOK", "de", "collation", "phonebook" }, /* Old ICU name */ - { "de_AT_PREEURO", "de_AT", "currency", "ATS" }, - { "de_DE_PREEURO", "de_DE", "currency", "DEM" }, - { "de_LU_PREEURO", "de_LU", "currency", "EUR" }, - { "el_GR_PREEURO", "el_GR", "currency", "GRD" }, - { "en_BOONT", "en__BOONT", null, null }, /* registered name */ - { "en_SCOUSE", "en__SCOUSE", null, null }, /* registered name */ - { "en_BE_PREEURO", "en_BE", "currency", "BEF" }, - { "en_IE_PREEURO", "en_IE", "currency", "IEP" }, - { "es__TRADITIONAL", "es", "collation", "traditional" }, /* Old ICU name */ - { "es_ES_PREEURO", "es_ES", "currency", "ESP" }, - { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" }, - { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" }, - { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" }, - { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" }, - { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" }, - { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" }, - { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" }, - { "hi__DIRECT", "hi", "collation", "direct" }, /* Old ICU name */ - { "it_IT_PREEURO", "it_IT", "currency", "ITL" }, - { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, - // { "nb_NO_NY", "nn_NO", null, null }, - { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" }, - { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, - { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, - { "sl_ROZAJ", "sl__ROZAJ", null, null }, /* registered name */ - { "sr_SP_CYRL", "sr_Cyrl_RS", null, null }, /* .NET name */ - { "sr_SP_LATN", "sr_Latn_RS", null, null }, /* .NET name */ - { "sr_YU_CYRILLIC", "sr_Cyrl_RS", null, null }, /* Linux name */ - { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, /* Old ICU name */ - { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", null, null }, /* Linux name */ - { "uz_UZ_CYRL", "uz_Cyrl_UZ", null, null }, /* .NET name */ - { "uz_UZ_LATN", "uz_Latn_UZ", null, null }, /* .NET name */ - { "zh_CHS", "zh_Hans", null, null }, /* .NET name */ - { "zh_CHT", "zh_Hant", null, null }, /* .NET name */ - { "zh_GAN", "zh__GAN", null, null }, /* registered name */ - { "zh_GUOYU", "zh", null, null }, /* registered name */ - { "zh_HAKKA", "zh__HAKKA", null, null }, /* registered name */ - { "zh_MIN", "zh__MIN", null, null }, /* registered name */ - { "zh_MIN_NAN", "zh__MINNAN", null, null }, /* registered name */ - { "zh_WUU", "zh__WUU", null, null }, /* registered name */ - { "zh_XIANG", "zh__XIANG", null, null }, /* registered name */ - { "zh_YUE", "zh__YUE", null, null } /* registered name */ - }; - - synchronized (ULocale.class) { - if (CANONICALIZE_MAP == null) { - CANONICALIZE_MAP = tempCANONICALIZE_MAP; - } - } - } - if (variantsToKeywords == null) { - /** - * This table lists pairs of locale ids for canonicalization. The - * The first item is the normalized variant id. - */ - String[][] tempVariantsToKeywords = { - { "EURO", "currency", "EUR" }, - { "PINYIN", "collation", "pinyin" }, /* Solaris variant */ - { "STROKE", "collation", "stroke" } /* Solaris variant */ - }; - - synchronized (ULocale.class) { - if (variantsToKeywords == null) { - variantsToKeywords = tempVariantsToKeywords; - } - } - } - } /** * Private constructor used by static initializers. @@ -1254,8 +1233,6 @@ public final class ULocale implements Serializable, Comparable { // we have an ID in the form xx_Yyyy_ZZ_KKKKK - initCANONICALIZE_MAP(); - /* convert the variants to appropriate ID */ for (int i = 0; i < variantsToKeywords.length; i++) { String[] vals = variantsToKeywords[i];