diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilder.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilder.java
index e862b9ba..99af02fd 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilder.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilder.java
@@ -112,6 +112,9 @@ public class FlowModelFlowBuilder extends AbstractFlowBuilder {
*/
protected void doInit() throws FlowBuilderException {
flowModel = flowModelHolder.getFlowModel();
+ if ("true".equals(flowModel.getAbstract())) {
+ throw new FlowBuilderException("Abstract flow models cannot be instantiated.");
+ }
initLocalFlowContext();
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/FlowModel.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/FlowModel.java
index 23430000..1ea1532f 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/FlowModel.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/FlowModel.java
@@ -47,6 +47,7 @@ import org.springframework.util.StringUtils;
*/
public class FlowModel extends AbstractModel {
// private String id;
+ private String abztract;
private String parent;
private String startStateId;
private LinkedList attributes;
@@ -94,6 +95,24 @@ public class FlowModel extends AbstractModel {
setBeanImports(merge(getBeanImports(), flow.getBeanImports()));
}
+ /**
+ * @return the abstract
+ */
+ public String getAbstract() {
+ return abztract;
+ }
+
+ /**
+ * @param abztract the abstract to set
+ */
+ public void setAbstract(String abztract) {
+ if (StringUtils.hasText(abztract)) {
+ this.abztract = abztract;
+ } else {
+ this.abztract = null;
+ }
+ }
+
/**
* @return the parent
*/
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/XmlFlowModelBuilder.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/XmlFlowModelBuilder.java
index 5fd6f85d..418609b6 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/XmlFlowModelBuilder.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/XmlFlowModelBuilder.java
@@ -220,6 +220,7 @@ public class XmlFlowModelBuilder implements FlowModelBuilder {
private FlowModel parseFlow(Element element) {
FlowModel flow = new FlowModel();
+ flow.setAbstract(element.getAttribute("abstract"));
flow.setParent(element.getAttribute("parent"));
flow.setStartStateId(element.getAttribute("start-state"));
flow.addAttributes(parseAttributes(element));
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/spring-webflow-2.0.xsd b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/spring-webflow-2.0.xsd
index 6d915f0e..e309bbca 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/spring-webflow-2.0.xsd
+++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/model/builder/xml/spring-webflow-2.0.xsd
@@ -1012,6 +1012,15 @@ For example:
+
+
+
+
+
+
+
diff --git a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilderTests.java b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilderTests.java
index e31db345..f2f0060b 100644
--- a/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilderTests.java
+++ b/spring-webflow/src/test/java/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilderTests.java
@@ -326,6 +326,16 @@ public class FlowModelFlowBuilderTests extends TestCase {
assertEquals("end", flow.getStartState().getId());
}
+ public void testAbstractFlow() {
+ model.setAbstract("true");
+ try {
+ getFlow(model);
+ fail("FlowBuilderException expected");
+ } catch (FlowBuilderException e) {
+ // we want this
+ }
+ }
+
private Flow getFlow(FlowModel model) {
FlowModelHolder holder = new StaticFlowModelHolder(model);
FlowModelFlowBuilder builder = new FlowModelFlowBuilder(holder);