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

Print this page
rev 6618 : imported patch 8004240

@@ -31,10 +31,11 @@
 import java.text.spi.DateFormatProvider;
 import java.text.spi.DateFormatSymbolsProvider;
 import java.text.spi.DecimalFormatSymbolsProvider;
 import java.text.spi.NumberFormatProvider;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;

@@ -87,14 +88,11 @@
 
     /**
      * LocaleProviderAdapter preference list. The default list is intended
      * to behave the same manner in JDK7.
      */
-    private static Type[] adapterPreference = {
-        Type.JRE,
-        Type.SPI,
-    };
+    private static final List<Type> adapterPreference;
 
     /**
      * JRE Locale Data Adapter instance
      */
     private static LocaleProviderAdapter jreLocaleProviderAdapter = new JRELocaleProviderAdapter();

@@ -127,14 +125,15 @@
         adapterCache = new ConcurrentHashMap<>();
 
     static {
         String order = AccessController.doPrivileged(
                            new sun.security.action.GetPropertyAction("java.locale.providers"));
-        // Override adapterPreference with the properties one
+        List<Type> typeList = new ArrayList<>();
+
+        // Check user specified adapter preference
         if (order != null && order.length() != 0) {
             String[] types = order.split(",");
-            List<Type> typeList = new ArrayList<>();
             for (String type : types) {
                 try {
                     Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
 
                     // load adapter if necessary

@@ -151,23 +150,27 @@
                     // could be caused by the user specifying wrong
                     // provider name or format in the system property
                     LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
                 }
             }
+        }
 
             if (!typeList.isEmpty()) {
                 if (!typeList.contains(Type.JRE)) {
                     // Append FALLBACK as the last resort.
                     fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
                     typeList.add(Type.FALLBACK);
                 }
-                adapterPreference = typeList.toArray(new Type[0]);
+        } else {
+            // Default preference list
+            typeList.add(Type.JRE);
+            typeList.add(Type.SPI);
             }
+
+        adapterPreference = Collections.unmodifiableList(typeList);
         }
-    }
 
-
     /**
      * Returns the singleton instance for each adapter type
      */
     public static LocaleProviderAdapter forType(Type type) {
         switch (type) {

@@ -200,11 +203,11 @@
         throw new InternalError();
     }
     /**
      * Returns the preference order of LocaleProviderAdapter.Type
      */
-    public static Type[] getAdapterPreference() {
+    public static List<Type> getAdapterPreference() {
         return adapterPreference;
     }
 
     /**
      * Returns a LocaleProviderAdapter for the given locale service provider that