]> granicus.if.org Git - icu/commitdiff
ICU-12533 Loading capitilization context for LocaleDisplayNames using data sink.
authorShane Carr <shane@unicode.org>
Sun, 29 May 2016 23:44:49 +0000 (23:44 +0000)
committerShane Carr <shane@unicode.org>
Sun, 29 May 2016 23:44:49 +0000 (23:44 +0000)
X-SVN-Rev: 38771

icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java

index 65715cff9de234c028b49c31d5cf840496446a4d..457d4fdf644ae1411bae1cc9322559ee799c6485 100644 (file)
@@ -29,7 +29,6 @@ import com.ibm.icu.text.DisplayContext.Type;
 import com.ibm.icu.text.LocaleDisplayNames;
 import com.ibm.icu.util.ULocale;
 import com.ibm.icu.util.UResourceBundle;
-import com.ibm.icu.util.UResourceBundleIterator;
 
 public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
     private final ULocale locale;
@@ -97,6 +96,30 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
         }
     }
 
+    private final class CapitalizationContextSink extends UResource.Sink {
+        boolean hasCapitalizationUsage = false;
+
+        @Override
+        public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
+            UResource.Table contextsTable = value.getTable();
+            for (int i = 0; contextsTable.getKeyAndValue(i, key, value); ++i) {
+
+                CapitalizationContextUsage usage = contextUsageTypeMap.get(key.toString());
+                if (usage == null) { continue; };
+
+                int[] intVector = value.getIntVector();
+                if (intVector.length < 2) { continue; }
+
+                int titlecaseInt = (capitalization == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU)
+                        ? intVector[0] : intVector[1];
+                if (titlecaseInt == 0) { continue; }
+
+                capitalizationUsage[usage.ordinal()] = true;
+                hasCapitalizationUsage = true;
+            }
+        }
+    }
+
     public LocaleDisplayNamesImpl(ULocale locale, DialectHandling dialectHandling) {
         this(locale, (dialectHandling==DialectHandling.STANDARD_NAMES)? DisplayContext.STANDARD_NAMES: DisplayContext.DIALECT_NAMES,
                 DisplayContext.CAPITALIZATION_NONE);
@@ -173,32 +196,14 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
                 capitalization == DisplayContext.CAPITALIZATION_FOR_STANDALONE) {
             capitalizationUsage = new boolean[CapitalizationContextUsage.values().length]; // initialized to all false
             ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale);
-            UResourceBundle contextTransformsBundle = null;
+            CapitalizationContextSink sink = new CapitalizationContextSink();
             try {
-                contextTransformsBundle = (UResourceBundle)rb.getWithFallback("contextTransforms");
+                rb.getAllItemsWithFallback("contextTransforms", sink);
             }
             catch (MissingResourceException e) {
-                contextTransformsBundle = null; // probably redundant
-            }
-            if (contextTransformsBundle != null) {
-                UResourceBundleIterator ctIterator = contextTransformsBundle.getIterator();
-                while ( ctIterator.hasNext() ) {
-                    UResourceBundle contextTransformUsage = ctIterator.next();
-                    int[] intVector = contextTransformUsage.getIntVector();
-                    if (intVector.length >= 2) {
-                        String usageKey = contextTransformUsage.getKey();
-                        CapitalizationContextUsage usage = contextUsageTypeMap.get(usageKey);
-                        if (usage != null) {
-                            int titlecaseInt = (capitalization == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU)?
-                                    intVector[0]: intVector[1];
-                                    if (titlecaseInt != 0) {
-                                        capitalizationUsage[usage.ordinal()] = true;
-                                        needBrkIter = true;
-                                    }
-                        }
-                    }
-                }
+                // Silently ignore.  Not every locale has contextTransforms.
             }
+            needBrkIter = sink.hasCapitalizationUsage;
         }
         // Get a sentence break iterator if we will need it
         if (needBrkIter || capitalization == DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) {