BATCH-1633: fix bean parsers for inner bean corner cases

This commit is contained in:
dsyer
2010-09-27 06:31:08 +00:00
parent 2c174da070
commit 6685e26b6a
3 changed files with 11 additions and 9 deletions

View File

@@ -6,6 +6,7 @@ import java.util.List;
import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
import org.springframework.batch.core.listener.ListenerMetaData;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
@@ -40,7 +41,7 @@ public abstract class AbstractListenerParser {
@SuppressWarnings("unchecked")
public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
builder.addPropertyValue("delegate", parseListenerElement(element, parserContext));
builder.addPropertyValue("delegate", parseListenerElement(element, parserContext, builder.getRawBeanDefinition()));
ManagedMap metaDataMap = new ManagedMap();
for (String metaDataPropertyName : getMethodNameAttributes()) {
@@ -53,7 +54,7 @@ public abstract class AbstractListenerParser {
}
@SuppressWarnings("unchecked")
public static BeanMetadataElement parseListenerElement(Element element, ParserContext parserContext) {
public static BeanMetadataElement parseListenerElement(Element element, ParserContext parserContext, BeanDefinition enclosing) {
String listenerRef = element.getAttribute(REF_ATTR);
List<Element> beanElements = DomUtils.getChildElementsByTagName(element, BEAN_ELE);
List<Element> refElements = DomUtils.getChildElementsByTagName(element, REF_ELE);
@@ -66,7 +67,7 @@ public abstract class AbstractListenerParser {
else if (beanElements.size() == 1) {
Element beanElement = beanElements.get(0);
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(
beanElement);
beanElement, enclosing);
parserContext.getDelegate().decorateBeanDefinitionIfRequired(beanElement, beanDefinitionHolder);
return beanDefinitionHolder;
}

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.configuration.xml;
import java.util.List;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.config.TypedStringValue;
@@ -137,7 +138,7 @@ public class ChunkElementParser {
handleExceptionElement(element, parserContext, propertyValues, "retryable-exception-classes",
"retryableExceptionClasses");
handleRetryListenersElement(element, propertyValues, parserContext);
handleRetryListenersElement(element, propertyValues, parserContext, bd);
handleStreamsElement(element, propertyValues, parserContext);
@@ -229,7 +230,7 @@ public class ChunkElementParser {
}
private void handleRetryListenersElement(Element element, MutablePropertyValues propertyValues,
ParserContext parserContext) {
ParserContext parserContext, BeanDefinition enclosing) {
Element listenersElement = DomUtils.getChildElementByTagName(element, "retry-listeners");
if (listenersElement != null) {
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(listenersElement.getTagName(),
@@ -238,18 +239,18 @@ public class ChunkElementParser {
ManagedList retryListenerBeans = new ManagedList();
retryListenerBeans.setMergeEnabled(listenersElement.hasAttribute(MERGE_ATTR)
&& Boolean.valueOf(listenersElement.getAttribute(MERGE_ATTR)));
handleRetryListenerElements(parserContext, listenersElement, retryListenerBeans);
handleRetryListenerElements(parserContext, listenersElement, retryListenerBeans, enclosing);
propertyValues.addPropertyValue("retryListeners", retryListenerBeans);
parserContext.popAndRegisterContainingComponent();
}
}
@SuppressWarnings("unchecked")
private void handleRetryListenerElements(ParserContext parserContext, Element element, ManagedList beans) {
private void handleRetryListenerElements(ParserContext parserContext, Element element, ManagedList beans, BeanDefinition enclosing) {
List<Element> listenerElements = DomUtils.getChildElementsByTagName(element, "listener");
if (listenerElements != null) {
for (Element listenerElement : listenerElements) {
beans.add(AbstractListenerParser.parseListenerElement(listenerElement, parserContext));
beans.add(AbstractListenerParser.parseListenerElement(listenerElement, parserContext, enclosing));
}
}
}

View File

@@ -93,7 +93,7 @@ public class TaskletParser {
}
else if (beanElements.size() == 1) {
Element beanElement = beanElements.get(0);
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(beanElement);
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(beanElement, bd);
parserContext.getDelegate().decorateBeanDefinitionIfRequired(beanElement, beanDefinitionHolder);
bme = beanDefinitionHolder;
}