jdk/test/sun/text/resources/LocaleDataTest.java
changeset 13583 dc0017b1a452
parent 12850 f4a05c228eca
child 13591 db0d8946475b
--- a/jdk/test/sun/text/resources/LocaleDataTest.java	Tue Aug 21 13:42:08 2012 +0100
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java	Tue Aug 21 11:00:30 2012 -0700
@@ -145,6 +145,9 @@
 
 public class LocaleDataTest
 {
+    static final String TEXT_RESOURCES_PACKAGE ="sun.text.resources";
+    static final String UTIL_RESOURCES_PACKAGE ="sun.util.resources";
+
     public static void main(String[] args) throws Exception {
 
         // set up our flags and our input and output streams based on the
@@ -286,9 +289,9 @@
                     || rbName.equals("CurrencyNames")
                     || rbName.equals("LocaleNames")
                     || rbName.equals("TimeZoneNames")) {
-                fullName = "sun.util.resources." + rbName;
+                fullName = UTIL_RESOURCES_PACKAGE + "." + rbName;
             } else {
-                fullName = "sun.text.resources." + rbName;
+                fullName = TEXT_RESOURCES_PACKAGE + "." + rbName;
             }
             Locale locale;
             if (use_tag) {
@@ -297,8 +300,8 @@
                 locale = new Locale(language, country, variant);
             }
             ResourceBundle bundle = ResourceBundle.getBundle(fullName,
-                           locale,
-                           ResourceBundle.Control.getNoFallbackControl(Control.FORMAT_DEFAULT));
+                                                             locale,
+                                                             JRELocaleResourceBundleControl.INSTANCE);
             resource = bundle.getObject(resTag);
         }
         catch (MissingResourceException e) {
@@ -311,7 +314,7 @@
             else if (resource instanceof String[]) {
                 int element = Integer.valueOf(qualifier).intValue();
                 String[] stringList = (String[])resource;
-                if (element >= 0 || element < stringList.length)
+                if (element >= 0 && element < stringList.length)
                     retrievedValue = stringList[element];
             }
             else if (resource instanceof String[][]) {
@@ -326,7 +329,7 @@
                 else {
                     int row = Integer.valueOf(qualifier.substring(0, slash)).intValue();
                     int column = Integer.valueOf(qualifier.substring(slash + 1)).intValue();
-                    if (row >= 0 || row < stringArray.length || column >= 0 || column <
+                    if (row >= 0 && row < stringArray.length && column >= 0 && column <
                                     stringArray[row].length)
                         retrievedValue = stringArray[row][column];
                 }
@@ -352,6 +355,54 @@
         }
         return true;
     }
+
+    private static class JRELocaleResourceBundleControl extends ResourceBundle.Control {
+        static final JRELocaleResourceBundleControl INSTANCE = new JRELocaleResourceBundleControl();
+
+        private JRELocaleResourceBundleControl() {
+        }
+
+        @Override
+        public Locale getFallbackLocale(String baseName, Locale locale) {
+            if (baseName == null || locale == null) {
+                throw new NullPointerException();
+            }
+            return null;
+        }
+
+        private static final String CLDR      = ".cldr";
+
+        /**
+         * Changes baseName to its per-language package name and
+         * calls the super class implementation. For example,
+         * if the baseName is "sun.text.resources.FormatData" and locale is ja_JP,
+         * the baseName is changed to "sun.text.resources.ja.FormatData". If
+         * baseName contains "cldr", such as "sun.text.resources.cldr.FormatData",
+         * the name is changed to "sun.text.resources.cldr.jp.FormatData".
+         */
+        @Override
+        public String toBundleName(String baseName, Locale locale) {
+            String newBaseName = baseName;
+            String lang = locale.getLanguage();
+            if (lang.length() > 0) {
+                if (baseName.startsWith(UTIL_RESOURCES_PACKAGE)
+                    || baseName.startsWith(TEXT_RESOURCES_PACKAGE)) {
+                    // Assume the lengths are the same.
+                    if (UTIL_RESOURCES_PACKAGE.length()
+                        != TEXT_RESOURCES_PACKAGE.length()) {
+                        throw new InternalError("The resources package names have different lengths.");
+                    }
+                    int index = TEXT_RESOURCES_PACKAGE.length();
+                    if (baseName.indexOf(CLDR, index) > 0) {
+                        index += CLDR.length();
+                    }
+                    newBaseName = baseName.substring(0, index + 1) + lang
+                                      + baseName.substring(index);
+                }
+            }
+            return super.toBundleName(newBaseName, locale);
+        }
+    }
 }
 
 class EscapeReader extends FilterReader {