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

Print this page
rev 7221 : imported patch 8013903

@@ -118,10 +118,16 @@
      * in for the root locale.
      */
     private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
 
     /**
+     * Default fallback adapter type, which should return something meaningful in any case.
+     * This is either JRE or FALLBACK.
+     */
+    static LocaleProviderAdapter.Type defaultLocaleProviderAdapter = null;
+
+    /**
      * Adapter lookup cache.
      */
     private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>>
         adapterCache = new ConcurrentHashMap<>();
 

@@ -138,17 +144,23 @@
                     Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
 
                     // load adapter if necessary
                     switch (aType) {
                         case CLDR:
+                            if (cldrLocaleProviderAdapter == null) {
                             cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
+                            }
                             break;
                         case HOST:
+                            if (hostLocaleProviderAdapter == null) {
                             hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
+                            }
                             break;
                     }
+                    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());
                 }

@@ -158,15 +170,19 @@
         if (!typeList.isEmpty()) {
             if (!typeList.contains(Type.JRE)) {
                 // Append FALLBACK as the last resort.
                 fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
                 typeList.add(Type.FALLBACK);
+                defaultLocaleProviderAdapter = Type.FALLBACK;
+            } else {
+                defaultLocaleProviderAdapter = Type.JRE;
             }
         } else {
             // Default preference list
             typeList.add(Type.JRE);
             typeList.add(Type.SPI);
+            defaultLocaleProviderAdapter = Type.JRE;
         }
 
         adapterPreference = Collections.unmodifiableList(typeList);
     }