src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java
Print this page
rev 6352 : imported patch 7162007
*** 35,52 ****
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.spi.CalendarDataProvider;
import java.util.spi.CalendarNameProvider;
import java.util.spi.CurrencyNameProvider;
import java.util.spi.LocaleNameProvider;
import java.util.spi.LocaleServiceProvider;
import java.util.spi.TimeZoneNameProvider;
import sun.util.cldr.CLDRLocaleProviderAdapter;
- import sun.util.resources.LocaleData;
/**
* The LocaleProviderAdapter abstract class.
*
* @author Naoto Sato
--- 35,53 ----
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
+ import java.util.concurrent.ConcurrentHashMap;
+ import java.util.concurrent.ConcurrentMap;
import java.util.spi.CalendarDataProvider;
import java.util.spi.CalendarNameProvider;
import java.util.spi.CurrencyNameProvider;
import java.util.spi.LocaleNameProvider;
import java.util.spi.LocaleServiceProvider;
import java.util.spi.TimeZoneNameProvider;
import sun.util.cldr.CLDRLocaleProviderAdapter;
/**
* The LocaleProviderAdapter abstract class.
*
* @author Naoto Sato
*** 117,126 ****
--- 118,133 ----
* FALLBACK Locale Data Adapter instance. It's basically the same with JRE, but only kicks
* in for the root locale.
*/
private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
+ /**
+ * Adapter lookup cache.
+ */
+ private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>>
+ adapterCache = new ConcurrentHashMap<>();
+
static {
String order = AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("java.locale.providers"));
// Override adapterPreference with the properties one
if (order != null && order.length() != 0) {
*** 208,220 ****
* @param locale the desired locale.
* @return a LocaleProviderAdapter
*/
public static LocaleProviderAdapter getAdapter(Class<? extends LocaleServiceProvider> providerClass,
Locale locale) {
// Fast look-up for the given locale
! LocaleProviderAdapter adapter = findAdapter(providerClass, locale);
if (adapter != null) {
return adapter;
}
// Try finding an adapter in the normal candidate locales path of the given locale.
List<Locale> lookupLocales = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT)
--- 215,241 ----
* @param locale the desired locale.
* @return a LocaleProviderAdapter
*/
public static LocaleProviderAdapter getAdapter(Class<? extends LocaleServiceProvider> providerClass,
Locale locale) {
+ LocaleProviderAdapter adapter;
+
+ // cache lookup
+ ConcurrentMap<Locale, LocaleProviderAdapter> adapterMap = adapterCache.get(providerClass);
+ if (adapterMap != null) {
+ if ((adapter = adapterMap.get(locale)) != null) {
+ return adapter;
+ }
+ } else {
+ adapterMap = new ConcurrentHashMap<>();
+ adapterCache.putIfAbsent(providerClass, adapterMap);
+ }
+
// Fast look-up for the given locale
! adapter = findAdapter(providerClass, locale);
if (adapter != null) {
+ adapterMap.putIfAbsent(locale, adapter);
return adapter;
}
// Try finding an adapter in the normal candidate locales path of the given locale.
List<Locale> lookupLocales = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT)
*** 224,238 ****
--- 245,261 ----
// We've already done with this loc.
continue;
}
adapter = findAdapter(providerClass, loc);
if (adapter != null) {
+ adapterMap.putIfAbsent(locale, adapter);
return adapter;
}
}
// returns the adapter for FALLBACK as the last resort
+ adapterMap.putIfAbsent(locale, fallbackLocaleProviderAdapter);
return fallbackLocaleProviderAdapter;
}
private static LocaleProviderAdapter findAdapter(Class<? extends LocaleServiceProvider> providerClass,
Locale locale) {
*** 396,404 ****
*/
public abstract CalendarNameProvider getCalendarNameProvider();
public abstract LocaleResources getLocaleResources(Locale locale);
- public abstract LocaleData getLocaleData();
-
public abstract Locale[] getAvailableLocales();
}
--- 419,425 ----