Uploaded image for project: 'Struts 1'
  1. Struts 1
  2. STR-2923

PropertyMessageResources.getMessage uses loadLocale in wrong order

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Duplicate
    • 1.2.9, 1.2 Family, 1.3.5
    • None
    • Core
    • None
    • default locale on windows platform is fi_FI
    • Patch

    Description

      if you have following messagebundles:
      bundle_fi.properties
      bundle.properties

      And want to any other locale except fi to use bundle.properties. It is not possible without setting JVM default locale something else than fi locale. Problem with this approach is that you possible end up effecting behaviour of other software running on the same JVM.

      To solve this problem PropertyMessageResources.getMessage implementation
      could be changed to do locale loading in different order.

      current order is: asked locale, asked locale minus underscore, JVM default locale, no locale

      proposed order: asked locale, asked locale minus underscore, no locale, JVM default locale

      Current code:
      public String getMessage(Locale locale, String key) {
      if (log.isDebugEnabled())

      { log.debug("getMessage(" + locale + "," + key + ")"); }
      String localeKey = localeKey(locale);
      String originalKey = messageKey(localeKey, key);
      String messageKey = null;
      String message = null;
      int underscore = 0;
      boolean addIt = false;
      while (true) {
      loadLocale(localeKey);
      messageKey = messageKey(localeKey, key);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null) {
      if (addIt) { messages.put(originalKey, message); }
      return (message);
      }
      }
      addIt = true;
      underscore = localeKey.lastIndexOf("_");
      if (underscore < 0) { break; }
      localeKey = localeKey.substring(0, underscore);
      }
      if (!defaultLocale.equals(locale)) {
      localeKey = localeKey(defaultLocale);
      messageKey = messageKey(localeKey, key);
      loadLocale(localeKey);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null) { messages.put(originalKey, message); return (message); }
      }
      }
      localeKey = "";
      messageKey = messageKey(localeKey, key);
      loadLocale(localeKey);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null) { messages.put(originalKey, message); return (message); }
      }
      if (returnNull) { return (null); } else { return ("???" + messageKey(locale, key) + "???"); }
      }


      proposed code:

      public String getMessage(Locale locale, String key) {
      if (log.isDebugEnabled()) { log.debug("getMessage(" + locale + "," + key + ")"); }


      String localeKey = localeKey(locale);
      String originalKey = messageKey(localeKey, key);
      String messageKey = null;
      String message = null;
      int underscore = 0;
      boolean addIt = false;
      while (true) {
      loadLocale(localeKey);
      messageKey = messageKey(localeKey, key);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null) {
      if (addIt)

      { messages.put(originalKey, message); }


      return (message);
      }
      }
      addIt = true;
      underscore = localeKey.lastIndexOf("_");
      if (underscore < 0)

      { break; }


      localeKey = localeKey.substring(0, underscore);
      }
      localeKey = "";
      messageKey = messageKey(localeKey, key);
      loadLocale(localeKey);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null)

      { messages.put(originalKey, message); return (message); }


      }

      if (!defaultLocale.equals(locale)) {
      localeKey = localeKey(defaultLocale);
      messageKey = messageKey(localeKey, key);
      loadLocale(localeKey);
      synchronized (messages) {
      message = (String)messages.get(messageKey);
      if (message != null)

      { messages.put(originalKey, message); return (message); }


      }
      }

      if (returnNull)

      { return (null); }

      else

      { return ("???" + messageKey(locale, key) + "???"); }


      }

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              atirkkon Antti Tirkkonen
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: