From 98f0cb5a6be4b3e5a8f0b191dd689603d8723362 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 19 Jun 2009 16:52:21 +0000 Subject: [PATCH] Using classnames rather than Class instances in header-value and payoad-type router parsers. --- .../config/xml/HeaderValueRouterParser.java | 31 +++++---- .../xml/IntegrationNamespaceHandler.java | 7 +- .../config/xml/PayloadTypeRouterParser.java | 25 ++++--- .../integration/config/xml/RouterParser.java | 20 ++---- .../config/xml/spring-integration-1.0.xsd | 66 +++++++++---------- 5 files changed, 75 insertions(+), 74 deletions(-) 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 c7550beed3..5e42821db1 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * 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. @@ -18,42 +18,45 @@ package org.springframework.integration.config.xml; import java.util.List; +import org.w3c.dom.Element; + import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.channel.MapBasedChannelResolver; -import org.springframework.integration.router.HeaderValueRouter; import org.springframework.util.xml.DomUtils; -import org.w3c.dom.Element; /** * Parser for the <header-value-router/> element. * * @author Oleg Zhurakousky + * @author Mark Fisher + * @since 1.0.3 */ public class HeaderValueRouterParser extends RouterParser { @Override + @SuppressWarnings("unchecked") protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinitionBuilder headerValueRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition(HeaderValueRouter.class); + BeanDefinitionBuilder headerValueRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".router.HeaderValueRouter"); headerValueRouterBuilder.addConstructorArgValue(element.getAttribute("header-name")); - - BeanDefinitionBuilder mapBasedChannelResolverBuilder = null; // check if mapping is provided otherwise header values will be treated as channel names List childElements = DomUtils.getChildElementsByTagName(element, "mapping"); - if (childElements != null && childElements.size() > 0){ - mapBasedChannelResolverBuilder = BeanDefinitionBuilder.genericBeanDefinition(MapBasedChannelResolver.class); + if (childElements != null && childElements.size() > 0) { + BeanDefinitionBuilder mapBasedChannelResolverBuilder = BeanDefinitionBuilder.genericBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.MapBasedChannelResolver"); ManagedMap channelMap = new ManagedMap(); for (Element childElement : childElements) { - channelMap.put(childElement.getAttribute("value"), new RuntimeBeanReference(childElement.getAttribute("channel"))); + channelMap.put(childElement.getAttribute("value"), + new RuntimeBeanReference(childElement.getAttribute("channel"))); } mapBasedChannelResolverBuilder.addPropertyValue("channelMap", channelMap); + String resolverBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName( + mapBasedChannelResolverBuilder.getBeanDefinition(), parserContext.getRegistry()); + headerValueRouterBuilder.addPropertyReference("channelResolver", resolverBeanName); } - if (mapBasedChannelResolverBuilder != null){ - headerValueRouterBuilder.addPropertyValue("channelResolver", mapBasedChannelResolverBuilder.getBeanDefinition()); - } - 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 516fb7755a..dcf967396f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * 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. @@ -16,6 +16,9 @@ package org.springframework.integration.config.xml; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -23,8 +26,6 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.NamespaceHandler; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; import org.springframework.beans.factory.xml.ParserContext; -import org.w3c.dom.Element; -import org.w3c.dom.Node; /** * Namespace handler for the integration namespace. 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 33446c481a..8aaa4d0435 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * 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. @@ -18,39 +18,44 @@ package org.springframework.integration.config.xml; import java.util.List; +import org.w3c.dom.Element; + import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.router.PayloadTypeRouter; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.xml.DomUtils; -import org.w3c.dom.Element; /** * Parser for the <payload-type-router/> element. * * @author Oleg Zhurakousky + * @author Mark Fisher + * @since 1.0.3 */ public class PayloadTypeRouterParser extends RouterParser { @Override + @SuppressWarnings("unchecked") protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { - BeanDefinitionBuilder payloadTypeRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition(PayloadTypeRouter.class); - + BeanDefinitionBuilder payloadTypeRouterBuilder = BeanDefinitionBuilder.genericBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".router.PayloadTypeRouter"); List childElements = DomUtils.getChildElementsByTagName(element, "mapping"); - Assert.notEmpty(childElements, "Type mapping must be provided (e.g., )"); - + Assert.notEmpty(childElements, + "Type mapping must be provided (e.g., )"); ManagedMap channelMap = new ManagedMap(); for (Element childElement : childElements) { String typeName = childElement.getAttribute("type"); - Assert.isTrue(ClassUtils.isPresent(typeName, ClassUtils.getDefaultClassLoader()), typeName + " can not be loaded"); + ClassLoader classLoader = parserContext.getReaderContext().getBeanClassLoader(); + if (classLoader == null) { + classLoader = ClassUtils.getDefaultClassLoader(); + } + Assert.isTrue(ClassUtils.isPresent(typeName, classLoader), typeName + " can not be loaded"); 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/RouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/RouterParser.java index c9cb37f80e..e3ff6d88ed 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/RouterParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * 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. @@ -41,14 +41,8 @@ public class RouterParser extends AbstractConsumerEndpointParser { builder.addPropertyReference("targetObject", ref); return doParse(element, parserContext, builder); } - /** - * - * @param element - * @param parserContext - * @return - */ + 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); @@ -63,12 +57,10 @@ public class RouterParser extends AbstractConsumerEndpointParser { IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "ignore-channel-name-resolution-failures"); return builder; } - /** - * - * @return - */ - BeanDefinitionBuilder createBuilder(){ - return BeanDefinitionBuilder.genericBeanDefinition(IntegrationNamespaceUtils.BASE_PACKAGE + ".config.RouterFactoryBean"); + + BeanDefinitionBuilder createBuilder() { + return BeanDefinitionBuilder.genericBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".config.RouterFactoryBean"); } } 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 565fe68850..1a5a9a2cc3 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 @@ -830,12 +830,15 @@ - + - - Defines a Header Value Router. - + @@ -848,8 +851,14 @@ - + + + + + + @@ -859,22 +868,19 @@ - - - - + + + - - Defines a Header Value Router. - + @@ -887,8 +893,7 @@ - + @@ -898,22 +903,18 @@ - - - - + + + - - Defines a Router. - + @@ -932,15 +933,14 @@ - + - - - + + +