[ https://issues.apache.org/struts/browse/STR-3151?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=44025#action_44025 ]
T.J. Hill commented on STR-3151: -------------------------------- A scenario was described in my earlier comment. I came across this while tracking down a bug that turned out to be in my code, but at first, thought this issue was the lone culprit. Sure - changing ActionMessages.isAccessed() from mutating to purely interrogative could break existing usages. Plenty of ways around it when dealing with the scenario described earlier. I've re-up'd and moved on. So in hindsight, priority should probably be lowered. And if this hasn't come up before, then maybe precedence wins out and the issue be canceled. Although I still regard ActionMessages.isAccessed() as troubled, I yield to the status quo. Thanks for your time and quick feedback - TH > messagesPresent should not alter ActionMessages.accessed flag > ------------------------------------------------------------- > > Key: STR-3151 > URL: https://issues.apache.org/struts/browse/STR-3151 > Project: Struts 1 > Issue Type: Bug > Components: Taglibs > Affects Versions: 1.3.8 > Environment: n/a > Reporter: T.J. Hill > Assignee: Paul Benedict > Fix For: 1.4.0 > > > 20080603 12:53 > The html|nested:messagesPresent tags set ActionMessages.accessed flag to true > when interrogating. > Currently, MessagesPresentTag calls the methods get() and get(String) of > ActionMessages to determine if any messages exist. However, both get(...) > methods in ActionMessages set the accessed field to true. So any subsequent > call to ActionMessages.isAccessed() by external code will get true, > regardless if the messages were truly consumed. > Below is the current condition method in MessagesPresentTag: > protected boolean condition(boolean desired) > throws JspException { > ActionMessages am = null; > String key = name; > if ((message != null) && "true".equalsIgnoreCase(message)) { > key = Globals.MESSAGE_KEY; > } > try { > am = TagUtils.getInstance().getActionMessages(pageContext, key); > } catch (JspException e) { > TagUtils.getInstance().saveException(pageContext, e); > throw e; > } > Iterator iterator = (property == null) ? am.get() : am.get(property); > // HERE is the issue -- using get(...) methods will cause the accessed > property of ActionMessages to be set to true. > return (iterator.hasNext() == desired); > } > Perhaps the following change would be appropriate to resolve the issue. > Modify the condition(boolean) method in MesssagesPresentTag to call the > existing ActionMessages.size() [when property not specified] and the exsiting > ActionMessages.size(String) method above [when property specified]: > > protected boolean condition(boolean desired) > throws JspException { > ActionMessages am = null; > > String key = name; > > if ((message != null) && "true".equalsIgnoreCase(message)) { > key = Globals.MESSAGE_KEY; > } > > try { > am = TagUtils.getInstance().getActionMessages(pageContext, key); > } catch (JspException e) { > TagUtils.getInstance().saveException(pageContext, e); > throw e; > } > > // --- CURRENT --- > //Iterator iterator = (property == null) ? am.get() : > am.get(property); > //return (iterator.hasNext() == desired); > > // +++ SUGGESTED +++ > int present = (property == null) ? am.size() : am.size(property); > return ((present > 0) == desired); > } > > Thanks - TH -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.