Path: blob/master/src/java.base/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java
41161 views
/*1* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package sun.util.locale.provider;2627import java.security.AccessController;28import java.security.PrivilegedAction;29import java.text.spi.BreakIteratorProvider;30import java.text.spi.CollatorProvider;31import java.text.spi.DateFormatProvider;32import java.text.spi.DateFormatSymbolsProvider;33import java.text.spi.DecimalFormatSymbolsProvider;34import java.text.spi.NumberFormatProvider;35import java.util.ArrayList;36import java.util.Arrays;37import java.util.List;38import java.util.Locale;39import java.util.concurrent.ConcurrentHashMap;40import java.util.concurrent.ConcurrentMap;41import java.util.spi.CalendarDataProvider;42import java.util.spi.CalendarNameProvider;43import java.util.spi.CurrencyNameProvider;44import java.util.spi.LocaleNameProvider;45import java.util.spi.LocaleServiceProvider;46import java.util.spi.TimeZoneNameProvider;47import sun.text.spi.JavaTimeDateTimePatternProvider;48import sun.util.spi.CalendarProvider;4950/**51* An abstract parent class for the52* HostLocaleProviderAdapter/SPILocaleProviderAdapter.53*54* @author Naoto Sato55* @author Masayoshi Okutsu56*/57public abstract class AuxLocaleProviderAdapter extends LocaleProviderAdapter {58/**59* SPI implementations map60*/61private final ConcurrentMap<Class<? extends LocaleServiceProvider>, LocaleServiceProvider> providersMap =62new ConcurrentHashMap<>();6364/**65* Getter method for Locale Service Providers66*/67@Override68public <P extends LocaleServiceProvider> P getLocaleServiceProvider(Class<P> c) {69@SuppressWarnings("unchecked")70P lsp = (P) providersMap.get(c);71if (lsp == null) {72lsp = findInstalledProvider(c);73providersMap.putIfAbsent(c, lsp == null ? NULL_PROVIDER : lsp);74}7576return lsp;77}7879/**80* Real body to find an implementation for each SPI.81*82* @param <P>83* @param c84* @return85*/86protected abstract <P extends LocaleServiceProvider> P findInstalledProvider(final Class<P> c);8788@Override89public BreakIteratorProvider getBreakIteratorProvider() {90return getLocaleServiceProvider(BreakIteratorProvider.class);91}9293@Override94public CollatorProvider getCollatorProvider() {95return getLocaleServiceProvider(CollatorProvider.class);96}9798@Override99public DateFormatProvider getDateFormatProvider() {100return getLocaleServiceProvider(DateFormatProvider.class);101}102103@Override104public DateFormatSymbolsProvider getDateFormatSymbolsProvider() {105return getLocaleServiceProvider(DateFormatSymbolsProvider.class);106}107108@Override109public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() {110return getLocaleServiceProvider(DecimalFormatSymbolsProvider.class);111}112113@Override114public NumberFormatProvider getNumberFormatProvider() {115return getLocaleServiceProvider(NumberFormatProvider.class);116}117118/**119* Getter methods for java.util.spi.* providers120*/121@Override122public CurrencyNameProvider getCurrencyNameProvider() {123return getLocaleServiceProvider(CurrencyNameProvider.class);124}125126@Override127public LocaleNameProvider getLocaleNameProvider() {128return getLocaleServiceProvider(LocaleNameProvider.class);129}130131@Override132public TimeZoneNameProvider getTimeZoneNameProvider() {133return getLocaleServiceProvider(TimeZoneNameProvider.class);134}135136@Override137public CalendarDataProvider getCalendarDataProvider() {138return getLocaleServiceProvider(CalendarDataProvider.class);139}140141@Override142public CalendarNameProvider getCalendarNameProvider() {143return getLocaleServiceProvider(CalendarNameProvider.class);144}145146/**147* Getter methods for sun.util.spi.* providers148*/149@Override150public CalendarProvider getCalendarProvider() {151return getLocaleServiceProvider(CalendarProvider.class);152}153154@Override155public LocaleResources getLocaleResources(Locale locale) {156return null;157}158159@Override160public JavaTimeDateTimePatternProvider getJavaTimeDateTimePatternProvider() {161return getLocaleServiceProvider(JavaTimeDateTimePatternProvider.class);162}163164private static Locale[] availableLocales = null;165166@Override167public Locale[] getAvailableLocales() {168if (availableLocales == null) {169List<Locale> avail = new ArrayList<>();170for (Class<? extends LocaleServiceProvider> c :171LocaleServiceProviderPool.spiClasses) {172LocaleServiceProvider lsp = getLocaleServiceProvider(c);173if (lsp != null) {174avail.addAll(Arrays.asList(lsp.getAvailableLocales()));175}176}177availableLocales = avail.toArray(new Locale[0]);178}179180// assuming caller won't mutate the array.181return availableLocales;182}183184/**185* A dummy locale service provider that indicates there is no186* provider available187*/188@SuppressWarnings("removal")189private static final NullProvider NULL_PROVIDER = AccessController.doPrivileged(190(PrivilegedAction<NullProvider>) () -> new NullProvider());191192private static class NullProvider extends LocaleServiceProvider {193@Override194public Locale[] getAvailableLocales() {195return new Locale[0];196}197}198}199200201