diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java index 4318ffef3e..d5b109cfae 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java @@ -16,22 +16,15 @@ package org.springframework.integration.config.xml; -import java.util.List; - -import org.w3c.dom.Element; - import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; -import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; /** * Base class parser for elements that create Message Endpoints. @@ -109,23 +102,4 @@ public abstract class AbstractConsumerEndpointParser extends AbstractBeanDefinit IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-startup"); return builder.getBeanDefinition(); } - - @SuppressWarnings("unchecked") - protected BeanDefinition parseInnerHandlerDefinition(Element element, ParserContext parserContext){ - // parses out inner bean definition for concrete implementation if defined - List childElements = DomUtils.getChildElementsByTagName(element, "bean"); - BeanDefinition innerDefinition = null; - if (childElements != null && childElements.size() == 1){ - Element beanElement = childElements.get(0); - BeanDefinitionParserDelegate delegate = parserContext.getDelegate(); - innerDefinition = delegate.parseBeanDefinitionElement(beanElement).getBeanDefinition(); - } - - String ref = element.getAttribute(REF_ATTRIBUTE); - Assert.isTrue(!(StringUtils.hasText(ref) && innerDefinition != null), "Ambiguous definition. Inner bean " + - (innerDefinition == null ? innerDefinition : innerDefinition.getBeanClassName()) + " declaration and \"ref\" " + ref + - " are not allowed together."); - return innerDefinition; - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AggregatorParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AggregatorParser.java index cef9d7d8db..1e9cc98794 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AggregatorParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AggregatorParser.java @@ -61,7 +61,7 @@ public class AggregatorParser extends AbstractConsumerEndpointParser { @Override protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinition innerHandlerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerHandlerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); String ref = element.getAttribute(REF_ATTRIBUTE); BeanDefinitionBuilder builder; diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java index a55d0ce666..df91d4da46 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java @@ -34,7 +34,7 @@ public class DefaultRouterParser extends AbstractRouterParser { @Override protected void parseRouter(Element element, BeanDefinitionBuilder builder, ParserContext parserContext) { - BeanDefinition innerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); if (innerDefinition != null){ builder.addPropertyValue("targetObject", innerDefinition); } else { diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/FilterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/FilterParser.java index b636b85319..6f1fdced11 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/FilterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/FilterParser.java @@ -45,7 +45,7 @@ public class FilterParser extends AbstractConsumerEndpointParser { } private String parseSelector(Element element, ParserContext parserContext) { - BeanDefinition innerHandlerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerHandlerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); String ref = null; if (innerHandlerDefinition == null){ ref = element.getAttribute("ref"); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java index 3f28cf52c0..518b8fdd92 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java @@ -16,15 +16,20 @@ package org.springframework.integration.config.xml; +import java.util.List; + import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.Conventions; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; /** * Shared utility methods for integration namespace parsers. @@ -36,6 +41,10 @@ import org.springframework.util.StringUtils; public abstract class IntegrationNamespaceUtils { static final String BASE_PACKAGE = "org.springframework.integration"; + static final String REF_ATTRIBUTE = "ref"; + static final String METHOD_ATTRIBUTE = "method"; + static final String ORDER = "order"; + /** @@ -173,4 +182,21 @@ public abstract class IntegrationNamespaceUtils { targetBuilder.addPropertyReference("pollerMetadata", pollerMetadataRef); } + @SuppressWarnings("unchecked") + public static BeanDefinition parseInnerHandlerDefinition(Element element, ParserContext parserContext){ + // parses out inner bean definition for concrete implementation if defined + List childElements = DomUtils.getChildElementsByTagName(element, "bean"); + BeanDefinition innerDefinition = null; + if (childElements != null && childElements.size() == 1){ + Element beanElement = childElements.get(0); + BeanDefinitionParserDelegate delegate = parserContext.getDelegate(); + innerDefinition = delegate.parseBeanDefinitionElement(beanElement).getBeanDefinition(); + } + + String ref = element.getAttribute(REF_ATTRIBUTE); + Assert.isTrue(!(StringUtils.hasText(ref) && innerDefinition != null), "Ambiguous definition. Inner bean " + + (innerDefinition == null ? innerDefinition : innerDefinition.getBeanClassName()) + " declaration and \"ref\" " + ref + + " are not allowed together."); + return innerDefinition; + } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/ServiceActivatorParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/ServiceActivatorParser.java index 4511c27626..33bfb1ed63 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/ServiceActivatorParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/ServiceActivatorParser.java @@ -33,7 +33,7 @@ public class ServiceActivatorParser extends AbstractConsumerEndpointParser { @Override protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinition innerHandlerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerHandlerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( IntegrationNamespaceUtils.BASE_PACKAGE + ".handler.ServiceActivatingHandler"); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SplitterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SplitterParser.java index 203516bdc0..db8b79837f 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SplitterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SplitterParser.java @@ -33,7 +33,7 @@ public class SplitterParser extends AbstractConsumerEndpointParser { @Override protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinition innerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( IntegrationNamespaceUtils.BASE_PACKAGE + ".config.SplitterFactoryBean"); if (innerDefinition != null){ diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java index 0de4af65cf..b4c6e00fe3 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java @@ -32,7 +32,7 @@ public class TransformerParser extends AbstractConsumerEndpointParser { @Override protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinition innerDefinition = this.parseInnerHandlerDefinition(element, parserContext); + BeanDefinition innerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( IntegrationNamespaceUtils.BASE_PACKAGE + ".config.TransformerFactoryBean");