From 16c54bebdd853e1718db942d12871326e8392f76 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Tue, 4 Mar 2008 00:34:54 +0000 Subject: [PATCH] special action handling TODO - move core.expression package - it isnt that low-level --- .../el/ActionExecutingELResolver.java | 64 +++++++++++++++++++ .../el/WebFlowELExpressionParser.java | 1 + .../test/SearchFlowExecutionTests.java | 2 + .../webflow/test/search-flow.xml | 8 +-- 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/ActionExecutingELResolver.java 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 @@ - +