--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/ResourceBundle/Bug6287579.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test
+ * @bug 6287579
+ * @summary Make sure that getContents() of ListResourceBundle subclasses is 'protected'
+ * and returns a different Object[]][] instance in each invocation.
+ */
+
+import java.lang.reflect.*;
+import java.util.*;
+
+public class Bug6287579 {
+ static final Locale ROOT = new Locale("");
+
+ static final String[] baseNames = {
+ "sun.text.resources.BreakIteratorInfo",
+ "sun.text.resources.FormatData",
+ "sun.text.resources.CollationData",
+ "sun.util.resources.LocaleNames",
+ "sun.util.resources.TimeZoneNames",
+
+ // Make sure the properties-to-class conversion tool generates
+ // the proper getContents().
+ "sun.awt.resources.awt",
+ };
+
+ public static void main(String[] args) throws Exception {
+ int errors = 0;
+
+ List<Locale> locales = new ArrayList<Locale>();
+ locales.addAll(Arrays.asList(Locale.getAvailableLocales()));
+ locales.add(ROOT);
+
+ for (Locale locale : locales) {
+ for (String base : baseNames) {
+ String className = getResourceName(base, locale);
+ errors += checkGetContents(className);
+ }
+ }
+ if (errors > 0) {
+ throw new RuntimeException(errors + " errors found");
+ }
+ }
+
+ static int checkGetContents(String className) throws Exception {
+ int err = 0;
+ try {
+ Class clazz = Class.forName(className);
+ Method getContentsMethod = clazz.getDeclaredMethod("getContents",
+ (Class[]) null);
+ if (!Modifier.isProtected(getContentsMethod.getModifiers())) {
+ System.err.println(className + ": not protected");
+ err++;
+ }
+ getContentsMethod.setAccessible(true);
+ Object bundle = clazz.newInstance();
+ Object o1 = getContentsMethod.invoke(bundle, (Object[]) null);
+ Object o2 = getContentsMethod.invoke(bundle, (Object[]) null);
+ if (o1 == o2) {
+ System.err.println(className + ": same instance returned");
+ err++;
+ }
+ } catch (ClassNotFoundException ce) {
+ // Skip nonexistent classes
+ } catch (NoSuchMethodException me) {
+ System.out.println(className + ": no declared getContents()");
+ }
+ return err;
+ }
+
+ static String getResourceName(String base, Locale locale) {
+ if (locale.equals(ROOT)) {
+ return base;
+ }
+ StringBuilder sb = new StringBuilder(base);
+ sb.append('_').append(locale.getLanguage());
+ if (locale.getCountry().length() > 0
+ || locale.getVariant().length() > 0) {
+ sb.append('_').append(locale.getCountry());
+ }
+ if (locale.getVariant().length() > 0) {
+ sb.append('_').append(locale.getVariant());
+ }
+ return sb.toString();
+ }
+}