blob: 939cf6bf4d45646910ff7aa08806d7732482b841 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2009-2011, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.impl;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.UResourceBundle;
/**
* Static utility functions for probing resource tables, used by ULocale and
* LocaleDisplayNames.
*/
public class ICUResourceTableAccess {
/**
* Utility to fetch locale display data from resource bundle tables. Convenience
* wrapper for {@link #getTableString(ICUResourceBundle, String, String, String)}.
*/
public static String getTableString(String path, ULocale locale, String tableName,
String itemName) {
ICUResourceBundle bundle = (ICUResourceBundle) UResourceBundle.
getBundleInstance(path, locale.getBaseName());
return getTableString(bundle, tableName, null, itemName);
}
/**
* Utility to fetch locale display data from resource bundle tables. Uses fallback
* through the "Fallback" resource if available.
*/
public static String getTableString(ICUResourceBundle bundle, String tableName,
String subtableName, String item) {
String result = null;
try {
for (;;) {
// special case currency
if ("currency".equals(subtableName)) {
ICUResourceBundle table = bundle.getWithFallback("Currencies");
table = table.getWithFallback(item);
return table.getString(1);
} else {
ICUResourceBundle table = lookup(bundle, tableName);
if (table == null) {
return item;
}
ICUResourceBundle stable = table;
if (subtableName != null) {
stable = lookup(table, subtableName);
}
if (stable != null) {
ICUResourceBundle sbundle = lookup(stable, item);
if (sbundle != null) {
result = sbundle.getString(); // possible real exception
break;
}
}
// if we get here, stable was null, or sbundle was null
if (subtableName == null) {
// may be a deprecated code
String currentName = null;
if (tableName.equals("Countries")) {
currentName = LocaleIDs.getCurrentCountryID(item);
} else if (tableName.equals("Languages")) {
currentName = LocaleIDs.getCurrentLanguageID(item);
}
ICUResourceBundle sbundle = lookup(table, currentName);
if (sbundle != null) {
result = sbundle.getString(); // possible real exception
break;
}
}
// still can't figure it out? try the fallback mechanism
ICUResourceBundle fbundle = lookup(table, "Fallback");
if (fbundle == null) {
return item;
}
String fallbackLocale = fbundle.getString(); // again, possible exception
if (fallbackLocale.length() == 0) {
fallbackLocale = "root";
}
if (fallbackLocale.equals(table.getULocale().getName())) {
return item;
}
bundle = (ICUResourceBundle) UResourceBundle.getBundleInstance(
bundle.getBaseName(), fallbackLocale);
}
}
} catch (Exception e) {
// If something is seriously wrong, we might call getString on a resource that is
// not a string. That will throw an exception, which we catch and ignore here.
}
// If the result is empty return item instead
return ((result != null && result.length() > 0) ? result : item);
}
// utility to make the call sites in the above code cleaner
private static ICUResourceBundle lookup(ICUResourceBundle bundle, String resName) {
return ICUResourceBundle.findResourceWithFallback(resName, bundle, null);
}
}