From f2cf8cd5ac64a14c68361c41f3fa26a6c2d2bf77 Mon Sep 17 00:00:00 2001 From: Shane Carr Date: Sun, 29 May 2016 23:44:49 +0000 Subject: [PATCH] ICU-12533 Loading capitilization context for LocaleDisplayNames using data sink. X-SVN-Rev: 38771 --- .../ibm/icu/impl/LocaleDisplayNamesImpl.java | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java index 65715cff9de..457d4fdf644 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java @@ -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) { -- 2.40.0