INT-656 Removed the restriction in HandlerMethodUtils for having no more than one param lacking the header or headers annotations. It now allows parameters that are assignable to Map as well. Added several tests for Properties and Map objects expecting to receive Message header values.

This commit is contained in:
Mark Fisher
2009-07-01 23:43:20 +00:00
parent ca5d0a9aa9
commit f2529d1dc2
3 changed files with 430 additions and 9 deletions

View File

@@ -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.
@@ -222,10 +222,10 @@ public class MethodParameterMessageMapperFromMessageTests {
public Properties propertiesHeaders(@Headers Properties properties) {
return properties;
}
public Object propertiesHeadersAndPayload(Properties headers, Object payload) {
return payload;
}
public Object propertiesHeadersAndPayload(Properties headers, Object payload) {
return payload;
}
@SuppressWarnings("unchecked")
public Map mapPayload(Map map) {
@@ -236,7 +236,7 @@ public class MethodParameterMessageMapperFromMessageTests {
public Map mapHeaders(@Headers Map map) {
return map;
}
@SuppressWarnings("unchecked")
public Object mapHeadersAndPayload(Map headers, Object payload) {
return payload;
@@ -246,4 +246,5 @@ public class MethodParameterMessageMapperFromMessageTests {
return i;
}
}
}

View File

@@ -0,0 +1,416 @@
/*
* 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.message;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import org.springframework.integration.annotation.Header;
import org.springframework.integration.annotation.Headers;
import org.springframework.integration.core.Message;
import org.springframework.integration.handler.ServiceActivatingHandler;
/**
* @author Mark Fisher
*/
public class PayloadAndHeaderMappingTests {
private TestBean bean;
@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 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
public void twoMapsNoAnnotations() throws Exception {
MessageHandler handler = this.getHandler("twoMapsNoAnnotations", 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 twoMapsNoAnnotationsAndObject() throws Exception {
MessageHandler handler = this.getHandler("twoMapsNoAnnotationsAndObject",
Map.class, Object.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);
assertEquals("test", 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 twoMapsNoAnnotationsAndObjectWithMapPayload() throws Exception {
MessageHandler handler = this.getHandler("twoMapsNoAnnotationsAndObject",
Map.class, Object.class, Map.class);
Map<String, Integer> payloadMap = new HashMap<String, Integer>();
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("foo", "1");
headers.put("bar", "2");
Message<?> message = MessageBuilder.withPayload(payloadMap)
.copyHeaders(headers).build();
handler.handleMessage(message);
assertEquals(payloadMap, 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 twoMapsNoAnnotationsAndAnnotatedString() throws Exception {
MessageHandler handler = this.getHandler("twoMapsNoAnnotationsAndAnnotatedString",
Map.class, 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"));
assertEquals("2", bean.lastHeaders.get("bar2"));
assertEquals("1", bean.lastHeaders.get("foo3"));
}
private ServiceActivatingHandler getHandler(String methodName, Class<?>... types) throws Exception {
return new ServiceActivatingHandler(bean, TestBean.class.getMethod(methodName, types));
}
@SuppressWarnings("unchecked")
private static class TestBean {
private volatile Map lastHeaders;
private volatile Object lastPayload;
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 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 twoMapsNoAnnotations(Map map1, 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 twoMapsNoAnnotationsAndObject(Map map1, Object o, 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 twoMapsNoAnnotationsAndAnnotatedString(Map map1, Map<Object, Object> map2, @Header("foo") String s) {
this.lastHeaders = new HashMap(map1);
for (Map.Entry<Object, Object> entry : map2.entrySet()) {
this.lastHeaders.put(entry.getKey() + "2", entry.getValue());
}
this.lastHeaders.put("foo3", s);
}
}
}