[ https://issues.apache.org/struts/browse/STR-3151?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=44055#action_44055 ]
paul4christ79 edited comment on STR-3151 at 6/6/08 5:32 AM: ------------------------------------------------------------ TJ, thank you for the issue report. Based on the conversation, it does appear you pointed out a logical flaw but, to Niall's point, will not occur in practice. If you find a better use case, let us know! It's easy to reopen this ticket and fix it. was (Author: paul4christ79): TJ, thank you for the issue report. Based on the conversation, it does appear you pointed out a logical flaw but, to Niall's point, will not occur in practice. If you find a better use, let us know! It's easy to reopen this ticket and fix it. > 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 > > 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.