src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java
changeset 49918 8b9c78f0a712
parent 49904 cadca99d52e7
child 50974 24bf1bd23725
equal deleted inserted replaced
49917:1871c5d07caf 49918:8b9c78f0a712
    62     // Assumption: CLDR has only one non-Base module.
    62     // Assumption: CLDR has only one non-Base module.
    63     private final LocaleDataMetaInfo nonBaseMetaInfo;
    63     private final LocaleDataMetaInfo nonBaseMetaInfo;
    64 
    64 
    65     // parent locales map
    65     // parent locales map
    66     private static volatile Map<Locale, Locale> parentLocalesMap;
    66     private static volatile Map<Locale, Locale> parentLocalesMap;
       
    67     // language aliases map
       
    68     private static volatile Map<String,String> langAliasesMap;
       
    69     // cache to hold  locale to locale mapping for language aliases.
       
    70     private static final Map<Locale, Locale> langAliasesCache;
    67     static {
    71     static {
    68         parentLocalesMap = new ConcurrentHashMap<>();
    72         parentLocalesMap = new ConcurrentHashMap<>();
       
    73         langAliasesMap = new ConcurrentHashMap<>();
       
    74         langAliasesCache = new ConcurrentHashMap<>();
    69         // Assuming these locales do NOT have irregular parent locales.
    75         // Assuming these locales do NOT have irregular parent locales.
    70         parentLocalesMap.put(Locale.ROOT, Locale.ROOT);
    76         parentLocalesMap.put(Locale.ROOT, Locale.ROOT);
    71         parentLocalesMap.put(Locale.ENGLISH, Locale.ENGLISH);
    77         parentLocalesMap.put(Locale.ENGLISH, Locale.ENGLISH);
    72         parentLocalesMap.put(Locale.US, Locale.US);
    78         parentLocalesMap.put(Locale.US, Locale.US);
    73     }
    79     }
   158             locs[index++] = Locale.forLanguageTag(tag);
   164             locs[index++] = Locale.forLanguageTag(tag);
   159         }
   165         }
   160         return locs;
   166         return locs;
   161     }
   167     }
   162 
   168 
       
   169     private Locale applyAliases(Locale loc) {
       
   170         if (langAliasesMap.isEmpty()) {
       
   171             langAliasesMap = baseMetaInfo.getLanguageAliasMap();
       
   172         }
       
   173         Locale locale = langAliasesCache.get(loc);
       
   174         if (locale == null) {
       
   175             String locTag = loc.toLanguageTag();
       
   176             Locale aliasLocale = langAliasesMap.containsKey(locTag)
       
   177                     ? Locale.forLanguageTag(langAliasesMap.get(locTag)) : loc;
       
   178             langAliasesCache.putIfAbsent(loc, aliasLocale);
       
   179             return aliasLocale;
       
   180         } else {
       
   181             return locale;
       
   182         }
       
   183     }
       
   184 
   163     @Override
   185     @Override
   164     protected Set<String> createLanguageTagSet(String category) {
   186     protected Set<String> createLanguageTagSet(String category) {
   165         // Assume all categories support the same set as AvailableLocales
   187         // Assume all categories support the same set as AvailableLocales
   166         // in CLDR adapter.
   188         // in CLDR adapter.
   167         category = "AvailableLocales";
   189         category = "AvailableLocales";
   192     }
   214     }
   193 
   215 
   194     // Implementation of ResourceBundleBasedAdapter
   216     // Implementation of ResourceBundleBasedAdapter
   195     @Override
   217     @Override
   196     public List<Locale> getCandidateLocales(String baseName, Locale locale) {
   218     public List<Locale> getCandidateLocales(String baseName, Locale locale) {
   197         List<Locale> candidates = super.getCandidateLocales(baseName, locale);
   219         List<Locale> candidates = super.getCandidateLocales(baseName, applyAliases(locale));
   198         return applyParentLocales(baseName, candidates);
   220         return applyParentLocales(baseName, candidates);
   199     }
   221     }
   200 
   222 
   201     private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
   223     private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
   202         // check irregular parents
   224         // check irregular parents