in src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java [475:531]
private ResourceBundle getResourceBundleInternal(
ResourceResolver optionalResolver, final String baseName, Locale locale, final boolean forceReload) {
if (locale == null) {
locale = defaultLocale;
}
final Key key = new Key(baseName, locale);
JcrResourceBundle resourceBundle = !forceReload ? resourceBundleRegistry.getResourceBundle(key) : null;
if (resourceBundle != null) {
log.debug("getResourceBundleInternal({}): got cache hit on first try", key);
} else {
if (loadingGuards.get(key) == null) {
loadingGuards.putIfAbsent(key, new Semaphore(1));
}
final Semaphore loadingGuard = loadingGuards.get(key);
try {
loadingGuard.acquire();
resourceBundle = !forceReload ? resourceBundleRegistry.getResourceBundle(key) : null;
if (resourceBundle != null) {
log.debug("getResourceBundleInternal({}): got cache hit on second try", key);
} else {
log.debug("getResourceBundleInternal({}): reading from Repository", key);
ResourceResolver localResolver = null;
try {
if (optionalResolver == null) {
localResolver = createResourceResolver();
optionalResolver = localResolver;
}
resourceBundle = createResourceBundle(optionalResolver, key.baseName, key.locale);
resourceBundleRegistry.registerResourceBundle(key, resourceBundle);
final Set<String> languageRoots = resourceBundle.getLanguageRootPaths();
this.languageRootPaths.addAll(languageRoots);
log.debug("Key {} - added service registration and language roots {}", key, languageRoots);
log.info("Currently loaded dictionaries across all locales: {}", languageRootPaths);
} catch (final LoginException le) {
throw (MissingResourceException) new MissingResourceException(
"Unable to create service resource resolver", baseName, locale.toString())
.initCause(le);
} finally {
if (localResolver != null) {
localResolver.close();
}
}
}
} catch (InterruptedException e) {
Thread.interrupted();
} finally {
loadingGuard.release();
}
}
log.trace("getResourceBundleInternal({}) ==> {}", key, resourceBundle);
return resourceBundle;
}