diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java new file mode 100644 index 0000000000..7cd4207677 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.config.xml; + +import org.w3c.dom.Element; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; + +/** + * Base parser for routers. + * + * @author Mark Fisher + */ +public abstract class AbstractRouterParser extends AbstractConsumerEndpointParser { + + @Override + protected final BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".config.RouterFactoryBean"); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "default-output-channel"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "resolution-required"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "ignore-channel-name-resolution-failures"); + this.parseRouter(element, builder, parserContext); + return builder; + } + + protected abstract void parseRouter(Element element, BeanDefinitionBuilder rootBuilder, ParserContext parserContext); + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/RouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java similarity index 67% rename from org.springframework.integration/src/main/java/org/springframework/integration/config/xml/RouterParser.java rename to org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java index e3ff6d88ed..365b9664bc 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/RouterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/DefaultRouterParser.java @@ -29,20 +29,15 @@ import org.springframework.util.StringUtils; * @author Mark Fisher * @author Oleg Zhurakousky */ -public class RouterParser extends AbstractConsumerEndpointParser { +public class DefaultRouterParser extends AbstractRouterParser { @Override - protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { + protected void parseRouter(Element element, BeanDefinitionBuilder builder, ParserContext parserContext) { String ref = element.getAttribute(REF_ATTRIBUTE); if (!StringUtils.hasText(ref)) { parserContext.getReaderContext().error("The '" + REF_ATTRIBUTE + "' attribute is required.", element); } - BeanDefinitionBuilder builder = this.createBuilder(); builder.addPropertyReference("targetObject", ref); - return doParse(element, parserContext, builder); - } - - protected BeanDefinitionBuilder doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) { String method = element.getAttribute(METHOD_ATTRIBUTE); builder.addPropertyValue("targetMethodName", method); @@ -52,15 +47,6 @@ public class RouterParser extends AbstractConsumerEndpointParser { String resolverBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName( resolverBuilder.getBeanDefinition(), parserContext.getRegistry()); builder.addPropertyReference("channelResolver", resolverBeanName); - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "default-output-channel"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "resolution-required"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "ignore-channel-name-resolution-failures"); - return builder; - } - - BeanDefinitionBuilder createBuilder() { - return BeanDefinitionBuilder.genericBeanDefinition( - IntegrationNamespaceUtils.BASE_PACKAGE + ".config.RouterFactoryBean"); } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderValueRouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderValueRouterParser.java index 5e42821db1..342711de94 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderValueRouterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderValueRouterParser.java @@ -34,11 +34,11 @@ import org.springframework.util.xml.DomUtils; * @author Mark Fisher * @since 1.0.3 */ -public class HeaderValueRouterParser extends RouterParser { +public class HeaderValueRouterParser extends AbstractRouterParser { @Override @SuppressWarnings("unchecked") - protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { + protected void parseRouter(Element element, BeanDefinitionBuilder rootBuilder, ParserContext parserContext) { BeanDefinitionBuilder headerValueRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition( IntegrationNamespaceUtils.BASE_PACKAGE + ".router.HeaderValueRouter"); headerValueRouterBuilder.addConstructorArgValue(element.getAttribute("header-name")); @@ -57,9 +57,7 @@ public class HeaderValueRouterParser extends RouterParser { mapBasedChannelResolverBuilder.getBeanDefinition(), parserContext.getRegistry()); headerValueRouterBuilder.addPropertyReference("channelResolver", resolverBeanName); } - BeanDefinitionBuilder rootBuilder = this.createBuilder(); rootBuilder.addPropertyValue("targetObject", headerValueRouterBuilder.getBeanDefinition()); - return this.doParse(element, parserContext, rootBuilder); } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java index dcf967396f..bb0880403a 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java @@ -79,7 +79,7 @@ public class IntegrationNamespaceHandler implements NamespaceHandler { registerBeanDefinitionParser("service-activator", new ServiceActivatorParser()); registerBeanDefinitionParser("transformer", new TransformerParser()); registerBeanDefinitionParser("filter", new FilterParser()); - registerBeanDefinitionParser("router", new RouterParser()); + registerBeanDefinitionParser("router", new DefaultRouterParser()); registerBeanDefinitionParser("header-value-router", new HeaderValueRouterParser()); registerBeanDefinitionParser("payload-type-router", new PayloadTypeRouterParser()); registerBeanDefinitionParser("splitter", new SplitterParser()); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PayloadTypeRouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PayloadTypeRouterParser.java index 8aaa4d0435..e8347cc9d6 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PayloadTypeRouterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PayloadTypeRouterParser.java @@ -35,11 +35,11 @@ import org.springframework.util.xml.DomUtils; * @author Mark Fisher * @since 1.0.3 */ -public class PayloadTypeRouterParser extends RouterParser { +public class PayloadTypeRouterParser extends AbstractRouterParser { @Override @SuppressWarnings("unchecked") - protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { + protected void parseRouter(Element element, BeanDefinitionBuilder rootBuilder, ParserContext parserContext) { BeanDefinitionBuilder payloadTypeRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition( IntegrationNamespaceUtils.BASE_PACKAGE + ".router.PayloadTypeRouter"); List childElements = DomUtils.getChildElementsByTagName(element, "mapping"); @@ -56,9 +56,7 @@ public class PayloadTypeRouterParser extends RouterParser { channelMap.put(typeName, new RuntimeBeanReference(childElement.getAttribute("channel"))); } payloadTypeRouterBuilder.addPropertyValue("payloadTypeChannelMap", channelMap); - BeanDefinitionBuilder rootBuilder = this.createBuilder(); rootBuilder.addPropertyValue("targetObject", payloadTypeRouterBuilder.getBeanDefinition()); - return this.doParse(element, parserContext, rootBuilder); } - + } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/spring-integration-1.0.xsd b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/spring-integration-1.0.xsd index cbab100f30..45705168a9 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/spring-integration-1.0.xsd +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/spring-integration-1.0.xsd @@ -924,6 +924,7 @@ +