ResourceBundle fixes

From-SVN: r45472
This commit is contained in:
Anthony Green 2001-09-07 18:14:20 +00:00 committed by Anthony Green
parent 5660465a0b
commit 9978052974
2 changed files with 49 additions and 29 deletions

View File

@ -1,3 +1,11 @@
2001-09-06 Anthony Green <green@redhat.com>
* java/util/ResourceBundle.java (tryLocalBundle): Eliminate
redundant method calls.
(emptyLocale): New private member.
(tryBundle): Use emptyLocale. Remove duplicate code. Only cache
exact matches.
2001-09-06 Tom Tromey <tromey@redhat.com>
* java/text/RuleBasedCollator.java (clone): Rewrote.

View File

@ -200,9 +200,15 @@ public abstract class ResourceBundle
* references to the resource bundle. */
private static Map resourceBundleCache = new HashMap();
/**
* The `empty' locale is created once in order to optimize
* tryBundle().
*/
private static final Locale emptyLocale = new Locale ("", "");
/**
* Tries to load a class or a property file with the specified name.
* @param name the name.
* @param localizedName the name.
* @param locale the locale, that must be used exactly.
* @param classloader the classloader.
* @param bundle the back up (parent) bundle
@ -229,21 +235,24 @@ public abstract class ResourceBundle
}
}
// foundBundle holds exact matches for the localizedName resource
// bundle, which may later be cached.
ResourceBundle foundBundle = null;
try
{
java.io.InputStream is;
final String resourceName =
localizedName.replace('.', '/') + ".properties";
if (classloader == null)
is = ClassLoader.getSystemResourceAsStream
(localizedName.replace('.', '/') + ".properties");
is = ClassLoader.getSystemResourceAsStream (resourceName);
else
is = classloader.getResourceAsStream
(localizedName.replace('.', '/') + ".properties");
is = classloader.getResourceAsStream (resourceName);
if (is != null)
{
ResourceBundle rb = new PropertyResourceBundle(is);
rb.parent = bundle;
rb.locale = locale;
bundle = rb;
foundBundle = new PropertyResourceBundle(is);
foundBundle.parent = bundle;
foundBundle.locale = locale;
}
}
catch (java.io.IOException ex)
@ -257,10 +266,9 @@ public abstract class ResourceBundle
rbClass = Class.forName(localizedName);
else
rbClass = classloader.loadClass(localizedName);
ResourceBundle rb = (ResourceBundle) rbClass.newInstance();
rb.parent = bundle;
rb.locale = locale;
bundle = rb;
foundBundle = (ResourceBundle) rbClass.newInstance();
foundBundle.parent = bundle;
foundBundle.locale = locale;
}
catch (ClassNotFoundException ex)
{
@ -274,11 +282,10 @@ public abstract class ResourceBundle
// XXX should we also ignore ClassCastException?
}
// Put the bundle in the cache
if (bundle != null)
cache.put(localizedName, new SoftReference(bundle));
if (foundBundle != null)
cache.put(localizedName, new SoftReference(foundBundle));
return bundle;
return foundBundle != null ? foundBundle : bundle;
}
/**
@ -298,26 +305,31 @@ public abstract class ResourceBundle
ResourceBundle bundle,
HashMap cache)
{
if (locale.getLanguage().length() > 0)
{
String name = baseName + "_" + locale.getLanguage();
final String language = locale.getLanguage();
if (locale.getCountry().length() != 0)
if (language.length() > 0)
{
final String country = locale.getCountry();
String name = baseName + "_" + language;
if (country.length() != 0)
{
bundle = tryBundle(name,
new Locale(locale.getLanguage(), ""),
new Locale(language, ""),
classloader, bundle, cache);
name += "_" + locale.getCountry();
name += "_" + country;
if (locale.getVariant().length() != 0)
final String variant = locale.getVariant();
if (variant.length() != 0)
{
bundle = tryBundle(name,
new Locale(locale.getLanguage(),
locale.getCountry()),
new Locale(language,
country),
classloader, bundle, cache);
name += "_" + locale.getVariant();
name += "_" + variant;
}
}
bundle = tryBundle(name, locale, classloader, bundle, cache);
@ -367,14 +379,14 @@ public abstract class ResourceBundle
}
}
ResourceBundle baseBundle = tryBundle(baseName, new Locale("", ""),
ResourceBundle baseBundle = tryBundle(baseName, emptyLocale,
classLoader, null, cache);
if (baseBundle == null)
// JDK says, that if one provides a bundle base_en_UK, one
// must also provide the bundles base_en and base.
// This implies that if there is no bundle for base, there
// is no bundle at all.
throw new MissingResourceException("Bundle not found", baseName, "");
throw new MissingResourceException("Bundle " + baseName + " not found", baseName, "");
// Now use the default locale.
ResourceBundle bundle = tryLocalBundle(baseName, locale,