From 6685e26b6a40b406de2fe74105ebf5a96d209914 Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 27 Sep 2010 06:31:08 +0000 Subject: [PATCH] BATCH-1633: fix bean parsers for inner bean corner cases --- .../configuration/xml/AbstractListenerParser.java | 7 ++++--- .../core/configuration/xml/ChunkElementParser.java | 11 ++++++----- .../batch/core/configuration/xml/TaskletParser.java | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java index 6a15dbb33..870195a49 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java @@ -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 beanElements = DomUtils.getChildElementsByTagName(element, BEAN_ELE); List 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; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/ChunkElementParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/ChunkElementParser.java index a70431269..cdb0d5324 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/ChunkElementParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/ChunkElementParser.java @@ -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 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)); } } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletParser.java index 347760e95..00494f900 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletParser.java @@ -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; }