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