]> granicus.if.org Git - icu/commitdiff
ICU-9125 Check for fallback, odd locales; clean up constructors.
authorMark Davis <mark@macchiato.com>
Tue, 21 Feb 2012 00:56:17 +0000 (00:56 +0000)
committerMark Davis <mark@macchiato.com>
Tue, 21 Feb 2012 00:56:17 +0000 (00:56 +0000)
X-SVN-Rev: 31456

icu4j/main/classes/core/src/com/ibm/icu/util/GenderInfo.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/GenderInfoTest.java

index bf247fa4cdccba29cbbc61bb11fda9e2d2f094a2..2325e5e0e3d45e06db61e6c639443d52eb76fe3c 100644 (file)
@@ -35,10 +35,19 @@ public class GenderInfo {
      * @param uLocale desired locale
      * @internal
      */
-    public GenderInfo(ULocale uLocale) {
-        ULocale language = new ULocale(uLocale.getLanguage());  // in the hard coded data, the language is sufficient. Will change with RB.
-        ListGenderStyle tempStyle = localeToListGender.get(language);
-        style = tempStyle == null ? ListGenderStyle.NEUTRAL : tempStyle;
+    public static GenderInfo getInstance(ULocale uLocale) {
+        // These can be cached, since they are read-only
+        // poor-man's locale lookup, for hardcoded data
+        while (true) {
+            GenderInfo data = localeToListGender.get(uLocale);
+            if (data != null) {
+                return data;
+            }
+            uLocale = uLocale.getFallback();
+            if (uLocale == null) {
+                return neutral;
+            }
+        }
     }
 
     /**
@@ -46,8 +55,8 @@ public class GenderInfo {
      * @param locale desired locale
      * @internal
      */
-    public GenderInfo(Locale locale) {
-        this(ULocale.forLocale(locale));
+    public static GenderInfo getInstance(Locale locale) {
+        return getInstance(ULocale.forLocale(locale));
     }
 
     /**
@@ -74,9 +83,9 @@ public class GenderInfo {
      * @param newULocaleToListGender replacement data, copied internally for safety.
      * @internal
      */
-    public static void setLocaleMapping(Map<ULocale,ListGenderStyle> newULocaleToListGender) {
+    public static void setLocaleMapping(Map<ULocale,GenderInfo> newULocaleToListGender) {
         localeToListGender.clear();
-        for (Entry<ULocale, ListGenderStyle> entry : newULocaleToListGender.entrySet()) {
+        for (Entry<ULocale, GenderInfo> entry : newULocaleToListGender.entrySet()) {
             localeToListGender.put(entry.getKey(), entry.getValue());
         }
     }
@@ -138,17 +147,30 @@ public class GenderInfo {
             return Gender.OTHER; 
         }
     }
+    
+    /**
+     * Only for testing and use with CLDR.
+     * @param genderStyle gender style
+     * @internal
+     */
+    public GenderInfo(ListGenderStyle genderStyle) {
+        style = genderStyle;
+    }
+    
+    private static GenderInfo neutral = new GenderInfo(ListGenderStyle.NEUTRAL);
 
     // TODO Get this data from a resource bundle generated from CLDR. 
     // For now, hard coded.
 
-    private static Map<ULocale,ListGenderStyle> localeToListGender = new HashMap<ULocale,ListGenderStyle>();
+    private static Map<ULocale,GenderInfo> localeToListGender = new HashMap<ULocale,GenderInfo>();
     static {
+        GenderInfo taints = new GenderInfo(ListGenderStyle.MALE_TAINTS);
         for (String locale : Arrays.asList("ar", "ca", "cs", "hr", "es", "fr", "he", "hi", "it", "lt", "lv", "mr", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sr", "uk", "ur", "zh")) {
-            localeToListGender.put(new ULocale(locale), ListGenderStyle.MALE_TAINTS);
+            localeToListGender.put(new ULocale(locale), taints);
         }
+        GenderInfo mixed = new GenderInfo(ListGenderStyle.MIXED_NEUTRAL);
         for (String locale : Arrays.asList("el", "is")) {
-            localeToListGender.put(new ULocale(locale), ListGenderStyle.MIXED_NEUTRAL);
+            localeToListGender.put(new ULocale(locale), mixed);
         }
     }
 }
index 2b0b0e972383aa091bddb0d72d5af1ef63967d77..1eea4f0946b89455d2d318af58a4be4d246a824e 100644 (file)
@@ -19,9 +19,9 @@ public class GenderInfoTest extends TestFmwk {
         new GenderInfoTest().run(args);
     }
 
-    public static GenderInfo NEUTRAL_LOCALE = new GenderInfo(ULocale.ENGLISH);
-    public static GenderInfo MIXED_NEUTRAL_LOCALE = new GenderInfo(new ULocale("is"));
-    public static GenderInfo MALE_TAINTS_LOCALE = new GenderInfo(ULocale.FRANCE);
+    public static GenderInfo NEUTRAL_LOCALE = GenderInfo.getInstance(ULocale.ENGLISH);
+    public static GenderInfo MIXED_NEUTRAL_LOCALE = GenderInfo.getInstance(new ULocale("is"));
+    public static GenderInfo MALE_TAINTS_LOCALE = GenderInfo.getInstance(ULocale.FRENCH);
 
     public void TestEmpty() {
         check(Gender.OTHER, Gender.OTHER);
@@ -47,4 +47,9 @@ public class GenderInfoTest extends TestFmwk {
         assertEquals("mixed neutral " + mixed0, mixed, MIXED_NEUTRAL_LOCALE.getListGender(mixed0));
         assertEquals("male taints " + mixed0, taints, MALE_TAINTS_LOCALE.getListGender(mixed0));
     }
+    
+    public void TestFallback() {
+        assertEquals("Strange locale = root", GenderInfo.getInstance(ULocale.ROOT), GenderInfo.getInstance(new ULocale("xxx")));
+        assertEquals("Strange locale = root", GenderInfo.getInstance(ULocale.FRANCE), GenderInfo.getInstance(ULocale.CANADA_FRENCH));
+    }
 }