< prev index next >

src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java

Print this page
rev 59397 : imported patch 8245241

*** 1,7 **** /* ! * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 23,32 **** --- 23,33 ---- * questions. */ package sun.util.locale.provider; + import java.lang.reflect.InvocationTargetException; import java.text.spi.BreakIteratorProvider; import java.text.spi.CollatorProvider; import java.text.spi.DateFormatProvider; import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider;
*** 35,44 **** --- 36,46 ---- import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; + import java.util.ServiceConfigurationError; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider; import java.util.spi.CalendarNameProvider;
*** 48,83 **** import java.util.spi.TimeZoneNameProvider; import sun.security.action.GetPropertyAction; import sun.text.spi.JavaTimeDateTimePatternProvider; import sun.util.spi.CalendarProvider; /** * The LocaleProviderAdapter abstract class. * * @author Naoto Sato * @author Masayoshi Okutsu */ public abstract class LocaleProviderAdapter { /** * Adapter type. */ ! public static enum Type { JRE("sun.util.locale.provider.JRELocaleProviderAdapter", "sun.util.resources", "sun.text.resources"), CLDR("sun.util.cldr.CLDRLocaleProviderAdapter", "sun.util.resources.cldr", "sun.text.resources.cldr"), SPI("sun.util.locale.provider.SPILocaleProviderAdapter"), HOST("sun.util.locale.provider.HostLocaleProviderAdapter"), FALLBACK("sun.util.locale.provider.FallbackLocaleProviderAdapter", "sun.util.resources", "sun.text.resources"); private final String CLASSNAME; private final String UTIL_RESOURCES_PACKAGE; private final String TEXT_RESOURCES_PACKAGE; ! private Type(String className) { this(className, null, null); } ! private Type(String className, String util, String text) { CLASSNAME = className; UTIL_RESOURCES_PACKAGE = util; TEXT_RESOURCES_PACKAGE = text; } --- 50,87 ---- import java.util.spi.TimeZoneNameProvider; import sun.security.action.GetPropertyAction; import sun.text.spi.JavaTimeDateTimePatternProvider; import sun.util.spi.CalendarProvider; + import static java.lang.System.*; + /** * The LocaleProviderAdapter abstract class. * * @author Naoto Sato * @author Masayoshi Okutsu */ public abstract class LocaleProviderAdapter { /** * Adapter type. */ ! public enum Type { JRE("sun.util.locale.provider.JRELocaleProviderAdapter", "sun.util.resources", "sun.text.resources"), CLDR("sun.util.cldr.CLDRLocaleProviderAdapter", "sun.util.resources.cldr", "sun.text.resources.cldr"), SPI("sun.util.locale.provider.SPILocaleProviderAdapter"), HOST("sun.util.locale.provider.HostLocaleProviderAdapter"), FALLBACK("sun.util.locale.provider.FallbackLocaleProviderAdapter", "sun.util.resources", "sun.text.resources"); private final String CLASSNAME; private final String UTIL_RESOURCES_PACKAGE; private final String TEXT_RESOURCES_PACKAGE; ! Type(String className) { this(className, null, null); } ! Type(String className, String util, String text) { CLASSNAME = className; UTIL_RESOURCES_PACKAGE = util; TEXT_RESOURCES_PACKAGE = text; }
*** 111,126 **** static volatile LocaleProviderAdapter.Type defaultLocaleProviderAdapter; /** * Adapter lookup cache. */ ! private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>> adapterCache = new ConcurrentHashMap<>(); static { String order = GetPropertyAction.privilegedGetProperty("java.locale.providers"); ! List<Type> typeList = new ArrayList<>(); // Check user specified adapter preference if (order != null && !order.isEmpty()) { String[] types = order.split(","); for (String type : types) { --- 115,131 ---- static volatile LocaleProviderAdapter.Type defaultLocaleProviderAdapter; /** * Adapter lookup cache. */ ! private static final ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>> adapterCache = new ConcurrentHashMap<>(); static { String order = GetPropertyAction.privilegedGetProperty("java.locale.providers"); ! ArrayList<Type> typeList = new ArrayList<>(); ! String invalidTypeMessage = null; // Check user specified adapter preference if (order != null && !order.isEmpty()) { String[] types = order.split(","); for (String type : types) {
*** 131,162 **** try { Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT)); if (!typeList.contains(aType)) { typeList.add(aType); } ! } catch (IllegalArgumentException | UnsupportedOperationException e) { ! // could be caused by the user specifying wrong ! // provider name or format in the system property ! LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString()); } } } defaultLocaleProviderAdapter = Type.CLDR; if (!typeList.isEmpty()) { // bona fide preference exists ! if (!(typeList.contains(Type.CLDR) || (typeList.contains(Type.JRE)))) { // Append FALLBACK as the last resort when no ResourceBundleBasedAdapter is available. typeList.add(Type.FALLBACK); defaultLocaleProviderAdapter = Type.FALLBACK; } } else { // Default preference list. typeList.add(Type.CLDR); typeList.add(Type.JRE); } adapterPreference = Collections.unmodifiableList(typeList); } /** * Returns the singleton instance for each adapter type */ --- 136,175 ---- try { Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT)); if (!typeList.contains(aType)) { typeList.add(aType); } ! } catch (IllegalArgumentException e) { ! // construct a log message. ! invalidTypeMessage = "Invalid locale provider adapter \"" + type + "\" ignored."; } } } defaultLocaleProviderAdapter = Type.CLDR; if (!typeList.isEmpty()) { // bona fide preference exists ! if (!(typeList.contains(Type.CLDR) || typeList.contains(Type.JRE))) { // Append FALLBACK as the last resort when no ResourceBundleBasedAdapter is available. typeList.add(Type.FALLBACK); defaultLocaleProviderAdapter = Type.FALLBACK; } } else { // Default preference list. typeList.add(Type.CLDR); typeList.add(Type.JRE); } adapterPreference = Collections.unmodifiableList(typeList); + + // Emit logs, if any, after 'adapterPreference' is initialized which is needed + // for logging. + if (invalidTypeMessage != null) { + // could be caused by the user specifying wrong + // provider name or format in the system property + getLogger(LocaleProviderAdapter.class.getCanonicalName()) + .log(Logger.Level.INFO, invalidTypeMessage); + } } /** * Returns the singleton instance for each adapter type */
*** 165,199 **** case JRE: case CLDR: case SPI: case HOST: case FALLBACK: ! LocaleProviderAdapter adapter = null; ! LocaleProviderAdapter cached = adapterInstances.get(type); ! if (cached == null) { try { // lazily load adapters here ! @SuppressWarnings("deprecation") ! Object tmp = Class.forName(type.getAdapterClassName()).newInstance(); ! adapter = (LocaleProviderAdapter)tmp; ! cached = adapterInstances.putIfAbsent(type, adapter); if (cached != null) { adapter = cached; } ! } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedOperationException e) { ! LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString()); ! adapterInstances.putIfAbsent(type, NONEXISTENT_ADAPTER); ! if (defaultLocaleProviderAdapter == type) { ! defaultLocaleProviderAdapter = Type.FALLBACK; } } - } else if (cached != NONEXISTENT_ADAPTER) { - adapter = cached; - } return adapter; default: throw new InternalError("unknown locale data adapter type"); } } --- 178,207 ---- case JRE: case CLDR: case SPI: case HOST: case FALLBACK: ! LocaleProviderAdapter adapter = adapterInstances.get(type); ! if (adapter == null) { try { // lazily load adapters here ! adapter = (LocaleProviderAdapter)Class.forName(type.getAdapterClassName()) ! .getDeclaredConstructor().newInstance(); ! LocaleProviderAdapter cached = adapterInstances.putIfAbsent(type, adapter); if (cached != null) { adapter = cached; } ! } catch (NoSuchMethodException | ! InvocationTargetException | ! ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedOperationException e) { ! throw new ServiceConfigurationError("Locale provider adapter \"" + ! type + "\"cannot be instantiated.", e); } } return adapter; default: throw new InternalError("unknown locale data adapter type"); } }
*** 438,453 **** public abstract JavaTimeDateTimePatternProvider getJavaTimeDateTimePatternProvider(); public abstract LocaleResources getLocaleResources(Locale locale); public abstract Locale[] getAvailableLocales(); - - private static final LocaleProviderAdapter NONEXISTENT_ADAPTER = new NonExistentAdapter(); - private static final class NonExistentAdapter extends FallbackLocaleProviderAdapter { - @Override - public LocaleProviderAdapter.Type getAdapterType() { - return null; - } - - private NonExistentAdapter() {}; - } } --- 446,451 ----
< prev index next >