StringBuffer.java (ensureCapacity): Don't resize vector when shared.
* java/lang/StringBuffer.java (ensureCapacity): Don't resize vector when shared. * java/util/Locale.java (Locale(String,String)): Implement in terms of 3-argument version; variant now defaults to empty string. (toString): Assume variant is not null. (equals): Assume all strings are not null. (Locale): Throw NullPointerException if any argument is null. * java/util/ResourceBundle.java (getBundle): Don't try the base name; now implicit in partialGetBundle call. (trySomeGetBundle): Search for parent bundles and call setParent as required. (partialGetBundle): Added `langStop' argument. Use `Locale.toString' to compute bundleName. (resource_cache): New static field. (partialGetBundle): Cache the returned resource bundle. Now synchronized. * gnu/gcj/text/LocaleData_en.java (contents): [collatorRule] Added missing `<'. * mauve-libgcj: Enable Collator and RuleBasedCollator. * java/text/natCollator.cc (decomposeCharacter): `base' now `const'. * Makefile.in: Rebuilt. * Makefile.am (ordinary_java_source_files): Added CollationElementIterator, CollationKey, Collator, RuleBasedCollator. (nat_source_files): Added natCollator.cc. * java/text/RuleBasedCollator.java (ceiNext): No longer static. (compare): Pass `this' to CollationElementIterator constructor. (getCollationElementIterator): Likewise. (ceiNext): Fix off-by-one error when finding initial substring. (next): Correctly mask off bits when computing return value. Fixed return values when one string is shorter than the other. * java/text/CollationElementIterator.java (collator): New field. (CollationElementIterator): Added collator argument. (next): Call ceiNext on collator object. From-SVN: r26707
This commit is contained in:
parent
1c609c4cbe
commit
a0e894a8cc
11 changed files with 216 additions and 114 deletions
|
@ -20,6 +20,9 @@ public abstract class ResourceBundle
|
|||
{
|
||||
protected ResourceBundle parent;
|
||||
|
||||
// This is used to cache resource bundles.
|
||||
private static Hashtable resource_cache = new Hashtable ();
|
||||
|
||||
public ResourceBundle ()
|
||||
{
|
||||
}
|
||||
|
@ -65,15 +68,17 @@ public abstract class ResourceBundle
|
|||
String stopHere)
|
||||
{
|
||||
Class rbc;
|
||||
ResourceBundle needs_parent = null, r, result = null;
|
||||
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
rbc = Class.forName(bundleName);
|
||||
r = null;
|
||||
try
|
||||
{
|
||||
return (ResourceBundle) rbc.newInstance();
|
||||
r = (ResourceBundle) rbc.newInstance();
|
||||
}
|
||||
catch (IllegalAccessException ex)
|
||||
{
|
||||
|
@ -83,45 +88,61 @@ public abstract class ResourceBundle
|
|||
{
|
||||
// Fall through
|
||||
}
|
||||
return null;
|
||||
if (r != null)
|
||||
{
|
||||
if (result == null)
|
||||
result = r;
|
||||
if (needs_parent != null)
|
||||
{
|
||||
// We've been through the loop one or more times
|
||||
// already. Set the parent and keep going.
|
||||
needs_parent.setParent(r);
|
||||
}
|
||||
needs_parent = r;
|
||||
}
|
||||
}
|
||||
catch (ClassNotFoundException ex)
|
||||
{
|
||||
if (bundleName.compareTo(stopHere) == 0)
|
||||
return null;
|
||||
else
|
||||
{
|
||||
int last = bundleName.lastIndexOf('_');
|
||||
// Fall through.
|
||||
}
|
||||
|
||||
if (bundleName.equals(stopHere))
|
||||
return result;
|
||||
else
|
||||
{
|
||||
int last = bundleName.lastIndexOf('_');
|
||||
|
||||
// No more underscores?
|
||||
if (last == -1)
|
||||
return null;
|
||||
|
||||
// Loop around, testing this new shorter name.
|
||||
bundleName = bundleName.substring(0, last);
|
||||
}
|
||||
// No more underscores?
|
||||
if (last == -1)
|
||||
return result;
|
||||
|
||||
// Loop around, testing this new shorter name.
|
||||
bundleName = bundleName.substring(0, last);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Search for bundles, but stop at baseName_language.
|
||||
private static final ResourceBundle partialGetBundle (String baseName,
|
||||
Locale locale)
|
||||
|
||||
// Search for bundles, but stop at baseName_language (if required).
|
||||
// This is synchronized so that the cache works correctly.
|
||||
private static final synchronized ResourceBundle
|
||||
partialGetBundle (String baseName, Locale locale, boolean langStop)
|
||||
{
|
||||
ResourceBundle rb;
|
||||
|
||||
String bundleName = (baseName
|
||||
+ "_"
|
||||
+ locale.getLanguage() + "_"
|
||||
+ locale.getCountry() + "_"
|
||||
+ locale.getVariant());
|
||||
String bundleName = baseName + "_" + locale;
|
||||
|
||||
// Check the cache.
|
||||
Object obj = resource_cache.get(bundleName);
|
||||
if (obj != null)
|
||||
return (ResourceBundle) obj;
|
||||
|
||||
String stopHere = (baseName
|
||||
+ "_"
|
||||
+ locale.getLanguage());
|
||||
+ (langStop ? ("_" + locale.getLanguage()) : ""));
|
||||
|
||||
|
||||
rb = trySomeGetBundle(bundleName, stopHere);
|
||||
if (rb != null)
|
||||
resource_cache.put(bundleName, rb);
|
||||
|
||||
return rb;
|
||||
}
|
||||
|
@ -138,39 +159,18 @@ public abstract class ResourceBundle
|
|||
if (locale == null)
|
||||
throw new NullPointerException ();
|
||||
|
||||
rb = partialGetBundle(baseName, locale);
|
||||
rb = partialGetBundle(baseName, locale, false);
|
||||
if (rb != null)
|
||||
return rb;
|
||||
|
||||
// Finally, try the default locale.
|
||||
if (! locale.equals(Locale.getDefault()))
|
||||
{
|
||||
rb = partialGetBundle(baseName, Locale.getDefault());
|
||||
rb = partialGetBundle(baseName, Locale.getDefault(), true);
|
||||
if (rb != null)
|
||||
return rb;
|
||||
}
|
||||
|
||||
// Try just the baseName.
|
||||
try
|
||||
{
|
||||
rbc = Class.forName (baseName);
|
||||
try
|
||||
{
|
||||
return (ResourceBundle) rbc.newInstance();
|
||||
}
|
||||
catch (IllegalAccessException ex)
|
||||
{
|
||||
// Fall through.
|
||||
}
|
||||
catch (InstantiationException ex)
|
||||
{
|
||||
// Fall through.
|
||||
}
|
||||
}
|
||||
catch (ClassNotFoundException ex)
|
||||
{
|
||||
// Fall through.
|
||||
}
|
||||
|
||||
throw new MissingResourceException("can't load bundle",
|
||||
baseName,
|
||||
"bundle");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue