in src/main/cpp/resourcebundle.cpp [30:124]
ResourceBundlePtr ResourceBundle::getBundle(const LogString& baseName,
const Locale& locale)
{
LogString bundleName;
PropertyResourceBundlePtr resourceBundle, previous;
std::vector<LogString> bundlesNames;
if (!locale.getVariant().empty())
{
bundlesNames.push_back(baseName + LOG4CXX_STR("_") +
locale.getLanguage() + LOG4CXX_STR("_") +
locale.getCountry() + LOG4CXX_STR("_") +
locale.getVariant());
}
if (!locale.getCountry().empty())
{
bundlesNames.push_back(baseName + LOG4CXX_STR("_") +
locale.getLanguage() + LOG4CXX_STR("_") +
locale.getCountry());
}
if (!locale.getLanguage().empty())
{
bundlesNames.push_back(baseName + LOG4CXX_STR("_") +
locale.getLanguage());
}
bundlesNames.push_back(baseName);
for (std::vector<LogString>::iterator it = bundlesNames.begin();
it != bundlesNames.end(); it++)
{
bundleName = *it;
PropertyResourceBundlePtr current;
// Try loading a class which implements ResourceBundle
try
{
const Class& classObj = Loader::loadClass(bundleName);
ObjectPtr obj = ObjectPtr(classObj.newInstance());
current = log4cxx::cast<PropertyResourceBundle>(obj);
}
catch (ClassNotFoundException&)
{
current = 0;
}
// No class found, then try to create a PropertyResourceBundle from a file
if (current == 0)
{
InputStreamPtr bundleStream =
Loader::getResourceAsStream(
bundleName + LOG4CXX_STR(".properties"));
if (bundleStream == 0)
{
continue;
}
try
{
current = std::make_shared<PropertyResourceBundle>(bundleStream);
}
catch (Exception&)
{
throw;
}
}
// Add the new resource bundle to the hierarchy
if (resourceBundle == 0)
{
resourceBundle = current;
previous = current;
}
else
{
previous->setParent(current);
previous = current;
}
}
// no resource bundle found at all, then throw exception
if (resourceBundle == 0)
{
throw MissingResourceException(
((LogString) LOG4CXX_STR("Missing resource bundle ")) + baseName);
}
return resourceBundle;
}