< 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 >