Methods Summary |
---|
public static final java.util.ResourceBundle | getBundle(java.lang.String bundleName)Finds the named resource bundle for the default {@code Locale} and the caller's
{@code ClassLoader}.
// BEGIN android-changed
return getBundleImpl(bundleName, Locale.getDefault(), VMStack
.getCallingClassLoader());
// END android-changed
|
public static final java.util.ResourceBundle | getBundle(java.lang.String bundleName, java.util.Locale locale)Finds the named {@code ResourceBundle} for the specified {@code Locale} and the caller
{@code ClassLoader}.
// BEGIN android-changed
return getBundleImpl(bundleName, locale,
VMStack.getCallingClassLoader());
// END android-changed
|
public static java.util.ResourceBundle | getBundle(java.lang.String bundleName, java.util.Locale locale, java.lang.ClassLoader loader)Finds the named resource bundle for the specified {@code Locale} and {@code ClassLoader}.
The passed base name and {@code Locale} are used to create resource bundle names.
The first name is created by concatenating the base name with the result
of {@link Locale#toString()}. From this name all parent bundle names are
derived. Then the same thing is done for the default {@code Locale}. This results
in a list of possible bundle names.
Example For the basename "BaseName", the {@code Locale} of the
German part of Switzerland (de_CH) and the default {@code Locale} en_US the list
would look something like this:
- BaseName_de_CH
- BaseName_de
- Basename_en_US
- Basename_en
- BaseName
This list also shows the order in which the bundles will be searched for a requested
resource in the German part of Switzerland (de_CH).
As a first step, this method tries to instantiate
a {@code ResourceBundle} with the names provided.
If such a class can be instantiated and initialized, it is returned and
all the parent bundles are instantiated too. If no such class can be
found this method tries to load a {@code .properties} file with the names by
replacing dots in the base name with a slash and by appending
"{@code .properties}" at the end of the string. If such a resource can be found
by calling {@link ClassLoader#getResource(String)} it is used to
initialize a {@link PropertyResourceBundle}. If this succeeds, it will
also load the parents of this {@code ResourceBundle}.
For compatibility with older code, the bundle name isn't required to be
a fully qualified class name. It's also possible to directly pass
the path to a properties file (without a file extension).
if (loader == null) {
throw new NullPointerException();
}
// BEGIN android-changed
return getBundleImpl(bundleName, locale, loader);
// END android-changed
|
private static java.util.ResourceBundle | getBundleImpl(java.lang.String bundleName, java.util.Locale locale, java.lang.ClassLoader loader)
if (bundleName != null) {
ResourceBundle bundle;
// BEGIN android-added
if (!defaultLocale.equals(Locale.getDefault())) {
cache.clear();
defaultLocale = Locale.getDefault();
}
// END android-added
if (!locale.equals(Locale.getDefault())) {
String localeName = locale.toString();
if (localeName.length() > 0) {
localeName = "_" + localeName; //$NON-NLS-1$
}
if ((bundle = handleGetBundle(bundleName, localeName, false,
loader)) != null) {
return bundle;
}
}
String localeName = Locale.getDefault().toString();
if (localeName.length() > 0) {
localeName = "_" + localeName; //$NON-NLS-1$
}
if ((bundle = handleGetBundle(bundleName, localeName, true, loader)) != null) {
return bundle;
}
throw new MissingResourceException(null, bundleName + '_" + locale,
""); //$NON-NLS-1$
}
throw new NullPointerException();
|
public abstract java.util.Enumeration | getKeys()Returns the names of the resources contained in this {@code ResourceBundle}.
|
public java.util.Locale | getLocale()Gets the {@code Locale} of this {@code ResourceBundle}. In case a bundle was not
found for the requested {@code Locale}, this will return the actual {@code Locale} of
this resource bundle that was found after doing a fallback.
return locale;
|
public final java.lang.Object | getObject(java.lang.String key)Returns the named resource from this {@code ResourceBundle}. If the resource
cannot be found in this bundle, it falls back to the parent bundle (if
it's not null) by calling the {@link #handleGetObject} method. If the resource still
can't be found it throws a {@code MissingResourceException}.
ResourceBundle last, theParent = this;
do {
Object result = theParent.handleGetObject(key);
if (result != null) {
return result;
}
last = theParent;
theParent = theParent.parent;
} while (theParent != null);
throw new MissingResourceException(null, last.getClass().getName(), key);
|
public final java.lang.String | getString(java.lang.String key)Returns the named string resource from this {@code ResourceBundle}.
return (String) getObject(key);
|
public final java.lang.String[] | getStringArray(java.lang.String key)Returns the named resource from this {@code ResourceBundle}.
return (String[]) getObject(key);
|
private static java.util.ResourceBundle | handleGetBundle(java.lang.String base, java.lang.String locale, boolean loadBase, java.lang.ClassLoader loader)
ResourceBundle bundle = null;
String bundleName = base + locale;
Object cacheKey = loader != null ? (Object) loader : (Object) "null"; //$NON-NLS-1$
Hashtable<String, ResourceBundle> loaderCache;
synchronized (cache) {
loaderCache = cache.get(cacheKey);
if (loaderCache == null) {
loaderCache = new Hashtable<String, ResourceBundle>(13);
cache.put(cacheKey, loaderCache);
}
}
ResourceBundle result = loaderCache.get(bundleName);
if (result != null) {
if (result == MISSINGBASE) {
return null;
}
if (result == MISSING) {
if (!loadBase) {
return null;
}
String extension = strip(locale);
if (extension == null) {
return null;
}
return handleGetBundle(base, extension, loadBase, loader);
}
return result;
}
try {
// BEGIN android-changed
/*
* Intercept loading of ResourceBundles that contain Harmony
* I18N data. Deliver our special, ICU-based bundles in this case.
* All other ResourceBundles use the ordinary mechanism, so user
* code behaves as it should.
*/
if(bundleName.startsWith("org.apache.harmony.luni.internal.locale.")) {
String icuBundleName = bundleName.substring(40);
String icuLocale = (locale.length() > 0 ? locale.substring(1) : locale);
// we know that Resources will deliver an assignable class
bundle = Resources.getInstance(icuBundleName, icuLocale);
} else {
Class<?> bundleClass = Class.forName(bundleName, true, loader);
if (ResourceBundle.class.isAssignableFrom(bundleClass)) {
bundle = (ResourceBundle) bundleClass.newInstance();
}
}
// END android-changed
} catch (LinkageError e) {
} catch (Exception e) {
}
// BEGIN android-added
// copied from newer version of Harmony
if (bundle != null) {
bundle.setLocale(locale);
}
// END android-added
if (bundle == null) {
final String fileName = bundleName.replace('.", '/");
InputStream stream = AccessController
.doPrivileged(new PrivilegedAction<InputStream>() {
public InputStream run() {
return loader == null ? ClassLoader
.getSystemResourceAsStream(fileName
+ ".properties") : loader //$NON-NLS-1$
.getResourceAsStream(fileName
+ ".properties"); //$NON-NLS-1$
}
});
if (stream != null) {
try {
try {
bundle = new PropertyResourceBundle(stream);
} finally {
stream.close();
}
bundle.setLocale(locale);
} catch (IOException e) {
}
}
}
String extension = strip(locale);
if (bundle != null) {
if (extension != null) {
ResourceBundle parent = handleGetBundle(base, extension, true,
loader);
if (parent != null) {
bundle.setParent(parent);
}
}
loaderCache.put(bundleName, bundle);
return bundle;
}
if (extension != null && (loadBase || extension.length() > 0)) {
bundle = handleGetBundle(base, extension, loadBase, loader);
if (bundle != null) {
loaderCache.put(bundleName, bundle);
return bundle;
}
}
loaderCache.put(bundleName, loadBase ? MISSINGBASE : MISSING);
return null;
|
protected abstract java.lang.Object | handleGetObject(java.lang.String key)Returns the named resource from this {@code ResourceBundle}, or null if the
resource is not found.
|
private void | setLocale(java.lang.String name)
String language = "", country = "", variant = ""; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
if (name.length() > 1) {
int nextIndex = name.indexOf('_", 1);
if (nextIndex == -1) {
nextIndex = name.length();
}
language = name.substring(1, nextIndex);
if (nextIndex + 1 < name.length()) {
int index = nextIndex;
nextIndex = name.indexOf('_", nextIndex + 1);
if (nextIndex == -1) {
nextIndex = name.length();
}
country = name.substring(index + 1, nextIndex);
if (nextIndex + 1 < name.length()) {
variant = name.substring(nextIndex + 1, name.length());
}
}
}
locale = new Locale(language, country, variant);
|
protected void | setParent(java.util.ResourceBundle bundle)Sets the parent resource bundle of this {@code ResourceBundle}. The parent is
searched for resources which are not found in this {@code ResourceBundle}.
parent = bundle;
|
private static java.lang.String | strip(java.lang.String name)
int index = name.lastIndexOf('_");
if (index != -1) {
return name.substring(0, index);
}
return null;
|