Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java
38918 views
/*1* Copyright (c) 2012, 2013, 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.text.spi.BreakIteratorProvider;28import java.text.spi.CollatorProvider;29import java.text.spi.DateFormatProvider;30import java.text.spi.DateFormatSymbolsProvider;31import java.text.spi.DecimalFormatSymbolsProvider;32import java.text.spi.NumberFormatProvider;33import java.util.Arrays;34import java.util.HashSet;35import java.util.Locale;36import java.util.Set;37import java.util.concurrent.ConcurrentHashMap;38import java.util.concurrent.ConcurrentMap;39import java.util.spi.CalendarDataProvider;40import java.util.spi.CalendarNameProvider;41import java.util.spi.CurrencyNameProvider;42import java.util.spi.LocaleNameProvider;43import java.util.spi.LocaleServiceProvider;44import java.util.spi.TimeZoneNameProvider;45import sun.util.spi.CalendarProvider;4647/**48* An abstract parent class for the49* HostLocaleProviderAdapter/SPILocaleProviderAdapter.50*51* @author Naoto Sato52* @author Masayoshi Okutsu53*/54public abstract class AuxLocaleProviderAdapter extends LocaleProviderAdapter {55/**56* SPI implementations map57*/58private ConcurrentMap<Class<? extends LocaleServiceProvider>, LocaleServiceProvider> providersMap =59new ConcurrentHashMap<>();6061/**62* Getter method for Locale Service Providers63*/64@Override65public <P extends LocaleServiceProvider> P getLocaleServiceProvider(Class<P> c) {66@SuppressWarnings("unchecked")67P lsp = (P) providersMap.get(c);68if (lsp == null) {69lsp = findInstalledProvider(c);70providersMap.putIfAbsent(c, lsp == null ? NULL_PROVIDER : lsp);71}7273return lsp;74}7576/**77* Real body to find an implementation for each SPI.78*79* @param <P>80* @param c81* @return82*/83protected abstract <P extends LocaleServiceProvider> P findInstalledProvider(final Class<P> c);8485@Override86public BreakIteratorProvider getBreakIteratorProvider() {87return getLocaleServiceProvider(BreakIteratorProvider.class);88}8990@Override91public CollatorProvider getCollatorProvider() {92return getLocaleServiceProvider(CollatorProvider.class);93}9495@Override96public DateFormatProvider getDateFormatProvider() {97return getLocaleServiceProvider(DateFormatProvider.class);98}99100@Override101public DateFormatSymbolsProvider getDateFormatSymbolsProvider() {102return getLocaleServiceProvider(DateFormatSymbolsProvider.class);103}104105@Override106public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() {107return getLocaleServiceProvider(DecimalFormatSymbolsProvider.class);108}109110@Override111public NumberFormatProvider getNumberFormatProvider() {112return getLocaleServiceProvider(NumberFormatProvider.class);113}114115/**116* Getter methods for java.util.spi.* providers117*/118@Override119public CurrencyNameProvider getCurrencyNameProvider() {120return getLocaleServiceProvider(CurrencyNameProvider.class);121}122123@Override124public LocaleNameProvider getLocaleNameProvider() {125return getLocaleServiceProvider(LocaleNameProvider.class);126}127128@Override129public TimeZoneNameProvider getTimeZoneNameProvider() {130return getLocaleServiceProvider(TimeZoneNameProvider.class);131}132133@Override134public CalendarDataProvider getCalendarDataProvider() {135return getLocaleServiceProvider(CalendarDataProvider.class);136}137138@Override139public CalendarNameProvider getCalendarNameProvider() {140return getLocaleServiceProvider(CalendarNameProvider.class);141}142143/**144* Getter methods for sun.util.spi.* providers145*/146@Override147public CalendarProvider getCalendarProvider() {148return getLocaleServiceProvider(CalendarProvider.class);149}150151@Override152public LocaleResources getLocaleResources(Locale locale) {153return null;154}155156private static Locale[] availableLocales = null;157158@Override159public Locale[] getAvailableLocales() {160if (availableLocales == null) {161Set<Locale> avail = new HashSet<>();162for (Class<? extends LocaleServiceProvider> c :163LocaleServiceProviderPool.spiClasses) {164LocaleServiceProvider lsp = getLocaleServiceProvider(c);165if (lsp != null) {166avail.addAll(Arrays.asList(lsp.getAvailableLocales()));167}168}169availableLocales = avail.toArray(new Locale[0]);170}171172// assuming caller won't mutate the array.173return availableLocales;174}175176/**177* A dummy locale service provider that indicates there is no178* provider available179*/180private static NullProvider NULL_PROVIDER = new NullProvider();181private static class NullProvider extends LocaleServiceProvider {182@Override183public Locale[] getAvailableLocales() {184return new Locale[0];185}186}187}188189190