[ 
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.

Reply via email to