diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java index 14f69011..882e52e2 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java @@ -25,11 +25,13 @@ public interface ExpressionParser { /** * Is the provided string an explicitly delimited expression this parser knows how to parse? For example, this - * method might return true if the string provided is enclosed in ${}. + * method may return true if the string provided is enclosed in "${}". It may also return true if the string + * provided is a mix of literal text and delimited expression syntax, for example "hello world ${name}!" The exact + * semantics are determined by the parser implementation. * @param string the string * @return true if the string is a delimited expression, false otherwise. */ - public boolean isDelimitedExpression(String string); + public boolean hasDelimitedExpression(String string); /** * Parse the provided expression string, returning an expression evaluator capable of evaluating it. diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java index 0df6bf0d..74cbcea8 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java @@ -65,7 +65,7 @@ public class ELExpressionParser implements ExpressionParser { contextFactories.put(contextType, contextFactory); } - public boolean isDelimitedExpression(String expressionString) { + public boolean hasDelimitedExpression(String expressionString) { return (expressionString.startsWith(EXPRESSION_PREFIX_DEFERRED) && expressionString.endsWith(EXPRESSION_SUFFIX)) || (expressionString.startsWith(EXPRESSION_PREFIX_IMMEDIATE) && expressionString .endsWith(EXPRESSION_SUFFIX)); diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java index 0a535091..1b6ee43e 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java @@ -80,7 +80,7 @@ public abstract class AbstractExpressionParser implements ExpressionParser { this.expressionSuffix = expressionSuffix; } - public boolean isDelimitedExpression(String string) { + public boolean hasDelimitedExpression(String string) { int prefixIndex = string.indexOf(getExpressionPrefix()); if (prefixIndex == -1) { return false; diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java index c00bd858..bf820c68 100644 --- a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java +++ b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java @@ -46,6 +46,12 @@ public class ELExpressionParserTests extends TestCase { assertEquals(new Integer(7), exp.getValue(null)); } + public void testAssignment() { + String expressionString = "#{value = 12345}"; + Expression exp = parser.parseExpression(expressionString, new ParserContextImpl().expect(Integer.class)); + assertEquals(new Integer(7), exp.getValue(null)); + } + public void testParseBeanEvalExpressionNoParserContext() { String expressionString = "#{value}"; Expression exp = parser.parseExpression(expressionString, null); diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java index e4aa2e9b..d2834958 100644 --- a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java +++ b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java @@ -33,16 +33,34 @@ public class OgnlExpressionParserTests extends TestCase { public void testParseSimple() { String exp = "${flag}"; - assertTrue(parser.isDelimitedExpression(exp)); + assertTrue(parser.hasDelimitedExpression(exp)); Expression e = parser.parseExpression(exp, null); assertNotNull(e); Boolean b = (Boolean) e.getValue(bean); assertFalse(b.booleanValue()); } + public void testHasDelimitedExpression() { + String exp = "some literal text"; + String exp2 = "${a delimited expression}"; + String exp3 = "${a malformed delimited expression"; + String exp4 = "a malformed delimited expression}"; + String exp5 = "${}"; + String exp6 = "a ${composite} expression"; + String exp7 = "a ${composite} ${malformed expression"; + + assertFalse(parser.hasDelimitedExpression(exp)); + assertTrue(parser.hasDelimitedExpression(exp2)); + assertFalse(parser.hasDelimitedExpression(exp3)); + assertFalse(parser.hasDelimitedExpression(exp4)); + assertFalse(parser.hasDelimitedExpression(exp5)); + assertTrue(parser.hasDelimitedExpression(exp6)); + assertTrue(parser.hasDelimitedExpression(exp7)); + } + public void testParseSimpleNotDelimited() { String exp = "flag"; - assertFalse(parser.isDelimitedExpression(exp)); + assertFalse(parser.hasDelimitedExpression(exp)); Expression e = parser.parseExpression(exp, null); assertNotNull(e); Boolean b = (Boolean) e.getValue(bean); @@ -57,6 +75,7 @@ public class OgnlExpressionParserTests extends TestCase { public void testParseComposite() { String exp = "hello ${flag} ${flag} ${flag}"; + assertTrue(parser.hasDelimitedExpression(exp)); Expression e = parser.parseExpression(exp, null); assertNotNull(e); String str = (String) e.getValue(bean);