[kaffe] CVS kaffe (dalibor): Fixed ResourceBundle bundle lookup
Kaffe CVS
Kaffe Mailing List <kaffe@kaffe.org>
Sun Dec 7 11:50:03 2003
PatchSet 4199
Date: 2003/12/07 19:47:29
Author: dalibor
Branch: HEAD
Tag: (none)
Log:
Fixed ResourceBundle bundle lookup
2003-12-07 Dalibor Topic <robilad@kaffe.org>
* libraries/javalib/java/util/RessourceBundle.java
(getBundle(String, Locale, ClassLoader)) Rewritten according to spec.
(getBundleWithLocale, getSpecificBundle) Removed.
(getFromCache, putInCache, instantiateParentChain, loadProperties,
loadClass, instantiate, generateCandidateBundleNames) New methods.
Members:
ChangeLog:1.1790->1.1791
libraries/javalib/java/util/ResourceBundle.java:1.16->1.17
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1790 kaffe/ChangeLog:1.1791
--- kaffe/ChangeLog:1.1790 Sun Dec 7 18:21:10 2003
+++ kaffe/ChangeLog Sun Dec 7 19:47:29 2003
@@ -1,5 +1,13 @@
2003-12-07 Dalibor Topic <robilad@kaffe.org>
+ * libraries/javalib/java/util/RessourceBundle.java
+ (getBundle(String, Locale, ClassLoader)) Rewritten according to spec.
+ (getBundleWithLocale, getSpecificBundle) Removed.
+ (getFromCache, putInCache, instantiateParentChain, loadProperties,
+ loadClass, instantiate, generateCandidateBundleNames) New methods.
+
+2003-12-07 Dalibor Topic <robilad@kaffe.org>
+
* libraries/javalib/java/net/Socket.java
(close): Allow a Socket to be closed
multiple times without throwing an exception.
Index: kaffe/libraries/javalib/java/util/ResourceBundle.java
diff -u kaffe/libraries/javalib/java/util/ResourceBundle.java:1.16 kaffe/libraries/javalib/java/util/ResourceBundle.java:1.17
--- kaffe/libraries/javalib/java/util/ResourceBundle.java:1.16 Sat Jun 28 18:06:41 2003
+++ kaffe/libraries/javalib/java/util/ResourceBundle.java Sun Dec 7 19:47:31 2003
@@ -39,75 +39,146 @@
public static ResourceBundle getBundle(String baseName, Locale locale,
ClassLoader loader) throws MissingResourceException {
- ResourceBundle defaultBundle = getSpecificBundle (baseName, loader);
- if (defaultBundle != null) {
- defaultBundle.parent = null;
- defaultBundle.locale = new Locale ("");
- }
+ List names = generateCandidateBundleNames(baseName, locale);
+ Iterator iter = names.iterator();
- ResourceBundle ret = getBundleWithLocale(baseName, defaultBundle, locale, loader);
+ while (iter.hasNext()) {
+ String name = (String) iter.next();
- /* It would appear that if we fail to load a resource bundle
- * for a given locale, we just load the default one instead.
- */
- if (ret==defaultBundle && locale != Locale.getDefault()) {
- ret = getBundleWithLocale(baseName, defaultBundle,
- Locale.getDefault(), loader);
- }
+ ResourceBundle bundle = getFromCache(name, loader);
+ if (bundle == null) {
+ bundle = instantiate(name, loader);
+ }
+
+ if (bundle != null) {
+ putInCache(name, loader, bundle);
+ instantiateParentChain(bundle, name, loader);
+ return bundle;
+ }
+ }
+
+ throw new MissingResourceException("BaseName: " + baseName + " Locale: " + locale + " ClassLoader : " + loader, "ResourceBundle", baseName);
+}
- if (ret == null) {
- throw new MissingResourceException("Can't find bundle for base name "
- + baseName + ",locale " + locale, "ResourceBundle", baseName);
- }
- return (ret);
+ private static ResourceBundle getFromCache(String name, ClassLoader loader) {
+
+ return (ResourceBundle)cache.get (loader + name);
+ }
+
+ private static void putInCache(String name, ClassLoader loader, ResourceBundle bundle) {
+
+ cache.put (loader + name, bundle);
+ }
+
+ private static void instantiateParentChain(ResourceBundle bundle, String name, ClassLoader loader) {
+
+ int last_underscore = name.lastIndexOf('_');
+ if (last_underscore != -1) {
+ String parent_name = name.substring(0, last_underscore);
+ ResourceBundle parent = instantiate(parent_name, loader);
+ bundle.setParent(parent);
+ if (parent != null && parent.parent == null) {
+ instantiateParentChain(parent, parent_name, loader);
+ }
+ }
+ }
+
+ private static ResourceBundle loadProperties(String name, ClassLoader loader) {
+ InputStream strm;
+ strm = loader.getResourceAsStream(name.replace('.', '/')
+ + ".properties");
+ if (strm != null) {
+ try {
+ return (new PropertyResourceBundle(strm));
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ private static ResourceBundle loadClass(String name, ClassLoader loader) {
+ try {
+ Class cls = Class.forName(name.replace('/', '.'), true, loader);
+ /*
+ * Only call newInstance if the cast to resource bundle
+ * will indeed succeed.
+ */
+ if (ResourceBundle.class.isAssignableFrom(cls)) {
+ return ((ResourceBundle)cls.newInstance());
+ }
+ }
+ catch (ClassNotFoundException e) {
+ // ignore
+ }
+ catch (LinkageError e) {
+ e.printStackTrace();
+ }
+ catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ catch (InstantiationException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+private static ResourceBundle instantiate(String name, ClassLoader loader) {
+
+ ResourceBundle bundle = loadClass(name, loader);
+ if (bundle != null) {
+ return bundle;
+ }
+
+ bundle = loadProperties(name, loader);
+ return bundle;
}
-private static final ResourceBundle getBundleWithLocale(String baseName, ResourceBundle bundle,
- Locale locale, ClassLoader loader) {
- ResourceBundle nbundle = null;
-
- String lang = locale.getLanguage();
- String cntry = locale.getCountry();
- String var = locale.getVariant();
-
- StringBuffer sb = new StringBuffer(60);
- sb.append (baseName);
-
- sb.append ('_');
- if (lang.length()>0) {
- sb.append (lang);
- nbundle = getSpecificBundle(sb.toString(), loader);
- if (nbundle != null) {
- nbundle.parent = bundle;
- nbundle.locale = new Locale (lang);
- bundle = nbundle;
- }
- }
+private static List generateCandidateBundleNames(String baseName, Locale locale) {
+
+ String language1 = locale.getLanguage();
+ String country1 = locale.getCountry();
+ String variant1 = locale.getVariant();
+
+ Locale default_locale = Locale.getDefault();
+
+ String language2 = default_locale.getLanguage();
+ String country2 = default_locale.getCountry();
+ String variant2 = default_locale.getVariant();
+
+ List names = new ArrayList();
- sb.append ('_');
- if (cntry.length()>0) {
- sb.append (cntry);
- nbundle = getSpecificBundle(sb.toString(), loader);
- if (nbundle != null) {
- nbundle.parent = bundle;
- nbundle.locale = new Locale (lang, cntry);
- bundle = nbundle;
- }
- }
+ if (variant1.length() != 0) {
+ names.add(baseName + '_' + language1 + '_' + country1 + '_' + variant1);
+ }
- if (var.length()>0) {
- sb.append ('_');
- sb.append (var);
- nbundle = getSpecificBundle(sb.toString(), loader);
- if (nbundle != null) {
- nbundle.parent = bundle;
- nbundle.locale = new Locale (lang, cntry, var);
- bundle = nbundle;
- }
- }
-
- return (bundle);
+ if (country1.length() != 0) {
+ names.add(baseName + '_' + language1 + '_' + country1);
+ }
+
+ if (language1.length() != 0) {
+ names.add(baseName + '_' + language1);
+ }
+
+ if (variant2.length() != 0) {
+ names.add(baseName + '_' + language2 + '_' + country2 + '_' + variant2);
+ }
+
+ if (country2.length() != 0) {
+ names.add(baseName + '_' + language2 + '_' + country2);
+ }
+
+ if (language2.length() != 0) {
+ names.add(baseName + '_' + language2);
+ }
+
+ names.add(baseName);
+
+ return names;
}
public Locale getLocale () {
@@ -124,54 +195,13 @@
}
}
catch (MissingResourceException e) {
+ e.printStackTrace();
}
if (parent == null) {
throw new MissingResourceException("resource not found",
this.getClass().toString(), key);
}
return (parent.getObject(key));
-}
-
-private static final ResourceBundle getSpecificBundle(String baseName,
- ClassLoader loader) {
-
- ResourceBundle ret = (ResourceBundle)cache.get (loader + baseName);
- if (ret != null) {
- return ret;
- }
-
- try {
- Class cls = Class.forName(baseName, true, loader);
- /*
- * Only call newInstance if the cast to resource bundle
- * will indeed succeed.
- */
- if (ResourceBundle.class.isAssignableFrom(cls)) {
- ret = ((ResourceBundle)cls.newInstance());
- }
- }
- catch (Exception _) {
- }
-
- // Okay, failed to load bundle - attempt to load properties as bundle.
- if (ret == null) {
- InputStream strm;
- strm = loader.getResourceAsStream(baseName.replace('.', '/')
- + ".properties");
- if (strm != null) {
- try {
- ret = (new PropertyResourceBundle(strm));
- }
- catch (IOException _) {
- }
- }
- }
-
- if (ret!=null) {
- cache.put (baseName, ret);
- }
-
- return ret;
}
public final String getString(String key) throws MissingResourceException {