# HG changeset patch # User naoto # Date 1362458802 28800 # Node ID 60d3d3dd488043508b45035ae992cca4d5068938 # Parent 649a033296398673a5cb9a8119809b2c3285d917 8004240: Return value from getAdapterPrefence() can be modified Reviewed-by: okutsu diff -r 649a03329639 -r 60d3d3dd4880 jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java --- 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 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 typeList = new ArrayList<>(); + + // Check user specified adapter preference if (order != null && order.length() != 0) { String[] types = order.split(","); - List 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 getAdapterPreference() { return adapterPreference; } diff -r 649a03329639 -r 60d3d3dd4880 jdk/test/java/util/Locale/Bug8004240.java --- /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 types = LocaleProviderAdapter.getAdapterPreference(); + + try { + types.set(0, null); + } catch (UnsupportedOperationException e) { + // success + return; + } + + throw new RuntimeException("LocaleProviderAdapter.getAdapterPrefence() returned a modifiable list."); + } +}