Issue Details (XML | Word | Printable)

Key: STR-2923
Type: Bug Bug
Status: Closed Closed
Resolution: Duplicate
Priority: Minor Minor
Assignee: Unassigned
Reporter: Antti Tirkkonen
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Struts 1

PropertyMessageResources.getMessage uses loadLocale in wrong order

Created: 09/Aug/06 10:46 AM   Updated: 04/Jul/07 05:31 AM
Component/s: Core
Affects Version/s: 1.2.9, 1.2 Family, 1.3.5
Fix Version/s: None

Environment: default locale on windows platform is fi_FI
Issue Links:
Duplicate
 
Required
 

Flags: Patch


 Description  « Hide
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) + "???");
         }
     }



 All   Comments   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Niall Pemberton added a comment - 29/Nov/06 12:32 PM
This issue has been resolved by STR-2925 - PropertyMessageResources can now be configured to operate in one of three modes. See STR-2925 for details.