diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java index 98d0f574..dac89388 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java @@ -44,9 +44,14 @@ public class ELExpression implements Expression { try { Object result = valueExpression.getValue(ctx); if (result == null && !ctx.isPropertyResolved()) { - EvaluationAttempt attempt = new EvaluationAttempt(this, context); - throw new EvaluationException(attempt, attempt - + " failed: the expression path did not resolve--is the base variable incorrect?", null); + if (getExpressionString().equals("null")) { + // special case for handling reserved null keyword + return null; + } else { + EvaluationAttempt attempt = new EvaluationAttempt(this, context); + throw new EvaluationException(attempt, attempt + + " failed: the expression path did not resolve--is the base variable incorrect?", null); + } } return result; } catch (javax.el.PropertyNotFoundException e) { diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/NullELResolver.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/NullELResolver.java deleted file mode 100644 index 47ee3dac..00000000 --- a/spring-binding/src/main/java/org/springframework/binding/expression/el/NullELResolver.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.springframework.binding.expression.el; - -import java.util.Iterator; - -import javax.el.ELContext; -import javax.el.ELResolver; -import javax.el.PropertyNotWritableException; - -/** - * Resolves the special 'null' variable, indicating a null value. - * - * @author Keith Donald - */ -public class NullELResolver extends ELResolver { - - private static final String NULL_VARIABLE_NAME = "null"; - - public Class getCommonPropertyType(ELContext context, Object base) { - return null; - } - - public Iterator getFeatureDescriptors(ELContext context, Object base) { - return null; - } - - public Class getType(ELContext context, Object base, Object property) { - if (base == null && NULL_VARIABLE_NAME.equals(property)) { - context.setPropertyResolved(true); - return null; - } else { - return null; - } - } - - public Object getValue(ELContext context, Object base, Object property) { - if (base == null && NULL_VARIABLE_NAME.equals(property)) { - context.setPropertyResolved(true); - return null; - } else { - return null; - } - } - - public boolean isReadOnly(ELContext context, Object base, Object property) { - if (base == null && NULL_VARIABLE_NAME.equals(property)) { - context.setPropertyResolved(true); - return true; - } else { - return false; - } - } - - public void setValue(ELContext context, Object base, Object property, Object value) { - if (base == null && NULL_VARIABLE_NAME.equals(property)) { - context.setPropertyResolved(true); - throw new PropertyNotWritableException("The 'null' value cannot be set"); - } - } - -} 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 8d188bf2..6df8f5db 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 @@ -42,6 +42,11 @@ public class ELExpressionParserTests extends TestCase { } } + public void testParseNull() { + Expression exp = parser.parseExpression("null", null); + assertEquals(null, exp.getValue(null)); + } + public void testParseEmptyExpressionString() { String expressionString = ""; try { diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java index e4fed730..90c8f087 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java @@ -27,7 +27,6 @@ import javax.el.VariableMapper; import org.springframework.binding.expression.el.DefaultELResolver; import org.springframework.binding.expression.el.ELContextFactory; import org.springframework.binding.expression.el.ELExpressionParser; -import org.springframework.binding.expression.el.NullELResolver; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.expression.el.ActionMethodELResolver; import org.springframework.webflow.expression.el.ImplicitFlowVariableELResolver; @@ -53,7 +52,6 @@ public class JsfManagedBeanAwareELExpressionParser extends ELExpressionParser { RequestContext context = (RequestContext) target; List customResolvers = new ArrayList(); customResolvers.add(new RequestContextELResolver(context)); - customResolvers.add(new NullELResolver()); customResolvers.add(new ImplicitFlowVariableELResolver(context)); customResolvers.add(new ScopeSearchingELResolver(context)); customResolvers.add(new SpringBeanWebFlowELResolver(context)); diff --git a/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java index 0b1cd0b0..327a1120 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java @@ -27,7 +27,6 @@ import javax.el.VariableMapper; import org.springframework.binding.expression.el.DefaultELResolver; import org.springframework.binding.expression.el.ELContextFactory; import org.springframework.binding.expression.el.ELExpressionParser; -import org.springframework.binding.expression.el.NullELResolver; import org.springframework.webflow.execution.RequestContext; /** @@ -55,7 +54,6 @@ public class WebFlowELExpressionParser extends ELExpressionParser { RequestContext context = (RequestContext) target; List customResolvers = new ArrayList(); customResolvers.add(new RequestContextELResolver(context)); - customResolvers.add(new NullELResolver()); customResolvers.add(new ImplicitFlowVariableELResolver(context)); customResolvers.add(new ScopeSearchingELResolver(context)); customResolvers.add(new SpringBeanWebFlowELResolver(context)); diff --git a/spring-webflow/src/test/java/org/springframework/webflow/expression/el/WebFlowELExpressionParserTests.java b/spring-webflow/src/test/java/org/springframework/webflow/expression/el/WebFlowELExpressionParserTests.java index 5f6a66d7..63675fd1 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/expression/el/WebFlowELExpressionParserTests.java +++ b/spring-webflow/src/test/java/org/springframework/webflow/expression/el/WebFlowELExpressionParserTests.java @@ -14,6 +14,7 @@ import org.springframework.webflow.core.collection.AttributeMap; import org.springframework.webflow.core.collection.LocalAttributeMap; import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.engine.AnnotatedAction; +import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.TestAction; import org.springframework.webflow.test.MockRequestContext; @@ -148,4 +149,20 @@ public class WebFlowELExpressionParserTests extends TestCase { assertEquals("setupForm", action.getMethod()); } + public void testResolveEventAttributes() { + MockRequestContext context = new MockRequestContext(); + LocalAttributeMap attributes = new LocalAttributeMap(); + attributes.put("foo", "bar"); + context.setCurrentEvent(new Event(this, "event", attributes)); + Expression exp = parser.parseExpression("currentEvent.foo", new FluentParserContext() + .evaluate(RequestContext.class)); + assertEquals("bar", exp.getValue(context)); + } + + public void testResolveNull() { + MockRequestContext context = new MockRequestContext(); + Expression exp = parser.parseExpression("null", new FluentParserContext().evaluate(RequestContext.class)); + assertEquals(null, exp.getValue(context)); + } + }