Refactored MessageMappingParameterResolver to MethodParameterMessageMapper, an implementation of the MessageMapper interface.
This commit is contained in:
@@ -26,6 +26,7 @@ import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.integration.ConfigurationException;
|
||||
import org.springframework.integration.gateway.MessageMapper;
|
||||
import org.springframework.integration.util.DefaultMethodInvoker;
|
||||
import org.springframework.integration.util.MethodInvoker;
|
||||
import org.springframework.integration.util.NameResolvingMethodInvoker;
|
||||
@@ -55,7 +56,7 @@ public class MessageMappingMethodInvoker implements MethodInvoker, InitializingB
|
||||
|
||||
private volatile String methodName;
|
||||
|
||||
private volatile MessageMappingParameterResolver parameterResolver;
|
||||
private volatile MessageMapper<Object[]> messageMapper;
|
||||
|
||||
private volatile MethodInvoker invoker;
|
||||
|
||||
@@ -109,7 +110,7 @@ public class MessageMappingMethodInvoker implements MethodInvoker, InitializingB
|
||||
this.methodExpectsMessage = true;
|
||||
}
|
||||
this.invoker = new DefaultMethodInvoker(this.object, this.method);
|
||||
this.parameterResolver = new MessageMappingParameterResolver(this.method);
|
||||
this.messageMapper = new MethodParameterMessageMapper(this.method);
|
||||
}
|
||||
else {
|
||||
// TODO: resolve the candidate method and/or create a dynamic resolver
|
||||
@@ -190,8 +191,8 @@ public class MessageMappingMethodInvoker implements MethodInvoker, InitializingB
|
||||
}
|
||||
|
||||
private Object[] resolveParameters(Message<?> message) {
|
||||
if (this.parameterResolver != null) {
|
||||
return this.parameterResolver.resolveParameters(message);
|
||||
if (this.messageMapper != null) {
|
||||
return this.messageMapper.fromMessage(message);
|
||||
}
|
||||
return new Object[] { message.getPayload() };
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.ParameterNameDiscoverer;
|
||||
import org.springframework.integration.annotation.Header;
|
||||
import org.springframework.integration.gateway.MessageMapper;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -45,7 +46,7 @@ import org.springframework.util.StringUtils;
|
||||
*
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class MessageMappingParameterResolver {
|
||||
public class MethodParameterMessageMapper implements MessageMapper<Object[]> {
|
||||
|
||||
private final Method method;
|
||||
|
||||
@@ -54,14 +55,19 @@ public class MessageMappingParameterResolver {
|
||||
private final ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
||||
|
||||
|
||||
public MessageMappingParameterResolver(Method method) {
|
||||
public MethodParameterMessageMapper(Method method) {
|
||||
Assert.notNull(method, "method must not be null");
|
||||
this.method = method;
|
||||
this.initializeParameterMetadata();
|
||||
}
|
||||
|
||||
|
||||
public Object[] resolveParameters(Message<?> message) {
|
||||
public Message<?> toMessage(Object[] methodParameters) {
|
||||
// TODO: add checks for @Header, Map, etc.
|
||||
return MessageBuilder.withPayload(methodParameters).build();
|
||||
}
|
||||
|
||||
public Object[] fromMessage(Message<?> message) {
|
||||
if (message == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -30,83 +30,83 @@ import org.springframework.integration.annotation.Header;
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessageBuilder;
|
||||
import org.springframework.integration.message.MessageHandlingException;
|
||||
import org.springframework.integration.message.MessageMappingParameterResolver;
|
||||
import org.springframework.integration.message.MethodParameterMessageMapper;
|
||||
import org.springframework.integration.message.StringMessage;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class MessageMappingParameterResolverTests {
|
||||
public class MethodParameterMessageMapperTests {
|
||||
|
||||
@Test
|
||||
public void optionalHeader() throws Exception {
|
||||
public void fromMessageWithOptionalHeader() throws Exception {
|
||||
Method method = TestService.class.getMethod("optionalHeader", Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
Object[] args = resolver.resolveParameters(new StringMessage("foo"));
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Object[] args = mapper.fromMessage(new StringMessage("foo"));
|
||||
assertEquals(1, args.length);
|
||||
assertNull(args[0]);
|
||||
}
|
||||
|
||||
@Test(expected = MessageHandlingException.class)
|
||||
public void tequiredHeaderNotProvided() throws Exception {
|
||||
public void fromMessageWithRequiredHeaderNotProvided() throws Exception {
|
||||
Method method = TestService.class.getMethod("requiredHeader", Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
resolver.resolveParameters(new StringMessage("foo"));
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
mapper.fromMessage(new StringMessage("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void requiredHeaderProvided() throws Exception {
|
||||
public void fromMessageWithRequiredHeaderProvided() throws Exception {
|
||||
Method method = TestService.class.getMethod("requiredHeader", Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("foo")
|
||||
.setHeader("num", new Integer(123)).build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
assertEquals(1, args.length);
|
||||
assertEquals(new Integer(123), args[0]);
|
||||
}
|
||||
|
||||
@Test(expected = MessageHandlingException.class)
|
||||
public void optionalAndRequiredHeaderWithOnlyOptionalHeaderProvided() throws Exception {
|
||||
public void fromMessageWithOptionalAndRequiredHeaderAndOnlyOptionalHeaderProvided() throws Exception {
|
||||
Method method = TestService.class.getMethod("optionalAndRequiredHeader", String.class, Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("foo")
|
||||
.setHeader("prop", "bar").build();
|
||||
resolver.resolveParameters(message);
|
||||
mapper.fromMessage(message);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optionalAndRequiredHeaderWithOnlyRequiredHeaderProvided() throws Exception {
|
||||
public void fromMessageWithOptionalAndRequiredHeaderAndOnlyRequiredHeaderProvided() throws Exception {
|
||||
Method method = TestService.class.getMethod("optionalAndRequiredHeader", String.class, Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("foo")
|
||||
.setHeader("num", new Integer(123)).build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
assertEquals(2, args.length);
|
||||
assertNull(args[0]);
|
||||
assertEquals(123, args[1]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optionalAndRequiredHeaderWithBothHeadersProvided() throws Exception {
|
||||
public void fromMessageWithOptionalAndRequiredHeaderAndBothHeadersProvided() throws Exception {
|
||||
Method method = TestService.class.getMethod("optionalAndRequiredHeader", String.class, Integer.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("foo")
|
||||
.setHeader("num", new Integer(123))
|
||||
.setHeader("prop", "bar")
|
||||
.build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
assertEquals(2, args.length);
|
||||
assertEquals("bar", args[0]);
|
||||
assertEquals(123, args[1]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void propertiesMethodWithNonPropertiesPayload() throws Exception {
|
||||
public void fromMessageWithPropertiesMethodAndNonPropertiesPayload() throws Exception {
|
||||
Method method = TestService.class.getMethod("propertiesMethod", Properties.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("test")
|
||||
.setHeader("prop1", "foo").setHeader("prop2", "bar").build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
Properties result = (Properties) args[0];
|
||||
assertEquals(2, result.size());
|
||||
assertEquals("foo", result.getProperty("prop1"));
|
||||
@@ -114,15 +114,15 @@ public class MessageMappingParameterResolverTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void propertiesMethodWithPropertiesPayload() throws Exception {
|
||||
public void fromMessageWithPropertiesMethodAndPropertiesPayload() throws Exception {
|
||||
Method method = TestService.class.getMethod("propertiesMethod", Properties.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Properties payload = new Properties();
|
||||
payload.setProperty("prop1", "foo");
|
||||
payload.setProperty("prop2", "bar");
|
||||
Message<Properties> message = MessageBuilder.withPayload(payload)
|
||||
.setHeader("prop1", "not").setHeader("prop2", "these").build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
Properties result = (Properties) args[0];
|
||||
assertEquals(2, result.size());
|
||||
assertEquals("foo", result.getProperty("prop1"));
|
||||
@@ -131,13 +131,13 @@ public class MessageMappingParameterResolverTests {
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testMapMethodWithNonMapPayload() throws Exception {
|
||||
public void fromMessageWithMapMethodAndNonMapPayload() throws Exception {
|
||||
Method method = TestService.class.getMethod("mapMethod", Map.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Message<String> message = MessageBuilder.withPayload("test")
|
||||
.setHeader("attrib1", new Integer(123))
|
||||
.setHeader("attrib2", new Integer(456)).build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
Map<String, Object> result = (Map<String, Object>) args[0];
|
||||
assertEquals(new Integer(123), result.get("attrib1"));
|
||||
assertEquals(new Integer(456), result.get("attrib2"));
|
||||
@@ -145,16 +145,16 @@ public class MessageMappingParameterResolverTests {
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testMapMethodWithMapPayload() throws Exception {
|
||||
public void fromMessageWithMapMethodAndMapPayload() throws Exception {
|
||||
Method method = TestService.class.getMethod("mapMethod", Map.class);
|
||||
MessageMappingParameterResolver resolver = new MessageMappingParameterResolver(method);
|
||||
MethodParameterMessageMapper mapper = new MethodParameterMessageMapper(method);
|
||||
Map<String, Integer> payload = new HashMap<String, Integer>();
|
||||
payload.put("attrib1", new Integer(123));
|
||||
payload.put("attrib2", new Integer(456));
|
||||
Message<Map<String, Integer>> message = MessageBuilder.withPayload(payload)
|
||||
.setHeader("attrib1", new Integer(123))
|
||||
.setHeader("attrib2", new Integer(456)).build();
|
||||
Object[] args = resolver.resolveParameters(message);
|
||||
Object[] args = mapper.fromMessage(message);
|
||||
Map<String, Integer> result = (Map<String, Integer>) args[0];
|
||||
assertEquals(2, result.size());
|
||||
assertEquals(new Integer(123), result.get("attrib1"));
|
||||
Reference in New Issue
Block a user