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 2b0c58a3b..f45dac07d 100644 --- a/core/src/main/java/org/apache/struts2/components/Component.java +++ b/core/src/main/java/org/apache/struts2/components/Component.java @@ -384,9 +384,8 @@ public class Component { return expression; } } else { - expression = stripExpression(expression); - - return getStack().findValue(expression, toType, throwExceptionOnELFailure); + String strippedExpression = stripExpression(expression); + return getStack().findValue(strippedExpression, toType, throwExceptionOnELFailure); } } diff --git a/core/src/main/java/org/apache/struts2/components/UIBean.java b/core/src/main/java/org/apache/struts2/components/UIBean.java index 85b3d1bb9..4a4b5eb2b 100644 --- a/core/src/main/java/org/apache/struts2/components/UIBean.java +++ b/core/src/main/java/org/apache/struts2/components/UIBean.java @@ -702,11 +702,13 @@ public abstract class UIBean extends Component { } if (requiredLabel != null) { - addParameter("required", findValue(requiredLabel, Boolean.class)); + Object parsedValue = findValue(requiredLabel, Boolean.class); + addParameter("required", parsedValue == null ? Boolean.valueOf(requiredLabel) : parsedValue); } if (disabled != null) { - addParameter("disabled", findValue(disabled, Boolean.class)); + Object parsedValue = findValue(disabled, Boolean.class); + addParameter("disabled", parsedValue == null ? Boolean.valueOf(disabled) : parsedValue); } if (tabindex != null) { @@ -886,9 +888,9 @@ public abstract class UIBean extends Component { this.addParameter("tooltipDelay", findString(this.tooltipDelay)); if (this.javascriptTooltip != null) { - Boolean jsTooltips = (Boolean) findValue(this.javascriptTooltip, Boolean.class); + Object jsTooltips = findValue(this.javascriptTooltip, Boolean.class); //TODO use a Boolean model when tooltipConfig is dropped - this.addParameter("jsTooltipEnabled", jsTooltips.toString()); + this.addParameter("jsTooltipEnabled", jsTooltips == null ? this.javascriptTooltip : jsTooltips.toString()); if (form != null) form.addParameter("hasTooltip", jsTooltips); @@ -968,7 +970,7 @@ public abstract class UIBean extends Component { // 1] UI component's tooltipConfig attribute OR // 2] param tag value attribute - result = new LinkedHashMap<>((Map) tooltipConfigObj); + result = new LinkedHashMap((Map) tooltipConfigObj); } else if (tooltipConfigObj instanceof String) { // we get this if its configured using diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java index 3a6050702..77a51e64c 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java @@ -28,7 +28,7 @@ import java.util.LinkedHashMap; */ public class Attributes extends LinkedHashMap { - private static final long serialVersionUID = 4103241472140545630L; + private static final long serialVersionUID = 4103241472140545630L; public Attributes add(String key, String value) { return add(key, value, true); @@ -74,15 +74,17 @@ public class Attributes extends LinkedHashMap { * @return this */ public Attributes addIfTrue(String attrName, Object paramValue) { - if (paramValue != null) { - if ((paramValue instanceof Boolean && ((Boolean) paramValue).booleanValue()) || - (Boolean.valueOf(paramValue.toString()).booleanValue())) { - put(attrName, attrName); - } + if (paramValue != null && isTrue(paramValue)) { + put(attrName, attrName); } return this; } + private boolean isTrue(Object paramValue) { + return (paramValue instanceof Boolean && (Boolean) paramValue) + || (Boolean.parseBoolean(paramValue.toString())); + } + /** * Add a key/value pair to the attributes, if the value is null, it will be set as an empty string. * Value is html encoded. diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java index 405088f0c..510abb691 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java @@ -37,12 +37,14 @@ public class AnchorHandler extends AbstractTagHandler implements TagGenerator { Attributes attrs = new Attributes(); attrs.addIfExists("name", params.get("name")) - .addIfExists("id", params.get("id")) - .addIfExists("class", params.get("cssClass")) - .addIfExists("style", params.get("cssStyle")) - .addIfExists("href", params.get("href"), false) - .addIfExists("title", params.get("title")) - .addIfExists("tabindex", params.get("tabindex")); + .addIfExists("id", params.get("id")) + .addIfExists("class", params.get("cssClass")) + .addIfExists("style", params.get("cssStyle")) + .addIfExists("href", params.get("href"), false) + .addIfTrue("disabled", params.get("disabled")) + .addIfExists("title", params.get("title")) + .addIfExists("tabindex", params.get("tabindex")); + start("a", attrs); String body = (String) params.get("body"); Boolean escapeHtmlBody = (Boolean) params.get("escapeHtmlBody"); diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LinkHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LinkHandler.java index 55a7d353e..cf2daeec4 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LinkHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LinkHandler.java @@ -40,9 +40,13 @@ public class LinkHandler extends AbstractTagHandler implements TagGenerator { .addIfExists("referrerpolicy", params.get("referrerpolicy")) .addIfExists("type", params.get("type")) .addIfExists("as", params.get("as")) - .addIfExists("disabled", params.get("disabled")) .addIfExists("title", params.get("title")); + // see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-disabled + if ("stylesheet".equals(params.get("rel"))) { + attrs.addIfTrue("disabled", params.get("disabled")); + } + start("link", attrs); end("link"); } diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java index c0eb9aa7a..fbb2dce09 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java @@ -18,9 +18,9 @@ */ package org.apache.struts2.views.java.simple; -import org.apache.struts2.views.java.TagGenerator; -import org.apache.struts2.views.java.Attributes; import org.apache.commons.lang3.StringUtils; +import org.apache.struts2.views.java.Attributes; +import org.apache.struts2.views.java.TagGenerator; import java.io.IOException; import java.util.Map; @@ -34,12 +34,13 @@ public class ResetHandler extends AbstractTagHandler implements TagGenerator { boolean isButton = "button".equals(params.get("type")); attrs.addDefaultToEmpty("name", params.get("name")) - .add("type", "reset") - .addIfExists("value", params.get("nameValue")) - .addIfExists("tabindex", params.get("tabindex")) - .addIfExists("id", params.get("id")) - .addIfExists("class", params.get("cssClass")) - .addIfExists("style", params.get("cssStyle")); + .add("type", "reset") + .addIfExists("value", params.get("nameValue")) + .addIfTrue("disabled", params.get("disabled")) + .addIfExists("tabindex", params.get("tabindex")) + .addIfExists("id", params.get("id")) + .addIfExists("class", params.get("cssClass")) + .addIfExists("style", params.get("cssStyle")); if (!isButton) attrs.addIfExists("title", params.get("title")); diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java index 58709a245..595713547 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java @@ -43,7 +43,7 @@ public class AnchorTest extends AbstractTest { theme.renderTag(getTagName(), context); theme.renderTag(getTagName() + "-close", context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java index fa7d53a04..8bb915d89 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java @@ -29,7 +29,7 @@ public class CheckboxTest extends AbstractCommonAttributesTest { public void testRenderCheckbox() { tag.setName("name_"); - tag.setDisabled("true"); + tag.setDisabled("false"); tag.setTabindex("1"); tag.setId("id_"); tag.setCssClass("class"); @@ -60,14 +60,13 @@ public class CheckboxTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } public void testRenderCheckboxWithNameValue() { tag.setName("name_"); tag.setValue("%{someValue}"); - tag.setDisabled("true"); tag.evaluateParams(); map.putAll(tag.getParameters()); diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/FileTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/FileTest.java index 3334fd3c7..0a455c28a 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/FileTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/FileTest.java @@ -43,7 +43,7 @@ public class FileTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HiddenTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HiddenTest.java index 48c5dc3ef..497ea88f1 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HiddenTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HiddenTest.java @@ -41,7 +41,7 @@ public class HiddenTest extends AbstractTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/LinkTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/LinkTest.java index 8e7b03935..873ede269 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/LinkTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/LinkTest.java @@ -31,7 +31,7 @@ public class LinkTest extends AbstractTest{ private static final String NONCE_VAL = "r4andom"; - public void testRenderScriptTag() { + public void testRenderLinkTag() { tag.setHref("testhref"); tag.setHreflang("test"); tag.setRel("module"); @@ -41,27 +41,60 @@ public class LinkTest extends AbstractTest{ tag.setCrossorigin("same-origin"); tag.setType("anonymous"); tag.setAs("test"); - tag.setDisabled("disabled_"); + tag.setDisabled("true"); tag.setTitle("test"); tag.evaluateParams(); map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); - String s = writer.getBuffer().toString(); + String output = writer.getBuffer().toString(); - assertTrue("Incorrect href attribute for link tag", s.contains("href=\"testhref\"")); - assertTrue("Incorrect hreflang attribute for link tag", s.contains("hreflang=\"test\"")); - assertTrue("Incorrect rel attribute for link tag", s.contains("rel=\"module\"")); - assertTrue("Incorrect media attribute for link tag", s.contains("media=\"foo\"")); - assertTrue("Incorrect referrerpolicy attribute for link tag", s.contains("referrerpolicy=\"test\"")); - assertTrue("Incorrect sizes attribute for link tag", s.contains("sizes=\"foo\"")); - assertTrue("Incorrect crossorigin attribute for link tag", s.contains("crossorigin=\"same-origin\"")); - assertTrue("Incorrect type attribute for link tag", s.contains("type=\"anonymous\"")); - assertTrue("Incorrect as attribute for link tag", s.contains("as=\"test\"")); - assertTrue("Non-existent disabled attribute for link tag", s.contains("disabled=\"disabled_\"")); - assertTrue("Incorrect title attribute for link tag", s.contains("title=\"test\"")); - assertTrue("Incorrect nonce attribute for link tag", s.contains("nonce=\"" + NONCE_VAL+"\"")); + assertTrue("Incorrect href attribute for link tag", output.contains(s("href='testhref'"))); + assertTrue("Incorrect hreflang attribute for link tag", output.contains(s("hreflang='test'"))); + assertTrue("Incorrect rel attribute for link tag", output.contains(s("rel='module'"))); + assertTrue("Incorrect media attribute for link tag", output.contains(s("media='foo'"))); + assertTrue("Incorrect referrerpolicy attribute for link tag", output.contains(s("referrerpolicy='test'"))); + assertTrue("Incorrect sizes attribute for link tag", output.contains(s("sizes='foo'"))); + assertTrue("Incorrect crossorigin attribute for link tag", output.contains(s("crossorigin='same-origin'"))); + assertTrue("Incorrect type attribute for link tag", output.contains(s("type='anonymous'"))); + assertTrue("Incorrect as attribute for link tag", output.contains(s("as='test'"))); + assertFalse("Non-existent disabled attribute for link tag", output.contains(s("disabled='disabled'"))); + assertTrue("Incorrect title attribute for link tag", output.contains(s("title='test'"))); + assertTrue("Incorrect nonce attribute for link tag", output.contains(s("nonce='" + NONCE_VAL+"'"))); } + + public void testRenderLinkTagAsStylesheet() { + tag.setHref("testhref"); + tag.setHreflang("test"); + tag.setRel("stylesheet"); + tag.setMedia("foo"); + tag.setReferrerpolicy("test"); + tag.setSizes("foo"); + tag.setCrossorigin("same-origin"); + tag.setType("anonymous"); + tag.setAs("test"); + tag.setDisabled("true"); + tag.setTitle("test"); + + tag.evaluateParams(); + map.putAll(tag.getParameters()); + theme.renderTag(getTagName(), context); + String output = writer.getBuffer().toString(); + + assertTrue("Incorrect href attribute for link tag", output.contains(s("href='testhref'"))); + assertTrue("Incorrect hreflang attribute for link tag", output.contains(s("hreflang='test'"))); + assertTrue("Incorrect rel attribute for link tag", output.contains(s("rel='stylesheet'"))); + assertTrue("Incorrect media attribute for link tag", output.contains(s("media='foo'"))); + assertTrue("Incorrect referrerpolicy attribute for link tag", output.contains(s("referrerpolicy='test'"))); + assertTrue("Incorrect sizes attribute for link tag", output.contains(s("sizes='foo'"))); + assertTrue("Incorrect crossorigin attribute for link tag", output.contains(s("crossorigin='same-origin'"))); + assertTrue("Incorrect type attribute for link tag", output.contains(s("type='anonymous'"))); + assertTrue("Incorrect as attribute for link tag", output.contains(s("as='test'"))); + assertTrue("Incorrect disabled attribute for link tag", output.contains(s("disabled='disabled'"))); + assertTrue("Incorrect title attribute for link tag", output.contains(s("title='test'"))); + assertTrue("Incorrect nonce attribute for link tag", output.contains(s("nonce='" + NONCE_VAL+"'"))); + } + @Override protected UIBean getUIBean() throws Exception { return tag; diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/PasswordTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/PasswordTest.java index da26301b4..84f48ce92 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/PasswordTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/PasswordTest.java @@ -24,11 +24,10 @@ import org.apache.struts2.components.Password; import org.apache.struts2.components.UIBean; public class PasswordTest extends AbstractCommonAttributesTest { + private Password tag; - private boolean showPassword; public void testRenderPassword() throws Exception { - this.showPassword = false; super.setUp(); this.tag = new Password(stack, request, response); @@ -47,12 +46,11 @@ public class PasswordTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } public void testRenderPasswordShowIt() throws Exception { - this.showPassword = true; super.setUp(); this.tag = new Password(stack, request, response); @@ -71,7 +69,7 @@ public class PasswordTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java index bfe7e0360..28d601fb6 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SelectTest.java @@ -45,7 +45,7 @@ public class SelectTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SubmitTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SubmitTest.java index 8609630a7..cbb7f6c5f 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SubmitTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/SubmitTest.java @@ -47,7 +47,7 @@ public class SubmitTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName() + "-close", context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } @@ -69,7 +69,7 @@ public class SubmitTest extends AbstractCommonAttributesTest { theme.renderTag(getTagName(), context); theme.renderTag(getTagName() + "-close", context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } @@ -91,7 +91,7 @@ public class SubmitTest extends AbstractCommonAttributesTest { theme.renderTag(getTagName(), context); theme.renderTag(getTagName() + "-close", context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } @@ -112,7 +112,7 @@ public class SubmitTest extends AbstractCommonAttributesTest { theme.renderTag(getTagName(), context); theme.renderTag(getTagName() + "-close", context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextAreaTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextAreaTest.java index bae57795e..fb5d8e071 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextAreaTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextAreaTest.java @@ -44,7 +44,7 @@ public class TextAreaTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } @@ -63,7 +63,7 @@ public class TextAreaTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextFieldTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextFieldTest.java index 7371fa1b4..5973ea5ff 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextFieldTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/TextFieldTest.java @@ -44,7 +44,7 @@ public class TextFieldTest extends AbstractCommonAttributesTest { map.putAll(tag.getParameters()); theme.renderTag(getTagName(), context); String output = writer.getBuffer().toString(); - String expected = s(""); + String expected = s(""); assertEquals(expected, output); }