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.definition.registry;
017:
018: import org.springframework.beans.factory.FactoryBean;
019: import org.springframework.beans.factory.InitializingBean;
020:
021: /**
022: * A base class for factory beans that create populated flow definition registries.
023: * Subclasses should override the {@link #doPopulate(FlowDefinitionRegistry)} method
024: * to perform the registry population logic, typically delegating to a
025: * {@link FlowDefinitionRegistrar} strategy to perform the population.
026: *
027: * @author Keith Donald
028: */
029: public abstract class AbstractFlowDefinitionRegistryFactoryBean
030: implements FactoryBean, InitializingBean {
031:
032: /**
033: * The registry to register flow definitions in.
034: */
035: private FlowDefinitionRegistry registry = createFlowDefinitionRegistry();
036:
037: /**
038: * Sets the parent registry of the registry constructed by this factory
039: * bean.
040: * <p>
041: * A child registry will delegate to its parent if it cannot fulfill a
042: * request to locate a flow definition itself.
043: * @param parent the parent flow definition registry
044: */
045: public void setParent(FlowDefinitionRegistry parent) {
046: registry.setParent(parent);
047: }
048:
049: // implementing InitializingBean
050:
051: public final void afterPropertiesSet() throws Exception {
052: init();
053: doPopulate(registry);
054: }
055:
056: // implementing FactoryBean
057:
058: public Class getObjectType() {
059: return FlowDefinitionRegistry.class;
060: }
061:
062: public boolean isSingleton() {
063: return true;
064: }
065:
066: public Object getObject() throws Exception {
067: // the registry is populated by the time this is called
068: return getRegistry();
069: }
070:
071: /**
072: * Returns the flow definition registry constructed by the factory bean.
073: */
074: public FlowDefinitionRegistry getRegistry() {
075: return registry;
076: }
077:
078: // subclassing hooks
079:
080: /**
081: * Create the flow definition registry to be populated in
082: * {@link #doPopulate(FlowDefinitionRegistry)}. Subclasses can override
083: * this method if they want to use a custom flow definition registry
084: * implementation.
085: */
086: protected FlowDefinitionRegistry createFlowDefinitionRegistry() {
087: return new FlowDefinitionRegistryImpl();
088: }
089:
090: /**
091: * Template method subclasses may override to perform factory bean initialization
092: * logic before registry population. Will be called before
093: * {@link #doPopulate(FlowDefinitionRegistry)}. The default implementation
094: * is empty.
095: */
096: protected void init() {
097: }
098:
099: /**
100: * Template method subclasses must override to perform registry population.
101: * @param registry the flow definition registry to populate
102: */
103: protected abstract void doPopulate(FlowDefinitionRegistry registry);
104:
105: }
|