/* * Copyright 2002-2017 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.message; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.integration.handler.ServiceActivatingHandler; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Headers; import org.springframework.messaging.handler.annotation.Payload; /** * @author Mark Fisher * @author Artem Bilan * * @since 1.0.3 */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class PayloadAndHeaderMappingTests { private static final ConfigurableApplicationContext applicationContext = TestUtils.createTestApplicationContext(); private TestBean bean; @BeforeClass public static void start() { applicationContext.refresh(); } @AfterClass public static void stop() { applicationContext.close(); } @Before public void setup() { bean = new TestBean(); } @Test public void headerPropertiesAndObjectPayload() throws Exception { MessageHandler handler = this.getHandler("headerPropertiesAndObjectPayload", Properties.class, Object.class); Object payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); // assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void stringPayloadAndHeaderProperties() throws Exception { MessageHandler handler = this.getHandler("stringPayloadAndHeaderProperties", String.class, Properties.class); Object payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void headerMapAndObjectPayload() throws Exception { MessageHandler handler = this.getHandler("headerMapAndObjectPayload", Map.class, Object.class); Object payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void objectPayloadAndHeaderMap() throws Exception { MessageHandler handler = this.getHandler("objectPayloadAndHeaderMap", Object.class, Map.class); Object payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void payloadMapAndHeaderString() throws Exception { MessageHandler handler = this.getHandler("payloadMapAndHeaderString", Map.class, String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertFalse(bean.lastHeaders.containsKey("bar")); } @Test public void payloadMapAndHeaderStrings() throws Exception { MessageHandler handler = this.getHandler("payloadMapAndHeaderStrings", Map.class, String.class, String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", "3"); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void objectPayloadHeaderMapAndStringHeaders() throws Exception { MessageHandler handler = this.getHandler("objectPayloadHeaderMapAndStringHeaders", String.class, Map.class, String.class, Object.class); Object payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertEquals("1", bean.lastHeaders.get("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertEquals("2", bean.lastHeaders.get("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); assertTrue(bean.lastHeaders.containsKey("foo2")); assertEquals("1", bean.lastHeaders.get("foo2")); assertTrue(bean.lastHeaders.containsKey("bar2")); assertEquals("2", bean.lastHeaders.get("bar2")); } @Test public void payloadMapAndHeaderMap() throws Exception { MessageHandler handler = this.getHandler("payloadMapAndHeaderMap", Map.class, Map.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void headerMapAndPayloadMap() throws Exception { MessageHandler handler = this.getHandler("headerMapAndPayloadMap", Map.class, Map.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void headerMapOnlyWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("headerMapOnly", Map.class); String payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void headerMapOnlyWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("headerMapOnly", Map.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void mapOnlyNoAnnotationsWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("mapOnlyNoAnnotations", Map.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("payload", 1); Map<String, Object> headers = new HashMap<String, Object>(); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertNull(bean.lastHeaders); } @Test public void mapOnlyNoAnnotationsWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("mapOnlyNoAnnotations", Map.class); String payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void mapOnlyNoAnnotationsWithIntegerPayload() throws Exception { MessageHandler handler = this.getHandler("mapOnlyNoAnnotations", Map.class); Integer payload = new Integer(123); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("baz")); } @Test public void propertiesOnlyNoAnnotationsWithPropertiesPayload() throws Exception { MessageHandler handler = this.getHandler("propertiesOnlyNoAnnotations", Properties.class); Properties payload = new Properties(); payload.setProperty("payload", "1"); Map<String, Object> headers = new HashMap<String, Object>(); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertNull(bean.lastHeaders); } @Test public void propertiesOnlyNoAnnotationsWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("propertiesOnlyNoAnnotations", Properties.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("payload", 1); Map<String, Object> headers = new HashMap<String, Object>(); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertNull(bean.lastHeaders); } @Test public void propertiesOnlyNoAnnotationsWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("propertiesOnlyNoAnnotations", Properties.class); String payload = "payload=abc"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastHeaders); // String payload should have been converted to Properties assertNotNull(bean.lastPayload); assertTrue(bean.lastPayload instanceof Properties); Properties payloadProps = (Properties) bean.lastPayload; assertTrue(payloadProps.containsKey("payload")); assertEquals("abc", payloadProps.get("payload")); } @Test public void propertiesOnlyNoAnnotationsWithIntegerPayload() throws Exception { MessageHandler handler = this.getHandler("propertiesOnlyNoAnnotations", Properties.class); Integer payload = new Integer(123); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); } @Test public void headerPropertiesOnlyWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("headerPropertiesOnly", Properties.class); String payload = "test"; Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void headerPropertiesOnlyWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("headerPropertiesOnly", Properties.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void headerPropertiesOnlyWithPropertiesPayload() throws Exception { MessageHandler handler = this.getHandler("headerPropertiesOnly", Properties.class); Properties payload = new Properties(); payload.setProperty("abc", "1"); payload.setProperty("xyz", "2"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void payloadMapAndHeaderProperties() throws Exception { MessageHandler handler = this.getHandler("payloadMapAndHeaderProperties", Map.class, Properties.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test public void headerPropertiesPayloadMapAndStringHeader() throws Exception { MessageHandler handler = this.getHandler("headerPropertiesPayloadMapAndStringHeader", Properties.class, Map.class, String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("abc", 1); payload.put("xyz", "test"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); headers.put("baz", 99); Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals(payload, bean.lastPayload); assertTrue(bean.lastHeaders.containsKey("foo")); assertEquals("1", bean.lastHeaders.get("foo")); assertTrue(bean.lastHeaders.containsKey("bar")); assertTrue(bean.lastHeaders.containsKey("foo2")); assertEquals("1", bean.lastHeaders.get("foo2")); //assertFalse(bean.lastHeaders.containsKey("baz")); } @Test(expected = IllegalArgumentException.class) public void twoMapsNoAnnotations() throws Exception { this.getHandler("twoMapsNoAnnotations", Map.class, Map.class); } @Test public void twoMapsWithAnnotationsWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("twoMapsWithAnnotations", Map.class, Map.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload("test").copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertEquals("2", bean.lastHeaders.get("bar")); assertEquals("1", bean.lastHeaders.get("foo2")); assertEquals("2", bean.lastHeaders.get("bar2")); } @Test public void twoMapsWithAnnotationsWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("twoMapsWithAnnotations", Map.class, Map.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Map<String, Object> payloadMap = new HashMap<String, Object>(); payloadMap.put("baz", "99"); Message<?> message = MessageBuilder.withPayload(payloadMap).copyHeaders(headers).build(); handler.handleMessage(message); assertEquals("1", bean.lastHeaders.get("foo")); assertEquals("2", bean.lastHeaders.get("bar")); assertEquals("1", bean.lastHeaders.get("foo2")); assertEquals("2", bean.lastHeaders.get("bar2")); assertEquals(null, bean.lastHeaders.get("baz")); } @Test(expected = IllegalStateException.class) public void twoStringsAmbiguousUsingMethodName() throws Exception { SingleAmbiguousMethodTestBean bean = new SingleAmbiguousMethodTestBean(); new ServiceActivatingHandler(bean, "twoStrings"); } @Test(expected = IllegalStateException.class) public void twoStringsAmbiguousWithoutMethodName() throws Exception { SingleAmbiguousMethodTestBean bean = new SingleAmbiguousMethodTestBean(); new ServiceActivatingHandler(bean); } @Test(expected = IllegalArgumentException.class) public void twoStringsNoAnnotations() throws Exception { this.getHandler("twoStringsNoAnnotations", String.class, String.class); } @Test(expected = IllegalArgumentException.class) public void twoMapsNoAnnotationsAndObject() throws Exception { this.getHandler("twoMapsNoAnnotationsAndObject", Map.class, Object.class, Map.class); } @Test public void mapAndAnnotatedStringHeaderWithStringPayload() throws Exception { MessageHandler handler = this.getHandler( "mapAndAnnotatedStringHeaderExpectingMapAsHeaders", Map.class, String.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload("test") .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertEquals("2", bean.lastHeaders.get("bar")); assertEquals("1", bean.lastHeaders.get("foo2")); } @Test public void mapAndAnnotatedStringHeaderWithMapPayload() throws Exception { MessageHandler handler = this.getHandler( "mapAndAnnotatedStringHeaderExpectingMapAsPayload", Map.class, String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("test", "0"); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(payload) .copyHeaders(headers).build(); handler.handleMessage(message); assertNotNull(bean.lastPayload); assertEquals(payload, bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleStringHeaderOnlyWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("singleStringHeaderOnly", String.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload("test") .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleStringHeaderOnlyWithIntegerPayload() throws Exception { MessageHandler handler = this.getHandler("singleStringHeaderOnly", String.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(new Integer(123)) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleStringHeaderOnlyWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("singleStringHeaderOnly", String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("foo", 99); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "1"); headers.put("bar", "2"); Message<?> message = MessageBuilder.withPayload(payload) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("1", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleIntegerHeaderOnlyWithIntegerPayload() throws Exception { MessageHandler handler = this.getHandler("singleIntegerHeaderOnly", Integer.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", new Integer(123)); headers.put("bar", new Integer(456)); Message<?> message = MessageBuilder.withPayload(new Integer(789)) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals(new Integer(123), bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleIntegerHeaderOnlyWithIntegerPayloadAndStringHeader() throws Exception { MessageHandler handler = this.getHandler("singleIntegerHeaderOnly", Integer.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "999"); headers.put("bar", new Integer(456)); Message<?> message = MessageBuilder.withPayload(new Integer(789)) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals(new Integer(999), bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleIntegerHeaderOnlyWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("singleIntegerHeaderOnly", Integer.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", new Integer(123)); headers.put("bar", new Integer(456)); Message<?> message = MessageBuilder.withPayload("test") .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals(new Integer(123), bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleObjectHeaderOnlyWithStringPayload() throws Exception { MessageHandler handler = this.getHandler("singleObjectHeaderOnly", Object.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "123"); headers.put("bar", "456"); Message<?> message = MessageBuilder.withPayload("test") .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("123", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleObjectHeaderOnlyWithObjectPayload() throws Exception { MessageHandler handler = this.getHandler("singleObjectHeaderOnly", Object.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", "123"); headers.put("bar", "456"); Message<?> message = MessageBuilder.withPayload(new Object()) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals("123", bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleObjectHeaderOnlyWithIntegerPayload() throws Exception { MessageHandler handler = this.getHandler("singleObjectHeaderOnly", Object.class); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", new Integer(123)); headers.put("bar", new Integer(456)); Message<?> message = MessageBuilder.withPayload(new Integer(789)) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals(new Integer(123), bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void singleObjectHeaderOnlyWithMapPayload() throws Exception { MessageHandler handler = this.getHandler("singleObjectHeaderOnly", Object.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("foo", 99); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("foo", new Integer(123)); headers.put("bar", new Integer(456)); Message<?> message = MessageBuilder.withPayload(payload) .copyHeaders(headers).build(); handler.handleMessage(message); assertNull(bean.lastPayload); assertEquals(new Integer(123), bean.lastHeaders.get("foo")); assertNull(bean.lastHeaders.get("bar")); } @Test public void twoPayloadExpressions() throws Exception { MessageHandler handler = this.getHandler("twoPayloadExpressions", String.class, String.class); Map<String, Object> payload = new HashMap<String, Object>(); payload.put("foo", 123); payload.put("bar", 456); Message<?> message = MessageBuilder.withPayload(payload).build(); handler.handleMessage(message); assertNull(bean.lastHeaders); assertNotNull(bean.lastPayload); assertEquals("123456", bean.lastPayload); } private ServiceActivatingHandler getHandler(String methodName, Class<?>... types) throws Exception { ServiceActivatingHandler serviceActivatingHandler = new ServiceActivatingHandler(bean, TestBean.class.getMethod(methodName, types)); serviceActivatingHandler.setBeanFactory(applicationContext); serviceActivatingHandler.afterPropertiesSet(); return serviceActivatingHandler; } @SuppressWarnings("unused") private static class SingleAmbiguousMethodTestBean { SingleAmbiguousMethodTestBean() { super(); } public String concat(String s1, String s2) { return "s1" + "s2"; } } @SuppressWarnings("unused") private static class TestBean { private volatile Map lastHeaders; private volatile Object lastPayload; TestBean() { super(); } public void headerPropertiesAndObjectPayload(Properties headers, Object payload) { this.lastHeaders = headers; this.lastPayload = payload; } public void stringPayloadAndHeaderProperties(String payload, Properties headers) { this.lastHeaders = headers; this.lastPayload = payload; } public void stringPayloadAndHeaderMap(String payload, Map headers) { this.lastHeaders = headers; this.lastPayload = payload; } public void headerMapAndObjectPayload(Map headers, Object payload) { this.lastHeaders = headers; this.lastPayload = payload; } public void objectPayloadAndHeaderMap(Object payload, Map headers) { this.lastHeaders = headers; this.lastPayload = payload; } public void objectPayloadHeaderMapAndStringHeaders( @Header("foo") String header1, Map headers, @Header("bar") String header2, Object payload) { this.lastHeaders = new HashMap<String, String>(); this.lastHeaders.put("foo2", header1); this.lastHeaders.put("bar2", header2); this.lastHeaders.putAll(headers); this.lastPayload = payload; this.lastPayload = payload; } public void payloadMapAndHeaderString(Map payload, @Header("foo") String header) { this.lastHeaders = new HashMap<String, String>(); this.lastHeaders.put("foo", header); this.lastPayload = payload; } public void payloadMapAndHeaderStrings(Map payload, @Header("foo") String header1, @Header("bar") String header2) { this.lastHeaders = new HashMap<String, String>(); this.lastHeaders.put("foo", header1); this.lastHeaders.put("bar", header2); this.lastPayload = payload; } public void payloadMapAndHeaderMap(Map payload, @Headers Map headers) { this.lastHeaders = headers; this.lastPayload = payload; } public void headerMapAndPayloadMap(@Headers Map headers, Map payload) { this.lastHeaders = headers; this.lastPayload = payload; } public void payloadMapAndHeaderProperties(Map payload, @Headers Properties headers) { this.lastHeaders = headers; this.lastPayload = payload; } public void headerPropertiesPayloadMapAndStringHeader(@Headers Properties headers, Map payload, @Header("foo") String header) { this.lastHeaders = headers; this.lastHeaders.put("foo2", header); this.lastPayload = payload; } public void headerMapOnly(@Headers Map headers) { this.lastHeaders = headers; } public void headerPropertiesOnly(@Headers Properties headers) { this.lastHeaders = headers; } public void mapOnlyNoAnnotations(Map map) { if (map.containsKey("payload")) { this.lastPayload = map; } else { this.lastHeaders = map; } } public void propertiesOnlyNoAnnotations(Properties props) { if (props.containsKey("payload")) { this.lastPayload = props; } else { this.lastHeaders = props; } } public void twoStringsNoAnnotations(String s1, String s2) { // invalid due to ambiguity (no @Payload or @Headers) } public void twoMapsNoAnnotations(Map map1, Map<Object, Object> map2) { // invalid due to ambiguity (no @Payload or @Headers) } public void twoMapsWithAnnotations(@Headers Map map1, @Headers Map<Object, Object> map2) { this.lastHeaders = new HashMap(map1); for (Map.Entry<Object, Object> entry : map2.entrySet()) { this.lastHeaders.put(entry.getKey() + "2", entry.getValue()); } } public void twoMapsWithAnnotationsAndObject(@Headers Map map1, Object o, @Headers Map<Object, Object> map2) { this.lastPayload = o; this.lastHeaders = new HashMap(map1); for (Map.Entry<Object, Object> entry : map2.entrySet()) { this.lastHeaders.put(entry.getKey() + "2", entry.getValue()); } } public void twoMapsNoAnnotationsAndObject(Map map1, Object o, Map<Object, Object> map2) { // invalid due to ambiguity of Map parameters (no @Payload or @Headers) } public void mapAndAnnotatedStringHeaderExpectingMapAsHeaders(Map map, @Header("foo") String s) { this.lastHeaders = new HashMap(map); this.lastHeaders.put("foo2", s); } public void mapAndAnnotatedStringHeaderExpectingMapAsPayload(Map map, @Header("foo") String s) { this.lastPayload = map; this.lastHeaders = Collections.singletonMap("foo", s); } public void singleStringHeaderOnly(@Header("foo") String s) { this.lastHeaders = Collections.singletonMap("foo", s); } public void singleIntegerHeaderOnly(@Header("foo") Integer n) { this.lastHeaders = Collections.singletonMap("foo", n); } public void singleObjectHeaderOnly(@Header("foo") Object o) { this.lastHeaders = Collections.singletonMap("foo", o); } public void twoPayloadExpressions(@Payload("foo") String foo, @Payload("bar") String bar) { this.lastPayload = foo + bar; } } }