diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTargetStateResolver.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTargetStateResolver.java index a2f504f2..26c732c8 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTargetStateResolver.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTargetStateResolver.java @@ -19,6 +19,7 @@ import org.springframework.binding.convert.ConversionContext; import org.springframework.binding.convert.support.AbstractConverter; import org.springframework.binding.expression.Expression; import org.springframework.binding.expression.ExpressionParser; +import org.springframework.binding.expression.support.ParserContextImpl; import org.springframework.webflow.engine.TargetStateResolver; import org.springframework.webflow.engine.builder.FlowBuilderContext; import org.springframework.webflow.engine.support.DefaultTargetStateResolver; @@ -74,7 +75,8 @@ class TextToTargetStateResolver extends AbstractConverter { if (targetStateId.startsWith(BEAN_PREFIX)) { return flowBuilderContext.getBeanFactory().getBean(targetStateId.substring(BEAN_PREFIX.length())); } else { - Expression expression = parser.parseExpression(targetStateId, RequestContext.class, String.class, null); + Expression expression = parser.parseExpression(targetStateId, new ParserContextImpl().eval( + RequestContext.class).expect(String.class)); return new DefaultTargetStateResolver(expression); } } diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTransitionCriteria.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTransitionCriteria.java index 406b4c5e..c97c4d26 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTransitionCriteria.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/TextToTransitionCriteria.java @@ -21,6 +21,7 @@ import org.springframework.binding.convert.support.AbstractConverter; import org.springframework.binding.expression.Expression; import org.springframework.binding.expression.ExpressionParser; import org.springframework.binding.expression.ExpressionVariable; +import org.springframework.binding.expression.support.ParserContextImpl; import org.springframework.util.StringUtils; import org.springframework.webflow.engine.TransitionCriteria; import org.springframework.webflow.engine.WildcardTransitionCriteria; @@ -78,16 +79,15 @@ class TextToTransitionCriteria extends AbstractConverter { } protected Object doConvert(Object source, Class targetClass, ConversionContext context) throws Exception { - // TODO - add separate transition 'event' and 'condition' attributes String encodedCriteria = (String) source; ExpressionParser parser = flowBuilderContext.getExpressionParser(); if (!StringUtils.hasText(encodedCriteria) || WildcardTransitionCriteria.WILDCARD_EVENT_ID.equals(encodedCriteria)) { return WildcardTransitionCriteria.INSTANCE; - } else if (parser.isEvalExpressionString(encodedCriteria)) { - ExpressionVariable[] variables = new ExpressionVariable[] { new ExpressionVariable("result", "lastEvent.id") }; - Expression expression = parser.parseExpression(encodedCriteria, RequestContext.class, Boolean.class, - variables); + } else if (parser.isDelimitedExpression(encodedCriteria)) { + Expression expression = parser.parseExpression(encodedCriteria, new ParserContextImpl().eval( + RequestContext.class).expect(Boolean.class).variable( + new ExpressionVariable("result", "lastEvent.id"))); return createBooleanExpressionTransitionCriteria(expression); } else if (encodedCriteria.startsWith(BEAN_PREFIX)) { return flowBuilderContext.getBeanFactory().getBean(encodedCriteria.substring(BEAN_PREFIX.length()), diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilder.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilder.java index 3a38616a..28ca760a 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilder.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilder.java @@ -34,6 +34,7 @@ import org.springframework.binding.expression.EvaluationException; import org.springframework.binding.expression.Expression; import org.springframework.binding.expression.ExpressionParser; import org.springframework.binding.expression.support.CollectionAddingExpression; +import org.springframework.binding.expression.support.ParserContextImpl; import org.springframework.binding.mapping.AttributeMapper; import org.springframework.binding.mapping.DefaultAttributeMapper; import org.springframework.binding.mapping.Mapping; @@ -600,15 +601,15 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde return null; } else if (encodedView.startsWith(REDIRECT_PREFIX)) { String encodedViewName = encodedView.substring(REDIRECT_PREFIX.length()); - Expression viewName = getExpressionParser().parseExpression(encodedViewName, RequestContext.class, - String.class, null); + Expression viewName = getExpressionParser().parseExpression(encodedViewName, + new ParserContextImpl().eval(RequestContext.class).expect(String.class)); ViewFactory viewFactory = getLocalContext().getViewFactoryCreator().createViewFactory(viewName, getLocalContext().getResourceLoader()); return new ViewInfo(viewFactory, Boolean.TRUE); } else if (encodedView.startsWith(EXTERNAL_REDIRECT_PREFIX)) { String encodedUrl = encodedView.substring(EXTERNAL_REDIRECT_PREFIX.length()); - Expression externalUrl = getExpressionParser().parseExpression(encodedUrl, RequestContext.class, - String.class, null); + Expression externalUrl = getExpressionParser().parseExpression(encodedUrl, + new ParserContextImpl().eval(RequestContext.class).expect(String.class)); ViewFactory viewFactory = new ActionInvokingViewFactory(new ExternalRedirectAction(externalUrl)); return new ViewInfo(viewFactory, Boolean.FALSE); } else if (encodedView.startsWith(FLOW_DEFINITION_REDIRECT_PREFIX)) { @@ -620,8 +621,8 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde encodedView.substring(BEAN_PREFIX.length()), ViewFactory.class); return new ViewInfo(viewFactory, Boolean.FALSE); } else { - Expression viewName = getExpressionParser().parseExpression(encodedView, RequestContext.class, - String.class, null); + Expression viewName = getExpressionParser().parseExpression(encodedView, + new ParserContextImpl().eval(RequestContext.class).expect(String.class)); ViewFactory viewFactory = getLocalContext().getViewFactoryCreator().createViewFactory(viewName, getLocalContext().getResourceLoader()); return new ViewInfo(viewFactory, null); @@ -635,8 +636,8 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde return null; } else if (encodedView.startsWith(EXTERNAL_REDIRECT_PREFIX)) { String encodedUrl = encodedView.substring(EXTERNAL_REDIRECT_PREFIX.length()); - Expression externalUrl = getExpressionParser().parseExpression(encodedUrl, RequestContext.class, - String.class, null); + Expression externalUrl = getExpressionParser().parseExpression(encodedUrl, + new ParserContextImpl().eval(RequestContext.class).expect(String.class)); return new ExternalRedirectAction(externalUrl); } else if (encodedView.startsWith(FLOW_DEFINITION_REDIRECT_PREFIX)) { String flowRedirect = encodedView.substring(FLOW_DEFINITION_REDIRECT_PREFIX.length()); @@ -645,8 +646,8 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde return (Action) getLocalContext().getBeanFactory().getBean(encodedView.substring(BEAN_PREFIX.length()), Action.class); } else { - Expression viewName = getExpressionParser().parseExpression(encodedView, RequestContext.class, - String.class, null); + Expression viewName = getExpressionParser().parseExpression(encodedView, + new ParserContextImpl().eval(RequestContext.class).expect(String.class)); return getLocalContext().getViewFactoryCreator().createFinalResponseAction(viewName, getLocalContext().getResourceLoader()); } @@ -771,7 +772,7 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde while (it.hasNext()) { Element argumentElement = (Element) it.next(); Expression name = parser.parseExpression(argumentElement.getAttribute(EXPRESSION_ATTRIBUTE), - RequestContext.class, Object.class, null); + new ParserContextImpl().eval(RequestContext.class)); Class type = null; if (argumentElement.hasAttribute(PARAMETER_TYPE_ATTRIBUTE)) { type = (Class) fromStringTo(Class.class) @@ -803,7 +804,7 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde private Action parseEvaluateAction(Element element) { Expression expression = getExpressionParser().parseExpression(element.getAttribute(EXPRESSION_ATTRIBUTE), - RequestContext.class, Object.class, null); + new ParserContextImpl().eval(RequestContext.class)); return new EvaluateAction(expression, parseEvaluationResultExposer(element)); } @@ -828,9 +829,9 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde private Action parseSetAction(Element element) { String attributeExpressionString = element.getAttribute(ATTRIBUTE_ATTRIBUTE); Expression attributeExpression = getExpressionParser().parseExpression(attributeExpressionString, - MutableAttributeMap.class, Object.class, null); + new ParserContextImpl().eval(MutableAttributeMap.class)); Expression valueExpression = getExpressionParser().parseExpression(element.getAttribute(VALUE_ATTRIBUTE), - RequestContext.class, Object.class, null); + new ParserContextImpl().eval(RequestContext.class)); return new SetAction(attributeExpression, parseScope(element, ScopeType.REQUEST), valueExpression); } @@ -894,7 +895,7 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde private Transition parseThen(Element element) { Expression expression = getExpressionParser().parseExpression(element.getAttribute(TEST_ATTRIBUTE), - RequestContext.class, Boolean.class, null); + new ParserContextImpl().eval(RequestContext.class).expect(Boolean.class)); TransitionCriteria matchingCriteria = new BooleanExpressionTransitionCriteria(expression); TargetStateResolver targetStateResolver = (TargetStateResolver) fromStringTo(TargetStateResolver.class) .execute(element.getAttribute(THEN_ATTRIBUTE)); @@ -978,15 +979,15 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde List mappingElements = DomUtils.getChildElementsByTagName(element, MAPPING_ELEMENT); for (Iterator it = mappingElements.iterator(); it.hasNext();) { Element mappingElement = (Element) it.next(); - Expression source = parser.parseExpression(mappingElement.getAttribute(SOURCE_ATTRIBUTE), sourceClass, - Object.class, null); + Expression source = parser.parseExpression(mappingElement.getAttribute(SOURCE_ATTRIBUTE), + new ParserContextImpl().eval(sourceClass)); Expression target = null; if (StringUtils.hasText(mappingElement.getAttribute(TARGET_ATTRIBUTE))) { - target = parser.parseExpression(mappingElement.getAttribute(TARGET_ATTRIBUTE), targetClass, - Object.class, null); + target = parser.parseExpression(mappingElement.getAttribute(TARGET_ATTRIBUTE), new ParserContextImpl() + .eval(targetClass)); } else if (StringUtils.hasText(mappingElement.getAttribute(TARGET_COLLECTION_ATTRIBUTE))) { target = new CollectionAddingExpression(parser.parseExpression(mappingElement - .getAttribute(TARGET_COLLECTION_ATTRIBUTE), targetClass, Object.class, null)); + .getAttribute(TARGET_COLLECTION_ATTRIBUTE), new ParserContextImpl().eval(targetClass))); } if (getRequired(mappingElement, false)) { mapper.addMapping(new RequiredMapping(source, target, parseTypeConverter(mappingElement))); @@ -996,12 +997,13 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } } + // this looks really complicated and possibly wrong private void parseSimpleInputAttributeMappings(DefaultAttributeMapper mapper, List elements) { ExpressionParser parser = getLocalContext().getExpressionParser(); for (Iterator it = elements.iterator(); it.hasNext();) { Element element = (Element) it.next(); Expression attributeExpression = parser.parseExpression(element.getAttribute(NAME_ATTRIBUTE), - MutableAttributeMap.class, Object.class, null); + new ParserContextImpl().eval(RequestContext.class)); Expression scopedAttributeExpression = new ScopedAttributeExpression(attributeExpression, parseScope( element, ScopeType.FLOW)); if (getRequired(element, false)) { @@ -1012,12 +1014,13 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } } + // this looks really complicated and possibly wrong private void parseSimpleOutputAttributeMappings(DefaultAttributeMapper mapper, List elements) { ExpressionParser parser = getLocalContext().getExpressionParser(); for (Iterator it = elements.iterator(); it.hasNext();) { Element element = (Element) it.next(); Expression attributeExpression = parser.parseExpression(element.getAttribute(NAME_ATTRIBUTE), - MutableAttributeMap.class, Object.class, null); + new ParserContextImpl().eval(RequestContext.class)); Expression scopedAttributeExpression = new ScopedAttributeExpression(attributeExpression, parseScope( element, ScopeType.FLOW)); if (getRequired(element, false)) {