expression parser simplifications

This commit is contained in:
Keith Donald
2008-01-18 07:00:44 +00:00
parent 87bb511460
commit 62291b3cb0
3 changed files with 33 additions and 28 deletions

View File

@@ -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);
}
}

View File

@@ -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()),

View File

@@ -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)) {