/**
  * Returns the Default Resource Bundle (JiraWebActionSupport.properties) for the given locale.
  *
  * @param locale The locale.
  * @return the Default Resource Bundle (JiraWebActionSupport.properties) for the given locale.
  */
 public static ResourceBundle getDefaultResourceBundle(final Locale locale) {
   ResourceBundle resourceBundle = resourceBundleMap.get(locale);
   if (resourceBundle == null) {
     if (JiraSystemProperties.isI18nReloadBundles()) {
       //
       // in dev mode we want to use a resource bundle that can reload itself if the underlying
       // file changes
       // so we use our own home grown ResourceBundle.  This guy is reasonable efficient and its
       // only used
       // in dev mode anyways
       //
       resourceBundle =
           DebuggingResourceBundle.getDebuggingResourceBundle(
               DEFAULT_RESOURCE_BUNDLE_NAME, locale);
     }
     if (resourceBundle == null) {
       // The default resource bundle must live in the standard class loader because it holds
       // translations for core JIRA.
       resourceBundle = ResourceBundle.getBundle(DEFAULT_RESOURCE_BUNDLE_NAME, locale);
     }
     final ResourceBundle result = resourceBundleMap.putIfAbsent(locale, resourceBundle);
     return (result == null) ? resourceBundle : result;
   }
   return resourceBundle;
 }
/**
 * Provides access to the default ResourceBundle. That is, the bundle for
 * "JiraWebActionSupport.properties" for the various languanges/locales.
 *
 * <p>
 *
 * <p>This class caches the ResourceBundle per locale, because the lookup is expensive and causes
 * thread contention. Default ResourceBundles must live in the core ClassLoader and can be cached
 * permanently as they cannot change. This is not so simple for custom translations for plugins
 * (other ResourceBundles), and so they are not included here.
 *
 * @since v4.0
 */
public class DefaultResourceBundle {
  private static final CopyOnWriteMap<Locale, ResourceBundle> resourceBundleMap =
      CopyOnWriteMap.newHashMap();
  public static final String DEFAULT_RESOURCE_BUNDLE_NAME = JiraWebActionSupport.class.getName();

  /**
   * Returns the Default Resource Bundle (JiraWebActionSupport.properties) for the given locale.
   *
   * @param locale The locale.
   * @return the Default Resource Bundle (JiraWebActionSupport.properties) for the given locale.
   */
  public static ResourceBundle getDefaultResourceBundle(final Locale locale) {
    ResourceBundle resourceBundle = resourceBundleMap.get(locale);
    if (resourceBundle == null) {
      if (JiraSystemProperties.isI18nReloadBundles()) {
        //
        // in dev mode we want to use a resource bundle that can reload itself if the underlying
        // file changes
        // so we use our own home grown ResourceBundle.  This guy is reasonable efficient and its
        // only used
        // in dev mode anyways
        //
        resourceBundle =
            DebuggingResourceBundle.getDebuggingResourceBundle(
                DEFAULT_RESOURCE_BUNDLE_NAME, locale);
      }
      if (resourceBundle == null) {
        // The default resource bundle must live in the standard class loader because it holds
        // translations for core JIRA.
        resourceBundle = ResourceBundle.getBundle(DEFAULT_RESOURCE_BUNDLE_NAME, locale);
      }
      final ResourceBundle result = resourceBundleMap.putIfAbsent(locale, resourceBundle);
      return (result == null) ? resourceBundle : result;
    }
    return resourceBundle;
  }

  /**
   * Returns <tt>true</tt> if and only if the default resource bundle data is stale for the given
   * locale. This is used by <tt>I18nBean.CachingFactory</tt> to flush the cache when the default
   * resource bundle is modified. This is only relevant in dev mode, as otherwise we will not have a
   * <tt>DebuggingResourceBundle</tt> and so can not reload it anyway.
   *
   * @param locale the locale within which to make the check
   * @return <tt>true</tt> if the data has to be reloaded; <tt>false</tt> otherwise.
   */
  public static boolean isDefaultResourceBundleStale(final Locale locale) {
    ResourceBundle resourceBundle = resourceBundleMap.get(locale);
    return resourceBundle instanceof DebuggingResourceBundle
        && ((DebuggingResourceBundle) resourceBundle).isStale();
  }
}
 /**
  * Returns <tt>true</tt> if and only if the default resource bundle data is stale for the given
  * locale. This is used by <tt>I18nBean.CachingFactory</tt> to flush the cache when the default
  * resource bundle is modified. This is only relevant in dev mode, as otherwise we will not have a
  * <tt>DebuggingResourceBundle</tt> and so can not reload it anyway.
  *
  * @param locale the locale within which to make the check
  * @return <tt>true</tt> if the data has to be reloaded; <tt>false</tt> otherwise.
  */
 public static boolean isDefaultResourceBundleStale(final Locale locale) {
   ResourceBundle resourceBundle = resourceBundleMap.get(locale);
   return resourceBundle instanceof DebuggingResourceBundle
       && ((DebuggingResourceBundle) resourceBundle).isStale();
 }