private ResourceBundle getResourceBundleInternal()

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;
    }