1 16 package org.springframework.webflow.config; 17 18 import org.springframework.beans.factory.support.AbstractBeanDefinition; 19 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 20 import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; 21 import org.springframework.beans.factory.xml.BeanDefinitionParser; 22 import org.springframework.beans.factory.xml.ParserContext; 23 import org.springframework.util.StringUtils; 24 import org.springframework.util.xml.DomUtils; 25 import org.w3c.dom.Element ; 26 27 32 class ExecutorBeanDefinitionParser extends AbstractBeanDefinitionParser { 33 34 36 private static final String EXECUTION_ATTRIBUTES_ELEMENT = "execution-attributes"; 37 38 private static final String EXECUTION_LISTENERS_ELEMENT = "execution-listeners"; 39 40 private static final String REGISTRY_REF_ATTRIBUTE = "registry-ref"; 41 42 private static final String REPOSITORY_TYPE_ATTRIBUTE = "repository-type"; 43 44 46 private static final String DEFINITION_LOCATOR_PROPERTY = "definitionLocator"; 47 48 private static final String EXECUTION_ATTRIBUTES_PROPERTY = "executionAttributes"; 49 50 private static final String EXECUTION_LISTENER_LOADER_PROPERTY = "executionListenerLoader"; 51 52 private static final String REPOSITORY_TYPE_PROPERTY = "repositoryType"; 53 54 protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { 55 BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder 56 .rootBeanDefinition(FlowExecutorFactoryBean.class); 57 definitionBuilder.addPropertyReference(DEFINITION_LOCATOR_PROPERTY, getRegistryRef(element)); 58 addExecutionAttributes(element, parserContext, definitionBuilder); 59 addExecutionListenerLoader(element, parserContext, definitionBuilder); 60 definitionBuilder.addPropertyValue(REPOSITORY_TYPE_PROPERTY, getRepositoryType(element)); 61 return definitionBuilder.getBeanDefinition(); 62 } 63 64 69 private String getRegistryRef(Element element) { 70 String registryRef = element.getAttribute(REGISTRY_REF_ATTRIBUTE); 71 if (!StringUtils.hasText(registryRef)) { 72 throw new IllegalArgumentException ("The 'registry-ref' attribute of the 'executor' element must have a value"); 73 } 74 return registryRef; 75 } 76 77 83 private String getRepositoryType(Element element) { 84 return element.getAttribute(REPOSITORY_TYPE_ATTRIBUTE).toUpperCase(); 85 } 86 87 90 private void addExecutionAttributes(Element element, ParserContext parserContext, 91 BeanDefinitionBuilder definitionBuilder) { 92 Element attributesElement = DomUtils.getChildElementByTagName(element, EXECUTION_ATTRIBUTES_ELEMENT); 93 if (attributesElement != null) { 94 definitionBuilder.addPropertyValue(EXECUTION_ATTRIBUTES_PROPERTY, parserContext.getDelegate() 95 .parseCustomElement(attributesElement, definitionBuilder.getBeanDefinition())); 96 } 97 } 98 99 102 private void addExecutionListenerLoader(Element element, ParserContext parserContext, 103 BeanDefinitionBuilder definitionBuilder) { 104 Element listenersElement = DomUtils.getChildElementByTagName(element, EXECUTION_LISTENERS_ELEMENT); 105 if (listenersElement != null) { 106 definitionBuilder.addPropertyValue(EXECUTION_LISTENER_LOADER_PROPERTY, parserContext.getDelegate() 107 .parseCustomElement(listenersElement, definitionBuilder.getBeanDefinition())); 108 } 109 } 110 } | Popular Tags |