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 94c8682a..f9d26b78 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 @@ -30,7 +30,6 @@ import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.binding.convert.ConversionException; import org.springframework.binding.convert.ConversionExecutor; import org.springframework.binding.convert.ConversionService; -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; @@ -120,8 +119,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde private static final String ID_ATTRIBUTE = "id"; - private static final String IDREF_ATTRIBUTE = "idref"; - private static final String BEAN_ATTRIBUTE = "bean"; private static final String FLOW_ELEMENT = "flow"; @@ -178,12 +175,8 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde private static final String OUTPUT_MAPPER_ELEMENT = "output-mapper"; - private static final String OUTPUT_ATTRIBUTE_ELEMENT = "output-attribute"; - private static final String INPUT_MAPPER_ELEMENT = "input-mapper"; - private static final String INPUT_ATTRIBUTE_ELEMENT = "input-attribute"; - private static final String MAPPING_ELEMENT = "mapping"; private static final String SOURCE_ATTRIBUTE = "source"; @@ -413,8 +406,16 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } String flowId = getLocalContext().getFlowId(); AttributeMap externallyAssignedAttributes = getLocalContext().getFlowAttributes(); - AttributeMap flowAttributes = parseAttributes(flowElement).union(externallyAssignedAttributes); - return getFlowArtifactFactory().createFlow(flowId, flowAttributes); + MutableAttributeMap flowAttributes = parseAttributes(flowElement); + parseAndSetPersistenceContextAttribute(flowElement, flowAttributes); + return getFlowArtifactFactory().createFlow(flowId, flowAttributes.union(externallyAssignedAttributes)); + } + + private void parseAndSetPersistenceContextAttribute(Element flowElement, MutableAttributeMap flowAttributes) { + Element element = DomUtils.getChildElementByTagName(flowElement, "persistence-context"); + if (element != null) { + flowAttributes.put("persistenceContext", Boolean.TRUE); + } } private boolean isFlowElement(Element flowElement) { @@ -558,7 +559,7 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } else { Element startStateElement = DomUtils.getChildElementByTagName(element, startState); if (startStateElement != null) { - return startStateElement.getAttribute(IDREF_ATTRIBUTE); + return startStateElement.getAttribute("idref"); } else { return null; } @@ -726,16 +727,12 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde continue; } if (DomUtils.nodeNameEquals(childNode, ACTION_ELEMENT)) { - // parse standard action actions.add(parseAnnotatedAction((Element) childNode)); } else if (DomUtils.nodeNameEquals(childNode, BEAN_ACTION_ELEMENT)) { - // parse bean invoking action actions.add(parseAnnotatedBeanInvokingAction((Element) childNode)); } else if (DomUtils.nodeNameEquals(childNode, EVALUATE_ACTION_ELEMENT)) { - // parse evaluate action actions.add(parseAnnotatedEvaluateAction((Element) childNode)); } else if (DomUtils.nodeNameEquals(childNode, SET_ELEMENT)) { - // parse set action actions.add(parseAnnotatedSetAction((Element) childNode)); } } @@ -899,7 +896,7 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } } - private AttributeMap parseAttributes(Element element) { + private MutableAttributeMap parseAttributes(Element element) { LocalAttributeMap attributes = new LocalAttributeMap(); List propertyElements = DomUtils.getChildElementsByTagName(element, ATTRIBUTE_ELEMENT); for (int i = 0; i < propertyElements.size(); i++) { @@ -982,8 +979,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde Element mapperElement = DomUtils.getChildElementByTagName(element, INPUT_MAPPER_ELEMENT); if (mapperElement != null) { DefaultAttributeMapper mapper = new DefaultAttributeMapper(); - parseSimpleInputAttributeMappings(mapper, DomUtils.getChildElementsByTagName(mapperElement, - INPUT_ATTRIBUTE_ELEMENT)); parseMappings(mapper, mapperElement, MutableAttributeMap.class, RequestContext.class); return mapper; } else { @@ -995,8 +990,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde Element mapperElement = DomUtils.getChildElementByTagName(element, INPUT_MAPPER_ELEMENT); if (mapperElement != null) { DefaultAttributeMapper mapper = new DefaultAttributeMapper(); - parseSimpleInputAttributeMappings(mapper, DomUtils.getChildElementsByTagName(mapperElement, - INPUT_ATTRIBUTE_ELEMENT)); parseMappings(mapper, mapperElement, RequestContext.class, MutableAttributeMap.class); return mapper; } else { @@ -1008,8 +1001,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde Element mapperElement = DomUtils.getChildElementByTagName(element, OUTPUT_MAPPER_ELEMENT); if (mapperElement != null) { DefaultAttributeMapper mapper = new DefaultAttributeMapper(); - parseSimpleOutputAttributeMappings(mapper, DomUtils.getChildElementsByTagName(mapperElement, - OUTPUT_ATTRIBUTE_ELEMENT)); parseMappings(mapper, mapperElement, RequestContext.class, MutableAttributeMap.class); return mapper; } else { @@ -1021,8 +1012,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde Element mapperElement = DomUtils.getChildElementByTagName(element, OUTPUT_MAPPER_ELEMENT); if (mapperElement != null) { DefaultAttributeMapper mapper = new DefaultAttributeMapper(); - parseSimpleOutputAttributeMappings(mapper, DomUtils.getChildElementsByTagName(mapperElement, - OUTPUT_ATTRIBUTE_ELEMENT)); parseMappings(mapper, mapperElement, MutableAttributeMap.class, RequestContext.class); return mapper; } else { @@ -1053,40 +1042,6 @@ 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), - new ParserContextImpl().eval(RequestContext.class)); - Expression scopedAttributeExpression = new ScopedAttributeExpression(attributeExpression, parseScope( - element, ScopeType.FLOW)); - if (getRequired(element, false)) { - mapper.addMapping(new RequiredMapping(attributeExpression, scopedAttributeExpression, null)); - } else { - mapper.addMapping(new Mapping(attributeExpression, scopedAttributeExpression, null)); - } - } - } - - // 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), - new ParserContextImpl().eval(RequestContext.class)); - Expression scopedAttributeExpression = new ScopedAttributeExpression(attributeExpression, parseScope( - element, ScopeType.FLOW)); - if (getRequired(element, false)) { - mapper.addMapping(new RequiredMapping(scopedAttributeExpression, attributeExpression, null)); - } else { - mapper.addMapping(new Mapping(scopedAttributeExpression, attributeExpression, null)); - } - } - } - private boolean getRequired(Element element, boolean defaultValue) { if (StringUtils.hasText(element.getAttribute(REQUIRED_ATTRIBUTE))) { return ((Boolean) fromStringTo(Boolean.class).execute(element.getAttribute(REQUIRED_ATTRIBUTE))) @@ -1188,28 +1143,6 @@ public class XmlFlowBuilder extends AbstractFlowBuilder implements ResourceHolde } } - private static class ScopedAttributeExpression implements Expression { - - private Expression scopeMapExpression; - - private ScopeType scopeType; - - public ScopedAttributeExpression(Expression scopeMapExpression, ScopeType scopeType) { - this.scopeMapExpression = scopeMapExpression; - this.scopeType = scopeType; - } - - public Object getValue(Object target) throws EvaluationException { - MutableAttributeMap scopeMap = scopeType.getScope((RequestContext) target); - return scopeMapExpression.getValue(scopeMap); - } - - public void setValue(Object target, Object value) throws EvaluationException { - MutableAttributeMap scopeMap = scopeType.getScope((RequestContext) target); - scopeMapExpression.setValue(scopeMap, value); - } - } - private static class FlowRelativeResourceLoader implements ResourceLoader { private Resource resource; diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/spring-webflow-2.0.xsd b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/spring-webflow-2.0.xsd index 4129d309..0de9e313 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/spring-webflow-2.0.xsd +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/spring-webflow-2.0.xsd @@ -201,8 +201,11 @@ A flow may also exhibit the following characteristics: -
-For example: -
-    <attribute-mapper>
-	    <input-mapper>
-		    <input-attribute name="myFlowAttribute"/>
-    	</input-mapper>
-    	<output-mapper>
-    		<output-attribute name="aSubflowOutputAttribute"/>
-    	</output-mapper>
-    </attribute-mapper>
-
]]> @@ -1925,17 +1888,6 @@ and may execute one or more actions before executing. - - - - - - - @@ -1951,39 +1903,6 @@ support for type conversion. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderTests.java b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderTests.java index b3f916e8..4913fbb7 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderTests.java +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderTests.java @@ -65,4 +65,21 @@ public class XmlFlowBuilderTests extends TestCase { assertEquals("end", flow.getStartState().getId()); } + public void testCustomFlowAttribute() { + ClassPathResource resource = new ClassPathResource("flow-custom-attribute.xml", getClass()); + builder = new XmlFlowBuilder(resource); + FlowAssembler assembler = new FlowAssembler(builder, new MockFlowBuilderContext("flow")); + Flow flow = assembler.assembleFlow(); + assertEquals("bar", flow.getAttributes().get("foo")); + assertEquals(new Integer(1), flow.getAttributes().get("number")); + } + + public void testPersistenceContextFlow() { + ClassPathResource resource = new ClassPathResource("flow-persistencecontext.xml", getClass()); + builder = new XmlFlowBuilder(resource); + FlowAssembler assembler = new FlowAssembler(builder, new MockFlowBuilderContext("flow")); + Flow flow = assembler.assembleFlow(); + assertNotNull(flow.getAttributes().get("persistenceContext")); + assertTrue(((Boolean) flow.getAttributes().get("persistenceContext")).booleanValue()); + } } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-custom-attribute.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-custom-attribute.xml new file mode 100644 index 00000000..49d63488 --- /dev/null +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-custom-attribute.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-endstate.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-endstate.xml index 04150939..00011745 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-endstate.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-endstate.xml @@ -1,7 +1,6 @@ + xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-incomplete.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-incomplete.xml index 8e3ed2f4..cb39f147 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-incomplete.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-incomplete.xml @@ -1,6 +1,5 @@ + xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> \ No newline at end of file diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-persistencecontext.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-persistencecontext.xml new file mode 100644 index 00000000..a0ec47dc --- /dev/null +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-persistencecontext.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-attribute.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-attribute.xml index 70961fbd..acbfa555 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-attribute.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-attribute.xml @@ -1,7 +1,6 @@ + xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd" start-state="end"> diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-default.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-default.xml index 64a24bae..00011745 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-default.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-default.xml @@ -1,7 +1,6 @@ + xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-element.xml b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-element.xml index 0a1fa809..b1bee2a1 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-element.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-startstate-element.xml @@ -1,7 +1,6 @@ + xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">