From a12827df5d54347c7198e27ecabab919ac39434e Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Fri, 11 Apr 2008 14:47:08 +0000 Subject: [PATCH] http://jira.springframework.org/browse/SWF-570 --- .../FlowRegistryBeanDefinitionParser.java | 13 ++++++ .../config/FlowRegistryFactoryBean.java | 46 +++++++++++-------- .../config/spring-webflow-config-2.0.xsd | 10 ++++ .../registry/FlowDefinitionRegistry.java | 6 +++ .../registry/FlowDefinitionRegistryImpl.java | 4 ++ ...FlowRegistryBeanDefinitionParserTests.java | 5 ++ .../webflow/config/flow-registry.xml | 6 ++- 7 files changed, 71 insertions(+), 19 deletions(-) diff --git a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParser.java b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParser.java index 14b3874a..8e1a4910 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParser.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParser.java @@ -39,6 +39,8 @@ class FlowRegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParse private static final String FLOW_BUILDER_SERVICES_ATTRIBUTE = "flow-builder-services"; + private static final String PARENT_ATTRIBUTE = "parent"; + private static final String FLOW_LOCATION_ELEMENT = "flow-location"; private static final String FLOW_BUILDER_ELEMENT = "flow-builder"; @@ -65,6 +67,8 @@ class FlowRegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParse private static final String FLOW_BUILDER_SERVICES_PROPERTY = "flowBuilderServices"; + private static final String PARENT_PROPERTY = "parent"; + protected Class getBeanClass(Element element) { return FlowRegistryFactoryBean.class; } @@ -78,6 +82,10 @@ class FlowRegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParse FlowBuilderServicesBeanDefinitionParser.registerDefaultFlowBuilderServicesBeanDefinition( parserContext).getBeanName()); } + String parent = getParentAttribute(element); + if (StringUtils.hasText(parent)) { + definitionBuilder.addPropertyReference(PARENT_PROPERTY, parent); + } definitionBuilder.addPropertyValue(FLOW_LOCATIONS_PROPERTY, parseLocations(element)); definitionBuilder.addPropertyValue(FLOW_BUILDERS_PROPERTY, parseFlowBuilders(element)); } @@ -133,4 +141,9 @@ class FlowRegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParse private String getFlowBuilderServicesAttribute(Element element) { return element.getAttribute(FLOW_BUILDER_SERVICES_ATTRIBUTE); } + + private String getParentAttribute(Element element) { + return element.getAttribute(PARENT_ATTRIBUTE); + } + } \ No newline at end of file diff --git a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryFactoryBean.java b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryFactoryBean.java index 707f0713..7618003a 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryFactoryBean.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryFactoryBean.java @@ -39,53 +39,63 @@ import org.springframework.webflow.engine.model.registry.FlowModelRegistryImpl; */ class FlowRegistryFactoryBean implements FactoryBean, InitializingBean { + private FlowLocation[] flowLocations; + + private FlowBuilderInfo[] flowBuilders; + + private FlowBuilderServices flowBuilderServices; + + private FlowDefinitionRegistry parent; + /** * The definition registry produced by this factory bean. */ private FlowDefinitionRegistryImpl flowRegistry; /** - * The model registry produced by this factory bean. + * The model registry used to build flow models that can be assembled into registerable Flows. */ private FlowModelRegistryImpl flowModelRegistry; - /** - * Flow definitions defined in external files that should be registered in the registry produced by this factory - * bean. - */ - private FlowLocation[] flowLocations; - - /** - * Java {@link FlowBuilder flow builder} classes that should be registered in the registry produced by this factory - * bean. - */ - private FlowBuilderInfo[] flowBuilders; - - /** - * The holder for services needed to build flow definitions registered in this registry. - */ - private FlowBuilderServices flowBuilderServices; - /** * A helper for creating abstract representation of externalized flow definition resources. */ private FlowDefinitionResourceFactory flowResourceFactory; + /** + * Flow definitions defined in external files that should be registered in the registry produced by this factory + * bean. + */ public void setFlowLocations(FlowLocation[] flowLocations) { this.flowLocations = flowLocations; } + /** + * Java {@link FlowBuilder flow builder} classes that should be registered in the registry produced by this factory + * bean. + */ public void setFlowBuilders(FlowBuilderInfo[] flowBuilders) { this.flowBuilders = flowBuilders; } + /** + * The holder for services needed to build flow definitions registered in this registry. + */ public void setFlowBuilderServices(FlowBuilderServices flowBuilderServices) { this.flowBuilderServices = flowBuilderServices; } + /** + * The parent of the registry created by this factory bean. + */ + public void setParent(FlowDefinitionRegistry parent) { + this.parent = parent; + } + public void afterPropertiesSet() throws Exception { flowResourceFactory = new FlowDefinitionResourceFactory(flowBuilderServices.getApplicationContext()); flowRegistry = new FlowDefinitionRegistryImpl(); + flowRegistry.setParent(parent); flowModelRegistry = new FlowModelRegistryImpl(); registerFlowLocations(); registerFlowBuilders(); diff --git a/spring-webflow/src/main/java/org/springframework/webflow/config/spring-webflow-config-2.0.xsd b/spring-webflow/src/main/java/org/springframework/webflow/config/spring-webflow-config-2.0.xsd index 97eb3a57..95e93c8c 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/config/spring-webflow-config-2.0.xsd +++ b/spring-webflow/src/main/java/org/springframework/webflow/config/spring-webflow-config-2.0.xsd @@ -71,6 +71,16 @@ Registers a custom FlowBuilder implementation in this registry. + + + + + + + diff --git a/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistry.java b/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistry.java index ffe49103..1a71baae 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistry.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistry.java @@ -34,6 +34,12 @@ public interface FlowDefinitionRegistry extends FlowDefinitionLocator { */ public int getFlowDefinitionCount(); + /** + * Returns this registry'es parent registry. + * @return the parent flow definition registry, or null if no parent is set + */ + public FlowDefinitionRegistry getParent(); + /** * Sets this registry's parent registry. When asked by a client to locate a flow definition this registry will query * it's parent if it cannot fulfill the lookup request itself. diff --git a/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistryImpl.java b/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistryImpl.java index 22909386..7c1a0ca9 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistryImpl.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistryImpl.java @@ -78,6 +78,10 @@ public class FlowDefinitionRegistryImpl implements FlowDefinitionRegistry { return flowDefinitions.size(); } + public FlowDefinitionRegistry getParent() { + return parent; + } + public void setParent(FlowDefinitionRegistry parent) { this.parent = parent; } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParserTests.java b/spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParserTests.java index 1df2a041..7a3708a2 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParserTests.java +++ b/spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParserTests.java @@ -56,4 +56,9 @@ public class FlowRegistryBeanDefinitionParserTests extends TestCase { } } + + public void testParent() { + assertNotNull(registry.getParent()); + assertEquals("parentFlow", registry.getParent().getFlowDefinition("parentFlow").getId()); + } } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/config/flow-registry.xml b/spring-webflow/src/test/java/org/springframework/webflow/config/flow-registry.xml index 921b25ed..8fec330f 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/config/flow-registry.xml +++ b/spring-webflow/src/test/java/org/springframework/webflow/config/flow-registry.xml @@ -8,7 +8,7 @@ http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"> - + @@ -26,4 +26,8 @@ + + + + \ No newline at end of file