Walid Ghafir created WW-4036:
--------------------------------

             Summary: With javatemplate, dynamic attribute value evaluates to 
expression text if null
                 Key: WW-4036
                 URL: https://issues.apache.org/jira/browse/WW-4036
             Project: Struts 2
          Issue Type: Bug
          Components: Plugin - Java Templates
    Affects Versions: 2.3.12
            Reporter: Walid Ghafir


When using javatemplate plugin, if an attribute has an expression value that 
evaluates to null, the full expression text is displayed instead of just an 
empty string.

Example: 
<s:textfield placeholder="%{null}" name="%{null}"/> 
will output
<input type="text" placeholder="%{null}" name=""/> 
in the HTML.

By debugging, I found it comes from AbstractUITag.setDynamicAttribute():
        dynamicAttributes.put(localName, 
String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), value)));

That problem does not occur with FTL themes as dynamic-attributes.flt uses 
TextParseUtil.translateVariables() which does what the doc says ("If an item 
cannot be found on the stack (null is returned), then the entire variable 
${...} is not displayed, just as if the item was on the stack but returned an 
empty string.").

Suggested fix #1

Change org.apache.struts2.views.java.simple.DynamicAttributesHandler.start() so 
that it does the same than dynamic-attributes.flt:

    @Override
    public void start(String name, Attributes a) throws IOException {
        Map<String, String> dynamicAttributes = (Map<String, String>) 
context.getParameters().get("dynamicAttributes");
        for (String key : dynamicAttributes.keySet())
                a.put(key, 
TextParseUtil.translateVariables(dynamicAttributes.get(key), 
context.getStack()));
        super.start(name, a);
    }

Suggested fix #2

Change org.apache.struts2.views.jsp.ui.setDynamicAttribute() so that it returns 
an empty string if the expression evaluates to null:

    public void setDynamicAttribute(String uri, String localName, Object value) 
throws JspException {
        if (ComponentUtils.altSyntax(getStack()) && 
ComponentUtils.isExpression(value)) {
            dynamicAttributes.put(localName, 
String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), "")));
        } else {
            dynamicAttributes.put(localName, value);
        }
    }

(but I no idea on the possible side effects it could produce).


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to