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 62e07ee29..af78d3071 100644 --- a/core/src/main/java/org/apache/struts2/components/Component.java +++ b/core/src/main/java/org/apache/struts2/components/Component.java @@ -373,7 +373,11 @@ public class Component { */ protected Object findValue(String expr, Class toType) { if (altSyntax() && toType == String.class) { - return TextParseUtil.translateVariables('%', expr, stack); + if (ComponentUtils.containsExpression(expr)) { + return TextParseUtil.translateVariables('%', expr, stack); + } else { + return expr; + } } else { expr = stripExpressionIfAltSyntax(expr); diff --git a/core/src/main/java/org/apache/struts2/util/ComponentUtils.java b/core/src/main/java/org/apache/struts2/util/ComponentUtils.java index 89a238f75..01fbcd9be 100644 --- a/core/src/main/java/org/apache/struts2/util/ComponentUtils.java +++ b/core/src/main/java/org/apache/struts2/util/ComponentUtils.java @@ -40,12 +40,15 @@ public class ComponentUtils { /** * Check if object is expression base on altSyntax * - * @param value to treat as an expression + * @param expr to treat as an expression * @return true if it is an expression */ - public static boolean isExpression(Object value) { - String expr = value.toString(); + public static boolean isExpression(String expr) { return expr.startsWith("%{") && expr.endsWith("}"); } + public static boolean containsExpression(String expr) { + return expr.contains("%{") && expr.contains("}"); + } + } 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 65b80cf21..0a122a3f3 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 @@ -306,7 +306,7 @@ public abstract class AbstractUITag extends ComponentTagSupport implements Dynam } public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { - if (ComponentUtils.altSyntax(getStack()) && ComponentUtils.isExpression(value)) { + if (ComponentUtils.altSyntax(getStack()) && ComponentUtils.isExpression(value.toString())) { dynamicAttributes.put(localName, String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), value))); } else { dynamicAttributes.put(localName, value); diff --git a/core/src/test/java/org/apache/struts2/util/ComponentUtilsTest.java b/core/src/test/java/org/apache/struts2/util/ComponentUtilsTest.java index 668935204..095176a75 100644 --- a/core/src/test/java/org/apache/struts2/util/ComponentUtilsTest.java +++ b/core/src/test/java/org/apache/struts2/util/ComponentUtilsTest.java @@ -71,6 +71,17 @@ public class ComponentUtilsTest extends StrutsInternalTestCase { assertTrue(actual); } + public void testIsExpressionIsFalseWhenCombined() throws Exception { + // given + String anExpression = "bar%{foo}"; + + // when + boolean actual = ComponentUtils.isExpression(anExpression); + + // then + assertFalse(actual); + } + public void testIsExpressionIsFalse() throws Exception { // given String anExpression = "foo"; @@ -81,6 +92,39 @@ public class ComponentUtilsTest extends StrutsInternalTestCase { // then assertFalse(actual); } + + public void testContainsExpressionIsTrue() throws Exception { + // given + String anExpression = "%{foo}"; + + // when + boolean actual = ComponentUtils.containsExpression(anExpression); + + // then + assertTrue(actual); + } + + public void testIsContainsIsTrueWhenCombined() throws Exception { + // given + String anExpression = "bar%{foo}"; + + // when + boolean actual = ComponentUtils.containsExpression(anExpression); + + // then + assertTrue(actual); + } + + public void testContainsExpressionIsFalse() throws Exception { + // given + String anExpression = "foo"; + + // when + boolean actual = ComponentUtils.containsExpression(anExpression); + + // then + assertFalse(actual); + } } class MockConfigurationProvider implements ConfigurationProvider {