diff --git a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd index c4f937eae6..e85c59531b 100644 --- a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd +++ b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd @@ -58,12 +58,19 @@ - + Defines a JMS-based source channel adapter. + + + + + + + @@ -86,12 +93,19 @@ - + Defines a target that sends JMS Messages. + + + + + + + diff --git a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsAdapterParserUtils.java b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsAdapterParserUtils.java index 86c8a9e6c0..952457283c 100644 --- a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsAdapterParserUtils.java +++ b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsAdapterParserUtils.java @@ -46,6 +46,10 @@ public abstract class JmsAdapterParserUtils { public static final String DESTINATION_NAME_PROPERTY = "destinationName"; + public static final String HEADER_MAPPER_ATTRIBUTE = "header-mapper"; + + public static final String HEADER_MAPPER_PROPERTY = "headerMapper"; + public static final String MESSAGE_CONVERTER_ATTRIBUTE = "message-converter"; public static final String MESSAGE_CONVERTER_PROPERTY = "messageConverter"; diff --git a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsSourceParser.java b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsSourceParser.java index dc50cbf984..aa9e94517b 100644 --- a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsSourceParser.java +++ b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsSourceParser.java @@ -47,6 +47,7 @@ public class JmsSourceParser extends AbstractBeanDefinitionParser { String jmsTemplate = element.getAttribute(JmsAdapterParserUtils.JMS_TEMPLATE_ATTRIBUTE); String destination = element.getAttribute(JmsAdapterParserUtils.DESTINATION_ATTRIBUTE); String destinationName = element.getAttribute(JmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE); + String headerMapper = element.getAttribute(JmsAdapterParserUtils.HEADER_MAPPER_ATTRIBUTE); if (StringUtils.hasText(jmsTemplate)) { if (element.hasAttribute(JmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE) || element.hasAttribute(JmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE) || @@ -73,6 +74,9 @@ public class JmsSourceParser extends AbstractBeanDefinitionParser { JmsAdapterParserUtils.DESTINATION_ATTRIBUTE + "' or '" + JmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE + "' attributes must be provided for a polling JMS adapter"); } + if (StringUtils.hasText(headerMapper)) { + builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); + } return builder.getBeanDefinition(); } diff --git a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsTargetParser.java b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsTargetParser.java index 28989f1f2c..a6f321fafd 100644 --- a/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsTargetParser.java +++ b/spring-integration-adapters/src/main/java/org/springframework/integration/adapter/jms/config/JmsTargetParser.java @@ -48,6 +48,7 @@ public class JmsTargetParser extends AbstractSingleBeanDefinitionParser { String jmsTemplate = element.getAttribute(JmsAdapterParserUtils.JMS_TEMPLATE_ATTRIBUTE); String destination = element.getAttribute(JmsAdapterParserUtils.DESTINATION_ATTRIBUTE); String destinationName = element.getAttribute(JmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE); + String headerMapper = element.getAttribute(JmsAdapterParserUtils.HEADER_MAPPER_ATTRIBUTE); if (StringUtils.hasText(jmsTemplate)) { if (element.hasAttribute(JmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE) || element.hasAttribute(JmsAdapterParserUtils.DESTINATION_ATTRIBUTE) || @@ -71,6 +72,9 @@ public class JmsTargetParser extends AbstractSingleBeanDefinitionParser { throw new BeanCreationException("Either a 'jms-template' reference or " + "one of 'destination' or 'destination-name' attributes must be provided."); } + if (StringUtils.hasText(headerMapper)) { + builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); + } } } diff --git a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsSourceParserTests.java b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsSourceParserTests.java index 0969bafbd3..c4e030691c 100644 --- a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsSourceParserTests.java +++ b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsSourceParserTests.java @@ -114,6 +114,18 @@ public class JmsSourceParserTests { assertEquals("polling-test", message.getPayload()); } + @Test + public void testSourceWithHeaderMapper() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsSourceWithHeaderMapper.xml", this.getClass()); + JmsSource source = (JmsSource) context.getBean("jmsSource"); + Message message = source.receive(); + assertNotNull("message should not be null", message); + assertEquals("polling-test", message.getPayload()); + assertEquals("foo", message.getHeader().getProperty("testProperty")); + assertEquals(new Integer(123), message.getHeader().getAttribute("testAttribute")); + } + @Test public void testSourceEndpoint() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( diff --git a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsTargetParserTests.java b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsTargetParserTests.java index 0ed5de6263..d50a2dbe77 100644 --- a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsTargetParserTests.java +++ b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/JmsTargetParserTests.java @@ -25,6 +25,7 @@ import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.adapter.MessageHeaderMapper; import org.springframework.integration.adapter.jms.JmsTarget; /** @@ -59,6 +60,19 @@ public class JmsTargetParserTests { assertNotNull(accessor.getPropertyValue("jmsTemplate")); } + @Test + @SuppressWarnings("unchecked") + public void testTargetWithHeaderMapper() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "targetWithHeaderMapper.xml", this.getClass()); + JmsTarget target = (JmsTarget) context.getBean("target"); + DirectFieldAccessor accessor = new DirectFieldAccessor(target); + MessageHeaderMapper headerMapper = (MessageHeaderMapper) + accessor.getPropertyValue("headerMapper"); + assertNotNull(headerMapper); + assertEquals(TestMessageHeaderMapper.class, headerMapper.getClass()); + } + @Test(expected=BeanDefinitionStoreException.class) public void testTargetWithEmptyConnectionFactory() { try { diff --git a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/TestMessageHeaderMapper.java b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/TestMessageHeaderMapper.java new file mode 100644 index 0000000000..c80d0cbef7 --- /dev/null +++ b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/TestMessageHeaderMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright 2002-2008 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.adapter.jms.config; + +import javax.jms.Message; + +import org.springframework.integration.adapter.MessageHeaderMapper; +import org.springframework.integration.message.MessageHeader; + +/** + * @author Mark Fisher + */ +public class TestMessageHeaderMapper implements MessageHeaderMapper { + + public void mapFromMessageHeader(MessageHeader header, Message target) { + } + + public void mapToMessageHeader(Message source, MessageHeader header) { + header.setProperty("testProperty", "foo"); + header.setAttribute("testAttribute", new Integer(123)); + } + +} diff --git a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/jmsSourceWithHeaderMapper.xml b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/jmsSourceWithHeaderMapper.xml new file mode 100644 index 0000000000..71097a93a6 --- /dev/null +++ b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/jmsSourceWithHeaderMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/targetWithHeaderMapper.xml b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/targetWithHeaderMapper.xml new file mode 100644 index 0000000000..a7534b6916 --- /dev/null +++ b/spring-integration-adapters/src/test/java/org/springframework/integration/adapter/jms/config/targetWithHeaderMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + +