src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java
Print this page
rev 5856 : [mq]: 7196799
@@ -57,11 +57,12 @@
*/
public static enum Type {
JRE("sun.util.resources", "sun.text.resources"),
CLDR("sun.util.resources.cldr", "sun.text.resources.cldr"),
SPI,
- HOST;
+ HOST,
+ FALLBACK("sun.util.resources", "sun.text.resources");
private final String UTIL_RESOURCES_PACKAGE;
private final String TEXT_RESOURCES_PACKAGE;
private Type() {
@@ -109,10 +110,16 @@
/**
* HOST Locale Data Adapter instance, if any.
*/
private static LocaleProviderAdapter hostLocaleProviderAdapter = null;
+ /**
+ * 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;
+
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) {
@@ -130,21 +137,21 @@
case HOST:
hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
break;
}
typeList.add(aType);
- } catch (// could be caused by the user specifying wrong
+ } catch (IllegalArgumentException | UnsupportedOperationException e) {
+ // could be caused by the user specifying wrong
// provider name or format in the system property
- IllegalArgumentException |
- UnsupportedOperationException e) {
LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
}
}
if (!typeList.contains(Type.JRE)) {
- // Append JRE as the last resort.
- typeList.add(Type.JRE);
+ // Append FALLBACK as the last resort.
+ fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
+ typeList.add(Type.FALLBACK);
}
adapterPreference = typeList.toArray(new Type[0]);
}
}
@@ -160,10 +167,12 @@
return cldrLocaleProviderAdapter;
case SPI:
return spiLocaleProviderAdapter;
case HOST:
return hostLocaleProviderAdapter;
+ case FALLBACK:
+ return fallbackLocaleProviderAdapter;
default:
throw new InternalError("unknown locale data adapter type");
}
}
@@ -171,11 +180,11 @@
return jreLocaleProviderAdapter;
}
public static LocaleProviderAdapter getResourceBundleBased() {
for (Type type : getAdapterPreference()) {
- if (type == Type.JRE || type == Type.CLDR) {
+ if (type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK) {
return forType(type);
}
}
// Shouldn't happen.
throw new InternalError();
@@ -216,13 +225,16 @@
if (adapter != null) {
return adapter;
}
}
- // returns the adapter for JRE as the last resort
- return jreLocaleProviderAdapter;
+ // returns the adapter for FALLBACK as the last resort
+ if (fallbackLocaleProviderAdapter == null) {
+ fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
}
+ return fallbackLocaleProviderAdapter;
+ }
private static LocaleProviderAdapter findAdapter(Class<? extends LocaleServiceProvider> providerClass,
Locale locale) {
for (Type type : getAdapterPreference()) {
LocaleProviderAdapter adapter = forType(type);
@@ -236,22 +248,28 @@
return null;
}
/**
* A utility method for implementing the default LocaleServiceProvider.isSupportedLocale
- * for the JRE and CLDR adapters.
+ * for the JRE, CLDR, and FALLBACK adapters.
*/
static boolean isSupportedLocale(Locale locale, LocaleProviderAdapter.Type type, Set<String> langtags) {
- assert type == Type.JRE || type == Type.CLDR;
+ assert type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK;
if (locale == Locale.ROOT) {
return true;
}
+
+ if (type == Type.FALLBACK) {
+ // no other locales except ROOT are supported for FALLBACK
+ return false;
+ }
+
locale = locale.stripExtensions();
if (langtags.contains(locale.toLanguageTag())) {
return true;
}
- if (type == LocaleProviderAdapter.Type.JRE) {
+ if (type == Type.JRE) {
String oldname = locale.toString().replace('_', '-');
return langtags.contains(oldname);
}
return false;
}