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 bca56b1f..0df6bf0d 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 @@ -72,6 +72,7 @@ public class ELExpressionParser implements ExpressionParser { } public Expression parseExpression(String expressionString, ParserContext context) throws ParserException { + Assert.notNull(expressionString, "The expression string to parse is required"); if (context == null) { context = NullParserContext.INSTANCE; } diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java index aa136b3f..9ec4e2a6 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java @@ -31,9 +31,6 @@ import org.springframework.util.Assert; /** * Evaluates a parsed Ognl expression. - *
- * IMPLEMENTATION NOTE: Ognl 2.6.7 expression objects do not respect equality properly, so the equality operations - * defined within this class do not function properly. * * @author Keith Donald */ @@ -65,8 +62,6 @@ class OgnlExpression implements Expression { if (!(o instanceof OgnlExpression)) { return false; } - // as late as Ognl 2.6.7, their expression objects don't implement equals - // so this always returns false OgnlExpression other = (OgnlExpression) o; return expression.equals(other.expression); } @@ -106,7 +101,6 @@ class OgnlExpression implements Expression { ExpressionVariable var = variables[i]; variableMap.put(var.getName(), var.getValue()); } - System.out.println(variableMap); return variableMap; } else { return Collections.EMPTY_MAP; 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 13f2a456..0a535091 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 @@ -81,10 +81,23 @@ public abstract class AbstractExpressionParser implements ExpressionParser { } public boolean isDelimitedExpression(String string) { - return string.startsWith(expressionPrefix) && string.endsWith(expressionSuffix); + int prefixIndex = string.indexOf(getExpressionPrefix()); + if (prefixIndex == -1) { + return false; + } + int suffixIndex = string.indexOf(getExpressionSuffix(), prefixIndex); + if (suffixIndex == -1) { + return false; + } else { + // make sure there is actually something inside the ${} + if (suffixIndex == prefixIndex + getExpressionPrefix().length()) { + return false; + } else { + return true; + } + } } - // TODO - add back 1.0 and 2.0 m1 semantics public Expression parseExpression(String expressionString, ParserContext context) throws ParserException { Assert.notNull(expressionString, "The expression string to parse is required"); Expression[] expressions = parseExpressions(expressionString, context); @@ -110,7 +123,7 @@ public abstract class AbstractExpressionParser implements ExpressionParser { while (startIdx < expressionString.length()) { int prefixIndex = expressionString.indexOf(getExpressionPrefix(), startIdx); if (prefixIndex >= startIdx) { - // an expression was found + // a inner expression was found - this is a composite if (prefixIndex > startIdx) { expressions.add(new StaticExpression(expressionString.substring(startIdx, prefixIndex))); startIdx = prefixIndex; @@ -138,8 +151,13 @@ public abstract class AbstractExpressionParser implements ExpressionParser { startIdx = suffixIndex + 1; } } else { - // no more evaluatable ${expressions} found in string - expressions.add(new StaticExpression(expressionString.substring(startIdx))); + if (startIdx == 0) { + // treat the entire string as one expression + expressions.add(doParseExpression(expressionString, context)); + } else { + // no more ${expressions} found in string, add rest as static text + expressions.add(new StaticExpression(expressionString.substring(startIdx))); + } startIdx = expressionString.length(); } } 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 3d8cc2f9..c00bd858 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 @@ -30,6 +30,16 @@ public class ELExpressionParserTests extends TestCase { assertEquals(new Long(7), exp.getValue(null)); } + public void testParseNullExpressionString() { + String expressionString = null; + try { + parser.parseExpression(expressionString, null); + fail("should have thrown iae"); + } catch (IllegalArgumentException e) { + + } + } + public void testParseSimpleEvalExpressionNoEvalContextWithTypeCoersion() { String expressionString = "#{3 + 4}"; Expression exp = parser.parseExpression(expressionString, new ParserContextImpl().expect(Integer.class)); 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 365a4cab..e4aa2e9b 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,6 +33,16 @@ public class OgnlExpressionParserTests extends TestCase { public void testParseSimple() { String exp = "${flag}"; + assertTrue(parser.isDelimitedExpression(exp)); + Expression e = parser.parseExpression(exp, null); + assertNotNull(e); + Boolean b = (Boolean) e.getValue(bean); + assertFalse(b.booleanValue()); + } + + public void testParseSimpleNotDelimited() { + String exp = "flag"; + assertFalse(parser.isDelimitedExpression(exp)); Expression e = parser.parseExpression(exp, null); assertNotNull(e); Boolean b = (Boolean) e.getValue(bean);