Commit a0e894a8 by Tom Tromey Committed by Tom Tromey

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
parent 1c609c4c
1999-04-29 Tom Tromey <tromey@cygnus.com>
* 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.
1999-04-26 Tom Tromey <tromey@cygnus.com> 1999-04-26 Tom Tromey <tromey@cygnus.com>
* natCollator.cc: New file. * natCollator.cc: New file.
......
...@@ -533,6 +533,9 @@ java/security/NoSuchAlgorithmException.java \ ...@@ -533,6 +533,9 @@ java/security/NoSuchAlgorithmException.java \
java/text/BreakIterator.java \ java/text/BreakIterator.java \
java/text/CharacterIterator.java \ java/text/CharacterIterator.java \
java/text/ChoiceFormat.java \ java/text/ChoiceFormat.java \
java/text/CollationElementIterator.java \
java/text/CollationKey.java \
java/text/Collator.java \
java/text/DateFormat.java \ java/text/DateFormat.java \
java/text/DateFormatSymbols.java \ java/text/DateFormatSymbols.java \
java/text/DecimalFormat.java \ java/text/DecimalFormat.java \
...@@ -543,6 +546,7 @@ java/text/MessageFormat.java \ ...@@ -543,6 +546,7 @@ java/text/MessageFormat.java \
java/text/NumberFormat.java \ java/text/NumberFormat.java \
java/text/ParseException.java \ java/text/ParseException.java \
java/text/ParsePosition.java \ java/text/ParsePosition.java \
java/text/RuleBasedCollator.java \
java/text/SimpleDateFormat.java \ java/text/SimpleDateFormat.java \
java/text/StringCharacterIterator.java \ java/text/StringCharacterIterator.java \
java/util/BitSet.java \ java/util/BitSet.java \
...@@ -601,19 +605,35 @@ c_source_files = \ ...@@ -601,19 +605,35 @@ c_source_files = \
java/lang/k_cos.c java/lang/s_sin.c java/lang/k_cos.c java/lang/s_sin.c
## This lists all the C++ source files in subdirectories. ## This lists all the C++ source files in subdirectories.
nat_source_files = java/lang/natObject.cc java/lang/natClass.cc \ nat_source_files = \
java/lang/natString.cc java/lang/natDouble.cc java/lang/natRuntime.cc \
java/lang/natSystem.cc java/lang/natThread.cc java/io/natFile.cc \
java/io/natFileDescriptor.cc java/util/natDate.cc \
java/util/natGregorianCalendar.cc java/lang/natFirstThread.cc \
java/lang/natCharacter.cc java/lang/natMath.cc java/lang/natFloat.cc \
java/lang/reflect/natField.cc java/net/natInetAddress.cc \
java/net/natPlainSocketImpl.cc java/lang/reflect/natMethod.cc \
java/lang/reflect/natArray.cc gnu/gcj/convert/Unicode_to_JIS.cc \
gnu/gcj/convert/natInput_EUCJIS.cc gnu/gcj/convert/natOutput_EUCJIS.cc \
gnu/gcj/convert/natInput_SJIS.cc gnu/gcj/convert/natOutput_SJIS.cc \
gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \
gnu/gcj/convert/JIS0212_to_Unicode.cc gnu/gcj/convert/JIS0212_to_Unicode.cc \
gnu/gcj/convert/Unicode_to_JIS.cc \
gnu/gcj/convert/natInput_EUCJIS.cc \
gnu/gcj/convert/natInput_SJIS.cc \
gnu/gcj/convert/natOutput_EUCJIS.cc \
gnu/gcj/convert/natOutput_SJIS.cc \
java/io/natFile.cc \
java/io/natFileDescriptor.cc \
java/lang/natCharacter.cc \
java/lang/natClass.cc \
java/lang/natDouble.cc \
java/lang/natFirstThread.cc \
java/lang/natFloat.cc \
java/lang/natMath.cc \
java/lang/natObject.cc \
java/lang/natRuntime.cc \
java/lang/natString.cc \
java/lang/natSystem.cc \
java/lang/natThread.cc \
java/lang/reflect/natArray.cc \
java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \
java/net/natInetAddress.cc \
java/net/natPlainSocketImpl.cc \
java/text/natCollator.cc \
java/util/natDate.cc \
java/util/natGregorianCalendar.cc
## ################################################################ ## ################################################################
......
...@@ -398,6 +398,9 @@ java/security/NoSuchAlgorithmException.java \ ...@@ -398,6 +398,9 @@ java/security/NoSuchAlgorithmException.java \
java/text/BreakIterator.java \ java/text/BreakIterator.java \
java/text/CharacterIterator.java \ java/text/CharacterIterator.java \
java/text/ChoiceFormat.java \ java/text/ChoiceFormat.java \
java/text/CollationElementIterator.java \
java/text/CollationKey.java \
java/text/Collator.java \
java/text/DateFormat.java \ java/text/DateFormat.java \
java/text/DateFormatSymbols.java \ java/text/DateFormatSymbols.java \
java/text/DecimalFormat.java \ java/text/DecimalFormat.java \
...@@ -408,6 +411,7 @@ java/text/MessageFormat.java \ ...@@ -408,6 +411,7 @@ java/text/MessageFormat.java \
java/text/NumberFormat.java \ java/text/NumberFormat.java \
java/text/ParseException.java \ java/text/ParseException.java \
java/text/ParsePosition.java \ java/text/ParsePosition.java \
java/text/RuleBasedCollator.java \
java/text/SimpleDateFormat.java \ java/text/SimpleDateFormat.java \
java/text/StringCharacterIterator.java \ java/text/StringCharacterIterator.java \
java/util/BitSet.java \ java/util/BitSet.java \
...@@ -466,19 +470,35 @@ c_source_files = \ ...@@ -466,19 +470,35 @@ c_source_files = \
java/lang/k_cos.c java/lang/s_sin.c java/lang/k_cos.c java/lang/s_sin.c
nat_source_files = java/lang/natObject.cc java/lang/natClass.cc \ nat_source_files = \
java/lang/natString.cc java/lang/natDouble.cc java/lang/natRuntime.cc \
java/lang/natSystem.cc java/lang/natThread.cc java/io/natFile.cc \
java/io/natFileDescriptor.cc java/util/natDate.cc \
java/util/natGregorianCalendar.cc java/lang/natFirstThread.cc \
java/lang/natCharacter.cc java/lang/natMath.cc java/lang/natFloat.cc \
java/lang/reflect/natField.cc java/net/natInetAddress.cc \
java/net/natPlainSocketImpl.cc java/lang/reflect/natMethod.cc \
java/lang/reflect/natArray.cc gnu/gcj/convert/Unicode_to_JIS.cc \
gnu/gcj/convert/natInput_EUCJIS.cc gnu/gcj/convert/natOutput_EUCJIS.cc \
gnu/gcj/convert/natInput_SJIS.cc gnu/gcj/convert/natOutput_SJIS.cc \
gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \
gnu/gcj/convert/JIS0212_to_Unicode.cc gnu/gcj/convert/JIS0212_to_Unicode.cc \
gnu/gcj/convert/Unicode_to_JIS.cc \
gnu/gcj/convert/natInput_EUCJIS.cc \
gnu/gcj/convert/natInput_SJIS.cc \
gnu/gcj/convert/natOutput_EUCJIS.cc \
gnu/gcj/convert/natOutput_SJIS.cc \
java/io/natFile.cc \
java/io/natFileDescriptor.cc \
java/lang/natCharacter.cc \
java/lang/natClass.cc \
java/lang/natDouble.cc \
java/lang/natFirstThread.cc \
java/lang/natFloat.cc \
java/lang/natMath.cc \
java/lang/natObject.cc \
java/lang/natRuntime.cc \
java/lang/natString.cc \
java/lang/natSystem.cc \
java/lang/natThread.cc \
java/lang/reflect/natArray.cc \
java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \
java/net/natInetAddress.cc \
java/net/natPlainSocketImpl.cc \
java/text/natCollator.cc \
java/util/natDate.cc \
java/util/natGregorianCalendar.cc
# Work around what appears to be a GNU make bug handling MAKEFLAGS # Work around what appears to be a GNU make bug handling MAKEFLAGS
...@@ -716,12 +736,15 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ ...@@ -716,12 +736,15 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/security/MessageDigest.P \ .deps/java/security/MessageDigest.P \
.deps/java/security/NoSuchAlgorithmException.P \ .deps/java/security/NoSuchAlgorithmException.P \
.deps/java/text/BreakIterator.P .deps/java/text/CharacterIterator.P \ .deps/java/text/BreakIterator.P .deps/java/text/CharacterIterator.P \
.deps/java/text/ChoiceFormat.P .deps/java/text/DateFormat.P \ .deps/java/text/ChoiceFormat.P \
.deps/java/text/DateFormatSymbols.P .deps/java/text/DecimalFormat.P \ .deps/java/text/CollationElementIterator.P \
.deps/java/text/DecimalFormatSymbols.P .deps/java/text/FieldPosition.P \ .deps/java/text/CollationKey.P .deps/java/text/Collator.P \
.deps/java/text/Format.P .deps/java/text/MessageFormat.P \ .deps/java/text/DateFormat.P .deps/java/text/DateFormatSymbols.P \
.deps/java/text/NumberFormat.P .deps/java/text/ParseException.P \ .deps/java/text/DecimalFormat.P .deps/java/text/DecimalFormatSymbols.P \
.deps/java/text/ParsePosition.P .deps/java/text/SimpleDateFormat.P \ .deps/java/text/FieldPosition.P .deps/java/text/Format.P \
.deps/java/text/MessageFormat.P .deps/java/text/NumberFormat.P \
.deps/java/text/ParseException.P .deps/java/text/ParsePosition.P \
.deps/java/text/RuleBasedCollator.P .deps/java/text/SimpleDateFormat.P \
.deps/java/text/StringCharacterIterator.P .deps/java/util/BitSet.P \ .deps/java/text/StringCharacterIterator.P .deps/java/util/BitSet.P \
.deps/java/util/Calendar.P \ .deps/java/util/Calendar.P \
.deps/java/util/ConcurrentModificationException.P \ .deps/java/util/ConcurrentModificationException.P \
......
...@@ -71,7 +71,7 @@ public final class LocaleData_en extends ListResourceBundle ...@@ -71,7 +71,7 @@ public final class LocaleData_en extends ListResourceBundle
// FIXME: this is nowhere near complete. // FIXME: this is nowhere near complete.
// In particular we must mark accents as ignorable, // In particular we must mark accents as ignorable,
// and probably other things as well. // and probably other things as well.
{ "collatorRule", "0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < o,O < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z" } { "collatorRule", "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < o,O < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z" }
}; };
protected Object[][] getContents () protected Object[][] getContents ()
......
...@@ -98,7 +98,13 @@ public final class StringBuffer implements Serializable ...@@ -98,7 +98,13 @@ public final class StringBuffer implements Serializable
{ {
if (shared || minimumCapacity > value.length) if (shared || minimumCapacity > value.length)
{ {
minimumCapacity = Math.max(minimumCapacity, value.length*2+2); // We don't want to make a larger vector when `shared' is
// set. If we do, then setLength becomes very inefficient
// when repeatedly reusing a StringBuffer in a loop.
int max = (minimumCapacity > value.length
? value.length*2+2
: value.length);
minimumCapacity = Math.max(minimumCapacity, max);
char[] nb = new char[minimumCapacity]; char[] nb = new char[minimumCapacity];
System.arraycopy(value, 0, nb, 0, count); System.arraycopy(value, 0, nb, 0, count);
value = nb; value = nb;
......
...@@ -27,7 +27,7 @@ public final class CollationElementIterator ...@@ -27,7 +27,7 @@ public final class CollationElementIterator
{ {
if (index == text.length()) if (index == text.length())
return NULLORDER; return NULLORDER;
return RuleBasedCollator.ceiNext(this); return collator.ceiNext(this);
} }
// This one returns int while the others return short. // This one returns int while the others return short.
...@@ -55,12 +55,13 @@ public final class CollationElementIterator ...@@ -55,12 +55,13 @@ public final class CollationElementIterator
} }
// Non-public constructor. // Non-public constructor.
CollationElementIterator (String text) CollationElementIterator (String text, RuleBasedCollator collator)
{ {
this.text = text; this.text = text;
this.index = 0; this.index = 0;
this.lookahead_set = false; this.lookahead_set = false;
this.lookahead = 0; this.lookahead = 0;
this.collator = collator;
} }
// Text over which we iterate. // Text over which we iterate.
...@@ -72,4 +73,7 @@ public final class CollationElementIterator ...@@ -72,4 +73,7 @@ public final class CollationElementIterator
// A piece of lookahead. // A piece of lookahead.
boolean lookahead_set; boolean lookahead_set;
int lookahead; int lookahead;
// The RuleBasedCollator which created this object.
RuleBasedCollator collator;
} }
...@@ -43,7 +43,7 @@ public class RuleBasedCollator extends Collator ...@@ -43,7 +43,7 @@ public class RuleBasedCollator extends Collator
} }
// A helper for CollationElementIterator.next(). // A helper for CollationElementIterator.next().
static int ceiNext (CollationElementIterator cei) int ceiNext (CollationElementIterator cei)
{ {
if (cei.lookahead_set) if (cei.lookahead_set)
{ {
...@@ -61,7 +61,7 @@ public class RuleBasedCollator extends Collator ...@@ -61,7 +61,7 @@ public class RuleBasedCollator extends Collator
boolean found = false; boolean found = false;
int i; int i;
for (i = save; i < max; ++i) for (i = save + 1; i <= max; ++i)
{ {
s = cei.text.substring(save, i); s = cei.text.substring(save, i);
if (prefixes.get(s) == null) if (prefixes.get(s) == null)
...@@ -108,16 +108,15 @@ public class RuleBasedCollator extends Collator ...@@ -108,16 +108,15 @@ public class RuleBasedCollator extends Collator
switch (strength) switch (strength)
{ {
case PRIMARY: case PRIMARY:
c |= CollationElementIterator.primaryOrder(os); c = os & ~0xffff;
/* Fall through. */ break;
case SECONDARY: case SECONDARY:
c |= CollationElementIterator.secondaryOrder(os); c = os & ~0x00ff;
/* Fall through. */
case TERTIARY:
c |= CollationElementIterator.tertiaryOrder(os);
break; break;
case TERTIARY:
case IDENTICAL: case IDENTICAL:
c = os; c = os;
break;
} }
if (c != 0) if (c != 0)
return c; return c;
...@@ -128,8 +127,8 @@ public class RuleBasedCollator extends Collator ...@@ -128,8 +127,8 @@ public class RuleBasedCollator extends Collator
{ {
CollationElementIterator cs, ct; CollationElementIterator cs, ct;
cs = new CollationElementIterator (source); cs = new CollationElementIterator (source, this);
ct = new CollationElementIterator (target); ct = new CollationElementIterator (target, this);
while (true) while (true)
{ {
...@@ -140,9 +139,15 @@ public class RuleBasedCollator extends Collator ...@@ -140,9 +139,15 @@ public class RuleBasedCollator extends Collator
&& ot == CollationElementIterator.NULLORDER) && ot == CollationElementIterator.NULLORDER)
break; break;
else if (os == CollationElementIterator.NULLORDER) else if (os == CollationElementIterator.NULLORDER)
return 1; {
// Source string is shorter, so return "less than".
return -1;
}
else if (ot == CollationElementIterator.NULLORDER) else if (ot == CollationElementIterator.NULLORDER)
return -1; {
// Target string is shorter, so return "greater than".
return 1;
}
if (os != ot) if (os != ot)
return os - ot; return os - ot;
...@@ -168,7 +173,7 @@ public class RuleBasedCollator extends Collator ...@@ -168,7 +173,7 @@ public class RuleBasedCollator extends Collator
int max = source.length(); int max = source.length();
for (int i = 0; i < max; ++i) for (int i = 0; i < max; ++i)
decomposeCharacter (source.charAt(i), expand); decomposeCharacter (source.charAt(i), expand);
return new CollationElementIterator (expand.toString()); return new CollationElementIterator (expand.toString(), this);
} }
public CollationKey getCollationKey (String source) public CollationKey getCollationKey (String source)
......
...@@ -30,7 +30,7 @@ java::text::Collator::decomposeCharacter (jchar c, ...@@ -30,7 +30,7 @@ java::text::Collator::decomposeCharacter (jchar c,
return; return;
} }
struct decomp_entry *base; const struct decomp_entry *base;
int high; int high;
if (decmp == FULL_DECOMPOSITION) if (decmp == FULL_DECOMPOSITION)
......
...@@ -36,33 +36,34 @@ public final class Locale implements java.io.Serializable, Cloneable ...@@ -36,33 +36,34 @@ public final class Locale implements java.io.Serializable, Cloneable
public Locale (String languageCode, String countryCode) public Locale (String languageCode, String countryCode)
{ {
language = languageCode.toLowerCase(); this (languageCode, countryCode, "");
country = countryCode.toUpperCase();
hashcode = languageCode.hashCode() ^ countryCode.hashCode();
} }
public Locale (String languageCode, String countryCode, public Locale (String languageCode, String countryCode,
String variantCode) String variantCode)
{ {
this (languageCode, countryCode); // We must explicitly check the arguments.
variant = variantCode; if (languageCode == null || countryCode == null
hashcode ^= variantCode.hashCode(); || variantCode == null)
throw new NullPointerException ();
language = languageCode.toLowerCase();
country = countryCode.toUpperCase();
variant = variantCode.toUpperCase();
hashcode = (languageCode.hashCode()
^ countryCode.hashCode()
^ variantCode.hashCode());
} }
public Object clone () public Object clone ()
{ {
return (Object) new Locale (language, country, variant); return (Object) new Locale (language, country, variant);
} }
public boolean equals (Object obj) public boolean equals (Object obj)
{ {
if (! (obj instanceof Locale)) if (! (obj instanceof Locale))
return false; return false;
Locale loc = (Locale) obj; Locale loc = (Locale) obj;
if ((language == null && loc.language != null)
|| (country == null && loc.country != null)
|| (variant == null && loc.variant != null))
return false;
return (language.equals(loc.language) return (language.equals(loc.language)
&& country.equals(loc.country) && country.equals(loc.country)
&& variant.equals(loc.variant)); && variant.equals(loc.variant));
...@@ -115,7 +116,7 @@ public final class Locale implements java.io.Serializable, Cloneable ...@@ -115,7 +116,7 @@ public final class Locale implements java.io.Serializable, Cloneable
result.append(language); result.append(language);
result.append('_'); result.append('_');
result.append(country); result.append(country);
if (variant != null && variant.length() > 0) if (variant.length() > 0)
{ {
result.append('_'); result.append('_');
result.append(variant); result.append(variant);
......
...@@ -20,6 +20,9 @@ public abstract class ResourceBundle ...@@ -20,6 +20,9 @@ public abstract class ResourceBundle
{ {
protected ResourceBundle parent; protected ResourceBundle parent;
// This is used to cache resource bundles.
private static Hashtable resource_cache = new Hashtable ();
public ResourceBundle () public ResourceBundle ()
{ {
} }
...@@ -65,15 +68,17 @@ public abstract class ResourceBundle ...@@ -65,15 +68,17 @@ public abstract class ResourceBundle
String stopHere) String stopHere)
{ {
Class rbc; Class rbc;
ResourceBundle needs_parent = null, r, result = null;
while (true) while (true)
{ {
try try
{ {
rbc = Class.forName(bundleName); rbc = Class.forName(bundleName);
r = null;
try try
{ {
return (ResourceBundle) rbc.newInstance(); r = (ResourceBundle) rbc.newInstance();
} }
catch (IllegalAccessException ex) catch (IllegalAccessException ex)
{ {
...@@ -83,45 +88,61 @@ public abstract class ResourceBundle ...@@ -83,45 +88,61 @@ public abstract class ResourceBundle
{ {
// Fall through // 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) catch (ClassNotFoundException ex)
{ {
if (bundleName.compareTo(stopHere) == 0) // Fall through.
return null; }
else
{ if (bundleName.equals(stopHere))
int last = bundleName.lastIndexOf('_'); return result;
else
// No more underscores? {
if (last == -1) int last = bundleName.lastIndexOf('_');
return null;
// Loop around, testing this new shorter name. // No more underscores?
bundleName = bundleName.substring(0, last); 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. // Search for bundles, but stop at baseName_language (if required).
private static final ResourceBundle partialGetBundle (String baseName, // This is synchronized so that the cache works correctly.
Locale locale) private static final synchronized ResourceBundle
partialGetBundle (String baseName, Locale locale, boolean langStop)
{ {
ResourceBundle rb; ResourceBundle rb;
String bundleName = (baseName String bundleName = baseName + "_" + locale;
+ "_"
+ locale.getLanguage() + "_" // Check the cache.
+ locale.getCountry() + "_" Object obj = resource_cache.get(bundleName);
+ locale.getVariant()); if (obj != null)
return (ResourceBundle) obj;
String stopHere = (baseName String stopHere = (baseName
+ "_" + (langStop ? ("_" + locale.getLanguage()) : ""));
+ locale.getLanguage());
rb = trySomeGetBundle(bundleName, stopHere); rb = trySomeGetBundle(bundleName, stopHere);
if (rb != null)
resource_cache.put(bundleName, rb);
return rb; return rb;
} }
...@@ -138,39 +159,18 @@ public abstract class ResourceBundle ...@@ -138,39 +159,18 @@ public abstract class ResourceBundle
if (locale == null) if (locale == null)
throw new NullPointerException (); throw new NullPointerException ();
rb = partialGetBundle(baseName, locale); rb = partialGetBundle(baseName, locale, false);
if (rb != null) if (rb != null)
return rb; return rb;
// Finally, try the default locale.
if (! locale.equals(Locale.getDefault())) if (! locale.equals(Locale.getDefault()))
{ {
rb = partialGetBundle(baseName, Locale.getDefault()); rb = partialGetBundle(baseName, Locale.getDefault(), true);
if (rb != null) if (rb != null)
return rb; 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", throw new MissingResourceException("can't load bundle",
baseName, baseName,
"bundle"); "bundle");
......
...@@ -22,8 +22,8 @@ java.text.StringCharacterIterator.iter ...@@ -22,8 +22,8 @@ java.text.StringCharacterIterator.iter
# java.text.SimpleDateFormat.getAndSet2DigitYearStart # java.text.SimpleDateFormat.getAndSet2DigitYearStart
!java.text.ACIAttribute !java.text.ACIAttribute
!java.text.AttributedCharacterIterator !java.text.AttributedCharacterIterator
!java.text.Collator java.text.Collator
!java.text.RuleBasedCollator java.text.RuleBasedCollator
!java.text.resources !java.text.resources
!java.text.DateFormat !java.text.DateFormat
!java.util.zip !java.util.zip
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment