Map result = null;
// Spec says empty local returns raw headers.
if ((locale == null) || (locale.length() == 0))
{
result = new StringMap(m_manifest, false);
}
// If we have no result, try to get it from the cached headers.
if (result == null)
{
synchronized (m_cachedHeaders)
{
// If the bundle is uninstalled, then the cached headers should
// only contain the localized headers for the default locale at
// the time of uninstall, so just return that.
if (getState() == Bundle.UNINSTALLED)
{
result = (Map) m_cachedHeaders.values().iterator().next();
}
// If the bundle has been updated, clear the cached headers.
else if (getLastModified() > m_cachedHeadersTimestamp)
{
m_cachedHeaders.clear();
}
// Otherwise, returned the cached headers if they exist.
else
{
// Check if headers for this locale have already been
// resolved
if (m_cachedHeaders.containsKey(locale))
{
result = (Map) m_cachedHeaders.get(locale);
}
}
}
}
// If the requested locale is not cached, then try to create it.
if (result == null)
{
// Get a modifiable copy of the raw headers.
Map headers = new StringMap(m_manifest, false);
// Assume for now that this will be the result.
result = headers;
// Check to see if we actually need to localize anything
boolean localize = false;
for (Iterator it = headers.values().iterator(); !localize
&& it.hasNext();)
{
if (((String) it.next()).startsWith("%"))
{
localize = true;
}
}
if (!localize)
{
// If localization is not needed, just cache the headers and
// return
// them as-is. Not sure if this is useful
updateHeaderCache(locale, headers);
}
else
{
// Do localization here and return the localized headers
String basename = (String) headers
.get(Constants.BUNDLE_LOCALIZATION);
if (basename == null)
{
basename = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
}
// Create ordered list of files to load properties from
List resourceList = createLocalizationResourceList(basename,
locale);
// Create a merged props file with all available props for this
// locale
boolean found = false;
Properties mergedProperties = new Properties();
for (Iterator it = resourceList.iterator(); it.hasNext();)
{
URL temp = m_revision.getEntry(it.next() + ".properties");
if (temp != null)
{
found = true;
try
{
mergedProperties.load(temp.openConnection()
.getInputStream());
}
catch (IOException ex)
{
// File doesn't exist, just continue loop
}
}
}
// If the specified locale was not found, then the spec says we
// should
// return the default localization.
if (!found && !locale.equals(Locale.getDefault().toString()))
{
result = getCurrentLocalizedHeader(Locale.getDefault()
.toString());
}
// Otherwise, perform the localization based on the discovered
// properties and cache the result.
else
{
// Resolve all localized header entries
for (Iterator it = headers.entrySet().iterator(); it
.hasNext();)
{
Map.Entry entry = (Map.Entry) it.next();
String value = (String) entry.getValue();
if (value.startsWith("%"))