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