[ https://issues.apache.org/struts/browse/STR-3151?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=44013#action_44013 ]
Niall Pemberton commented on STR-3151: -------------------------------------- Could you describe the scenario where this has caused a problem? >From memory the ActionMessages's accessed flag is only used in the >CacheMessages[1] / RemoveCachedMessages[2] commands and typically anyone using ><html:messagesPresent> then goes on to do something with them. I'm not objecting to this (yet) - but I would like to understand the use-case. [1] http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/CacheMessages.java [2] http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/RemoveCachedMessages.java > 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.