提交 3f287fe2 编写于 作者: N naoto

8004240: Return value from getAdapterPrefence() can be modified

Reviewed-by: okutsu
上级 e1d1b08e
...@@ -33,6 +33,7 @@ import java.text.spi.DateFormatSymbolsProvider; ...@@ -33,6 +33,7 @@ import java.text.spi.DateFormatSymbolsProvider;
import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider;
import java.text.spi.NumberFormatProvider; import java.text.spi.NumberFormatProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
...@@ -89,10 +90,7 @@ public abstract class LocaleProviderAdapter { ...@@ -89,10 +90,7 @@ public abstract class LocaleProviderAdapter {
* LocaleProviderAdapter preference list. The default list is intended * LocaleProviderAdapter preference list. The default list is intended
* to behave the same manner in JDK7. * to behave the same manner in JDK7.
*/ */
private static Type[] adapterPreference = { private static final List<Type> adapterPreference;
Type.JRE,
Type.SPI,
};
/** /**
* JRE Locale Data Adapter instance * JRE Locale Data Adapter instance
...@@ -129,10 +127,11 @@ public abstract class LocaleProviderAdapter { ...@@ -129,10 +127,11 @@ public abstract class LocaleProviderAdapter {
static { static {
String order = AccessController.doPrivileged( String order = AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("java.locale.providers")); 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) { if (order != null && order.length() != 0) {
String[] types = order.split(","); String[] types = order.split(",");
List<Type> typeList = new ArrayList<>();
for (String type : types) { for (String type : types) {
try { try {
Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT)); Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
...@@ -153,6 +152,7 @@ public abstract class LocaleProviderAdapter { ...@@ -153,6 +152,7 @@ public abstract class LocaleProviderAdapter {
LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString()); LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
} }
} }
}
if (!typeList.isEmpty()) { if (!typeList.isEmpty()) {
if (!typeList.contains(Type.JRE)) { if (!typeList.contains(Type.JRE)) {
...@@ -160,11 +160,14 @@ public abstract class LocaleProviderAdapter { ...@@ -160,11 +160,14 @@ public abstract class LocaleProviderAdapter {
fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter(); fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
typeList.add(Type.FALLBACK); 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 * Returns the singleton instance for each adapter type
...@@ -202,7 +205,7 @@ public abstract class LocaleProviderAdapter { ...@@ -202,7 +205,7 @@ public abstract class LocaleProviderAdapter {
/** /**
* Returns the preference order of LocaleProviderAdapter.Type * Returns the preference order of LocaleProviderAdapter.Type
*/ */
public static Type[] getAdapterPreference() { public static List<Type> getAdapterPreference() {
return adapterPreference; return adapterPreference;
} }
......
/*
* 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.");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册