Repository: struts Updated Branches: refs/heads/develop ca50c1aed -> 935cd33f7
WW-4165 Excludes attributes marked with @StrutsTagAttribute Such attributes won't be used as dynamic attributes and simply will be omitted Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/935cd33f Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/935cd33f Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/935cd33f Branch: refs/heads/develop Commit: 935cd33f7e5731e92f114062e7bfdd5a63139a59 Parents: ca50c1a Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Tue Jul 29 20:24:01 2014 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Tue Jul 29 20:24:01 2014 +0200 ---------------------------------------------------------------------- .../apache/struts2/components/Component.java | 21 ++++++++++++++++++++ .../struts2/views/jsp/ui/AbstractUITag.java | 4 ++++ .../apache/struts2/views/jsp/ui/AnchorTest.java | 5 ++++- .../struts2/views/jsp/ui/ComponentTest.java | 13 ++++++++++++ .../apache/struts2/views/jsp/ui/RadioTest.java | 1 + 5 files changed, 43 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/935cd33f/core/src/main/java/org/apache/struts2/components/Component.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/components/Component.java b/core/src/main/java/org/apache/struts2/components/Component.java index 99e3aee..2db1cbc 100644 --- a/core/src/main/java/org/apache/struts2/components/Component.java +++ b/core/src/main/java/org/apache/struts2/components/Component.java @@ -22,14 +22,17 @@ package org.apache.struts2.components; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.AnnotationUtils; import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.ValueStack; +import org.apache.commons.lang3.StringUtils; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsException; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.apache.struts2.util.ComponentUtils; import org.apache.struts2.util.FastByteArrayOutputStream; +import org.apache.struts2.views.annotations.StrutsTagAttribute; import org.apache.struts2.views.jsp.TagUtils; import org.apache.struts2.views.util.UrlHelper; @@ -38,6 +41,8 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; +import java.lang.reflect.Method; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Stack; @@ -490,4 +495,20 @@ public class Component { return false; } + /** + * Checks if provided name is a valid tag's attribute + * + * @param attrName String name of attribute + * @return true if attribute with the same name was already defined + */ + public boolean isValidTagAttribute(String attrName) { + Collection<Method> annotatedMethods = AnnotationUtils.getAnnotatedMethods(getClass(), StrutsTagAttribute.class); + for (Method annotatedMethod : annotatedMethods) { + if (annotatedMethod.getName().contains(StringUtils.capitalize(attrName))) { + return true; + } + } + return false; + } + } http://git-wip-us.apache.org/repos/asf/struts/blob/935cd33f/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java b/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java index e57932a..d12b3a1 100644 --- a/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java +++ b/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java @@ -305,6 +305,10 @@ public abstract class AbstractUITag extends ComponentTagSupport implements Dynam } public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { + if (component.isValidTagAttribute(localName)) { + return; + } + if (ComponentUtils.altSyntax(getStack()) && ComponentUtils.isExpression(value)) { dynamicAttributes.put(localName, String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), value))); } else { http://git-wip-us.apache.org/repos/asf/struts/blob/935cd33f/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java index cba1b37..6511944 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java @@ -24,6 +24,8 @@ package org.apache.struts2.views.jsp.ui; import org.apache.struts2.TestAction; import org.apache.struts2.views.jsp.AbstractUITagTest; +import javax.servlet.jsp.JspException; + /** */ @@ -84,9 +86,10 @@ public class AnchorTest extends AbstractUITagTest { testAction.setFoo("bar"); } - private AnchorTag createTag() { + private AnchorTag createTag() throws JspException { AnchorTag tag = new AnchorTag(); tag.setPageContext(pageContext); + tag.doStartTag(); tag.setId("mylink"); return tag; http://git-wip-us.apache.org/repos/asf/struts/blob/935cd33f/core/src/test/java/org/apache/struts2/views/jsp/ui/ComponentTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/ComponentTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/ComponentTest.java index 77cb4ec..58a348a 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/ComponentTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/ComponentTest.java @@ -22,6 +22,7 @@ package org.apache.struts2.views.jsp.ui; import org.apache.struts2.TestAction; +import org.apache.struts2.components.Component; import org.apache.struts2.views.jsp.AbstractUITagTest; @@ -114,4 +115,16 @@ public class ComponentTest extends AbstractUITagTest { // System.out.println(writer); verify(ComponentTag.class.getResource("Component-param.txt")); } + + public void testTagAttributeExclusion() throws Exception { + FormTag tag = new FormTag(); + tag.setPageContext(pageContext); + + tag.doStartTag(); + tag.setDynamicAttribute("uri://some.uri", "includeContext", false); + + assertTrue(tag.includeContext); + } + } + http://git-wip-us.apache.org/repos/asf/struts/blob/935cd33f/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java index d3a9488..a3d01fa 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java @@ -185,6 +185,7 @@ public class RadioTest extends AbstractUITagTest { RadioTag tag = new RadioTag(); tag.setPageContext(pageContext); + tag.doStartTag(); tag.setLabel("mylabel"); tag.setName("myname"); tag.setValue("");