diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/ActionExecutingELResolver.java b/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/ActionExecutingELResolver.java
new file mode 100644
index 00000000..a9eeeaba
--- /dev/null
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/ActionExecutingELResolver.java
@@ -0,0 +1,64 @@
+package org.springframework.webflow.core.expression.el;
+
+import java.util.Iterator;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import javax.el.PropertyNotWritableException;
+
+import org.springframework.webflow.engine.ActionExecutor;
+import org.springframework.webflow.engine.AnnotatedAction;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class ActionExecutingELResolver extends ELResolver {
+
+ public Class getCommonPropertyType(ELContext elContext, Object base) {
+ return Action.class;
+ }
+
+ public Iterator getFeatureDescriptors(ELContext elContext, Object base) {
+ return null;
+ }
+
+ public Class getType(ELContext elContext, Object base, Object property) {
+ if (base instanceof Action) {
+ elContext.setPropertyResolved(true);
+ return Action.class;
+ } else {
+ return null;
+ }
+ }
+
+ public Object getValue(ELContext elContext, Object base, Object property) {
+ if (base instanceof Action) {
+ Action action = (Action) base;
+ elContext.setPropertyResolved(true);
+ if (property == null) {
+ return ActionExecutor.execute(action, RequestContextHolder.getRequestContext());
+ } else {
+ AnnotatedAction decorator = new AnnotatedAction(action);
+ decorator.setMethod((String) property);
+ return ActionExecutor.execute(decorator, RequestContextHolder.getRequestContext());
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isReadOnly(ELContext elContext, Object base, Object property) {
+ if (base instanceof Action) {
+ elContext.setPropertyResolved(true);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void setValue(ELContext elContext, Object base, Object property, Object value) {
+ if (base instanceof Action) {
+ elContext.setPropertyResolved(true);
+ throw new PropertyNotWritableException("The Action cannot be set with an expression.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/WebFlowELExpressionParser.java b/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/WebFlowELExpressionParser.java
index f06d73aa..76e1c188 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/WebFlowELExpressionParser.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/WebFlowELExpressionParser.java
@@ -45,6 +45,7 @@ public class WebFlowELExpressionParser extends ELExpressionParser {
List customResolvers = new ArrayList();
customResolvers.add(new RequestContextELResolver());
customResolvers.add(new SpringBeanWebFlowELResolver());
+ customResolvers.add(new ActionExecutingELResolver());
customResolvers.add(new ScopeSearchingELResolver());
ELResolver resolver = new DefaultELResolver(target, customResolvers);
return new WebFlowELContext(resolver);
diff --git a/spring-webflow/src/test/java/org/springframework/webflow/test/SearchFlowExecutionTests.java b/spring-webflow/src/test/java/org/springframework/webflow/test/SearchFlowExecutionTests.java
index 7abd2f07..0226c3e5 100644
--- a/spring-webflow/src/test/java/org/springframework/webflow/test/SearchFlowExecutionTests.java
+++ b/spring-webflow/src/test/java/org/springframework/webflow/test/SearchFlowExecutionTests.java
@@ -24,6 +24,7 @@ import org.springframework.webflow.config.FlowDefinitionResource;
import org.springframework.webflow.config.FlowDefinitionResourceFactory;
import org.springframework.webflow.context.ExternalContext;
import org.springframework.webflow.core.collection.AttributeMap;
+import org.springframework.webflow.core.expression.el.WebFlowELExpressionParser;
import org.springframework.webflow.engine.EndState;
import org.springframework.webflow.engine.Flow;
import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests;
@@ -67,6 +68,7 @@ public class SearchFlowExecutionTests extends AbstractXmlFlowExecutionTests {
}
protected void configure(MockFlowBuilderContext builderContext) {
+ builderContext.getFlowBuilderServices().setExpressionParser(new WebFlowELExpressionParser());
Flow mockDetailFlow = new Flow("detail-flow");
mockDetailFlow.setInputMapper(new AttributeMapper() {
public void map(Object source, Object target, MappingContext context) {
diff --git a/spring-webflow/src/test/java/org/springframework/webflow/test/search-flow.xml b/spring-webflow/src/test/java/org/springframework/webflow/test/search-flow.xml
index edbedf2f..fbb2ff2e 100644
--- a/spring-webflow/src/test/java/org/springframework/webflow/test/search-flow.xml
+++ b/spring-webflow/src/test/java/org/springframework/webflow/test/search-flow.xml
@@ -5,16 +5,16 @@
-
+
-
+
-
+
@@ -22,7 +22,7 @@
-
+