001: /*
002: * Copyright 2004-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.springframework.webflow.engine.builder;
017:
018: import org.springframework.beans.factory.BeanFactory;
019: import org.springframework.util.Assert;
020: import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
021: import org.springframework.webflow.definition.registry.NoSuchFlowDefinitionException;
022: import org.springframework.webflow.engine.Flow;
023:
024: /**
025: * The default flow service locator implementation that obtains subflow
026: * definitions from a dedicated {@link FlowDefinitionRegistry} and obtains the
027: * remaining services from a generic Spring {@link BeanFactory}.
028: *
029: * @see FlowDefinitionRegistry
030: * @see FlowServiceLocator#getSubflow(String)
031: * @see BeanFactory
032: *
033: * @author Keith Donald
034: */
035: public class DefaultFlowServiceLocator extends BaseFlowServiceLocator {
036:
037: /**
038: * The registry for locating subflows.
039: */
040: private FlowDefinitionRegistry subflowRegistry;
041:
042: /**
043: * The Spring bean factory used.
044: */
045: private BeanFactory beanFactory;
046:
047: /**
048: * Creates a flow service locator that retrieves subflows from the provided
049: * registry and additional artifacts from the provided bean factory.
050: * @param subflowRegistry the registry for loading subflows
051: * @param beanFactory the spring bean factory
052: */
053: public DefaultFlowServiceLocator(
054: FlowDefinitionRegistry subflowRegistry,
055: BeanFactory beanFactory) {
056: Assert.notNull(subflowRegistry,
057: "The subflow registry is required");
058: Assert.notNull(beanFactory, "The bean factory is required");
059: this .subflowRegistry = subflowRegistry;
060: this .beanFactory = beanFactory;
061: }
062:
063: /**
064: * Convenience flow service locator constructor that looks up a flow definition
065: * registry using given bean id in given bean factory. The registry is used
066: * to retrieve subflows. All additional artifacts are looked up in the provided
067: * bean factory.
068: * @param subflowRegistryBeanId the bean id of the subflow FlowDefinitionRegistry
069: * @param beanFactory the Spring bean factory
070: * @since 1.0.2
071: */
072: public DefaultFlowServiceLocator(String subflowRegistryBeanId,
073: BeanFactory beanFactory) {
074: Assert.notNull(subflowRegistryBeanId,
075: "The subflow registry bean id is required");
076: Assert.notNull(beanFactory, "The bean factory is required");
077: this .subflowRegistry = (FlowDefinitionRegistry) beanFactory
078: .getBean(subflowRegistryBeanId,
079: FlowDefinitionRegistry.class);
080: this .beanFactory = beanFactory;
081: }
082:
083: public Flow getSubflow(String id)
084: throws FlowArtifactLookupException {
085: try {
086: return (Flow) subflowRegistry.getFlowDefinition(id);
087: } catch (NoSuchFlowDefinitionException e) {
088: throw new FlowArtifactLookupException(id, Flow.class,
089: "Could not locate subflow definition with id '"
090: + id + "'", e);
091: }
092: }
093:
094: public BeanFactory getBeanFactory() {
095: return beanFactory;
096: }
097:
098: /**
099: * Returns the flow definition registry used to lookup subflows.
100: * @return the flow definition registry
101: */
102: protected FlowDefinitionRegistry getSubflowRegistry() {
103: return subflowRegistry;
104: }
105: }
|