8004240: Return value from getAdapterPrefence() can be modified
Reviewed-by: okutsu
--- a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Mon Mar 04 19:42:56 2013 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Mon Mar 04 20:46:42 2013 -0800
@@ -33,6 +33,7 @@
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;
@@ -89,10 +90,7 @@
* 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
@@ -129,10 +127,11 @@
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));
@@ -153,19 +152,23 @@
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]);
+ if (!typeList.isEmpty()) {
+ if (!typeList.contains(Type.JRE)) {
+ // Append FALLBACK as the last resort.
+ fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
+ typeList.add(Type.FALLBACK);
}
+ } else {
+ // Default preference list
+ typeList.add(Type.JRE);
+ typeList.add(Type.SPI);
}
+
+ adapterPreference = Collections.unmodifiableList(typeList);
}
-
/**
* Returns the singleton instance for each adapter type
*/
@@ -202,7 +205,7 @@
/**
* Returns the preference order of LocaleProviderAdapter.Type
*/
- public static Type[] getAdapterPreference() {
+ public static List<Type> getAdapterPreference() {
return adapterPreference;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Locale/Bug8004240.java Mon Mar 04 20:46:42 2013 -0800
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8004240
+ * @summary Verify that getAdapterPreference returns an unmodifiable list.
+ * @compile -XDignore.symbol.file Bug8004240.java
+ * @run main Bug8004240
+ */
+
+import java.util.List;
+import sun.util.locale.provider.LocaleProviderAdapter;
+
+public class Bug8004240 {
+
+ public static void main(String[] args) {
+ List<LocaleProviderAdapter.Type> types = LocaleProviderAdapter.getAdapterPreference();
+
+ try {
+ types.set(0, null);
+ } catch (UnsupportedOperationException e) {
+ // success
+ return;
+ }
+
+ throw new RuntimeException("LocaleProviderAdapter.getAdapterPrefence() returned a modifiable list.");
+ }
+}