Hi Craig,

I found also a similiar problem with the <s:message /> tag. I will open a
now issue about them two.

Alonso

2006/5/12, Craig McClanahan <[EMAIL PROTECTED]>:

On 5/12/06, A. Alonso Dominguez <[EMAIL PROTECTED]> wrote:
>
> Hi there,
>
> I think that there is a bug in the implementation of the "
> org.apache.struts.faces.taglib.LoadMessagesTag". When working in a
> multimodule webapp with several <messages-resources /> per module, the
> <s:loadMessages /> tag can't find the appropiate MessageResources
instance
> via "messages" attribute.
>
> The reason for this is the way that the tag uses to locate the
appropiate
> MessageResources instance. This code explains it (line 76):
>
> public int doStartTag() {
>
>         // Acquire the Locale to be wrapped
>         Locale locale =
>             FacesContext.getCurrentInstance().getViewRoot().getLocale();
>
>         // Acquire the MessageResources to be wrapped
>         MessageResources messages = null;
>         if (this.messages == null) {
>             messages = (MessageResources)
>                 pageContext.getAttribute(Globals.MESSAGES_KEY,
>                                          PageContext.REQUEST_SCOPE);
>             if (messages == null) {
>                 messages = (MessageResources)
>                     pageContext.getAttribute(Globals.MESSAGES_KEY,
>
PageContext.APPLICATION_SCOPE
> );
>             }
>         } else {
>             messages = (MessageResources)
>                 pageContext.getAttribute(this.messages,
>                                          PageContext.REQUEST_SCOPE);
>         }
>
>         // Expose a Map instance under the specified request attribute
key
>         pageContext.setAttribute(var,
>                                  new MessagesMap(messages, locale),
>                                  PageContext.APPLICATION_SCOPE);
>
>         // Skip the body of this tag (if any)
>         return (SKIP_BODY);
>
>     }
>
> As you can see, this code doesn't supports modules.
>
> If we want to load a different bundle than the one configured as the
> default, we must use the "messages" attribute but this code tries to
load
> that MessageResources instance from the APPLICATION_SCOPE rather that
> search
> for it inside the REQUEST_SCOPE.
>
> In a multimodule webapp the MessageResources instances are loaded on
> startup
> inside the APPLICATION_SCOPE with the key:
> org.apache.struts.action/MESSAGE + [modulePrefix]
>
> If we have more than one MessageResources instance per module the will
be
> loaded with the key:
> [bundleKey] + [modulePrefix]
>
>
> So, the above code can't load any of those kind of messages resources.
> This
> can be solved easily:
>
> public int doStartTag() throws JspException {
>
>         // Acquire the Locale to be wrapped
>         Locale locale =
>             FacesContext.getCurrentInstance().getViewRoot().getLocale();
>
>         ModuleConfig modConfig = ModuleUtils.getInstance
> ().getModuleConfig(
>             (HttpServletRequest) pageContext.getRequest(),
> pageContext.getServletContext());
>
>         // Acquire the MessageResources to be wrapped
>         MessageResources messages = null;
>         if (this.messages == null) {
>             messages = (MessageResources)
>                 pageContext.getAttribute(Globals.MESSAGES_KEY,
>                                          PageContext.REQUEST_SCOPE);
>             if (messages == null) {
>                 messages = (MessageResources)
>                     pageContext.getAttribute(Globals.MESSAGES_KEY +
> modConfig.getPrefix(),
>
PageContext.APPLICATION_SCOPE
> );
>             }
>         } else {
>             messages = (MessageResources)
>                 pageContext.getAttribute(this.messages,
>                                          PageContext.REQUEST_SCOPE);
>
>             if(messages == null) {
>                 messages = (MessageResources)
>                     pageContext.getAttribute(this.messages +
> modConfig.getPrefix(),
>
PageContext.APPLICATION_SCOPE
> );
>             }
>         }
>
>         if(messages == null)
>             throw new JspException("MessageResources bundle " +
>                                                this.messages + " not
> found");
>
>         // Expose a Map instance under the specified request attribute
key
>         pageContext.setAttribute(var,
>                                  new MessagesMap(messages, locale),
>                                  PageContext.REQUEST_SCOPE);
>
>         // Skip the body of this tag (if any)
>         return (SKIP_BODY);
>
>     }
>
> Should I open a new issue about this?


Yes please ... this is not an issue (pardon the pun :-) that I was aware
of.

http://issues.apache.org/struts/

Alonso
>
> Craig


Reply via email to