/*
* Copyright 2002-2014 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.transformer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.lang.reflect.Method;
import java.util.Properties;
import org.junit.Test;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.handler.MethodInvokingMessageProcessor;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandlingException;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.support.GenericMessage;
/**
* @author Mark Fisher
*/
public class MethodInvokingTransformerTests {
@Test
public void simplePayloadConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("exclaim", String.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<?> message = new GenericMessage<String>("foo");
Message<?> result = transformer.transform(message);
assertEquals("FOO!", result.getPayload());
}
@Test
public void simplePayloadConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "exclaim");
Message<?> message = new GenericMessage<String>("foo");
Message<?> result = transformer.transform(message);
assertEquals("FOO!", result.getPayload());
}
@Test
public void typeConversionConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("exclaim", String.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<?> message = new GenericMessage<Integer>(123);
Message<?> result = transformer.transform(message);
assertEquals("123!", result.getPayload());
}
@Test
public void typeConversionConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "exclaim");
Message<?> message = new GenericMessage<Integer>(123);
Message<?> result = transformer.transform(message);
assertEquals("123!", result.getPayload());
}
@Test(expected = MessageHandlingException.class)
public void typeConversionFailureConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("exclaim", String.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<?> message = new GenericMessage<TestBean>(new TestBean());
transformer.transform(message);
}
@Test(expected = MessageHandlingException.class)
public void typeConversionFailureConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "exclaim");
Message<?> message = new GenericMessage<TestBean>(new TestBean());
transformer.transform(message);
}
@Test
public void headerAnnotationConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("headerTest", String.class, Integer.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<String> message = MessageBuilder.withPayload("foo")
.setHeader("number", 123).build();
Message<?> result = transformer.transform(message);
assertEquals("foo123", result.getPayload());
}
@Test
public void headerAnnotationConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "headerTest");
Message<String> message = MessageBuilder.withPayload("foo")
.setHeader("number", 123).build();
Message<?> result = transformer.transform(message);
assertEquals("foo123", result.getPayload());
}
@Test(expected = MessageHandlingException.class)
public void headerValueNotProvided() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("headerTest", String.class, Integer.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<String> message = MessageBuilder.withPayload("foo")
.setHeader("wrong", 123).build();
transformer.transform(message);
}
@Test
public void optionalHeaderAnnotation() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("optionalHeaderTest", String.class, Integer.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<String> message = MessageBuilder.withPayload("foo").setHeader("number", 99).build();
Message<?> result = transformer.transform(message);
assertEquals("foo99", result.getPayload());
}
@Test
public void optionalHeaderValueNotProvided() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("optionalHeaderTest", String.class, Integer.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<String> message = MessageBuilder.withPayload("foo").build();
Message<?> result = transformer.transform(message);
assertEquals("foonull", result.getPayload());
}
@Test
public void messageReturnValueConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("messageReturnValueTest", Message.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Message<String> message = MessageBuilder.withPayload("test").build();
Message<?> result = transformer.transform(message);
assertEquals("test", result.getPayload());
}
@Test
public void messageReturnValueConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "messageReturnValueTest");
Message<String> message = MessageBuilder.withPayload("test").build();
Message<?> result = transformer.transform(message);
assertEquals("test", result.getPayload());
}
@Test
@SuppressWarnings("unchecked")
public void propertiesPayloadConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("propertyPayloadTest", Properties.class);
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, testMethod);
Properties props = new Properties();
props.setProperty("prop1", "bad");
props.setProperty("prop3", "baz");
Message<Properties> message = new GenericMessage<Properties>(props);
Message<Properties> result = (Message<Properties>) transformer.transform(message);
assertEquals(Properties.class, result.getPayload().getClass());
Properties payload = result.getPayload();
assertEquals("foo", payload.getProperty("prop1"));
assertEquals("bar", payload.getProperty("prop2"));
assertEquals("baz", payload.getProperty("prop3"));
assertNull(result.getHeaders().get("prop1"));
assertNull(result.getHeaders().get("prop2"));
assertNull(result.getHeaders().get("prop3"));
}
@Test
@SuppressWarnings("unchecked")
public void propertiesPayloadConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "propertyPayloadTest");
Properties props = new Properties();
props.setProperty("prop1", "bad");
props.setProperty("prop3", "baz");
Message<Properties> message = new GenericMessage<Properties>(props);
Message<Properties> result = (Message<Properties>) transformer.transform(message);
assertEquals(Properties.class, result.getPayload().getClass());
Properties payload = result.getPayload();
assertEquals("foo", payload.getProperty("prop1"));
assertEquals("bar", payload.getProperty("prop2"));
assertEquals("baz", payload.getProperty("prop3"));
assertNull(result.getHeaders().get("prop1"));
assertNull(result.getHeaders().get("prop2"));
assertNull(result.getHeaders().get("prop3"));
}
@Test
public void nullReturningMethod() {
TestBean testBean = new TestBean();
MethodInvokingTransformer transformer = new MethodInvokingTransformer(testBean, "nullReturnValueTest");
GenericMessage<String> message = new GenericMessage<String>("test");
Message<?> result = transformer.transform(message);
assertNull(result);
}
@SuppressWarnings({"rawtypes", "unchecked"})
@Test // this changed in 2.0 see INT-785 and INT-1130
public void headerEnricherConfiguredWithMethodReference() throws Exception {
TestBean testBean = new TestBean();
Method testMethod = testBean.getClass().getMethod("propertyEnricherTest", String.class);
HeaderEnricher transformer = new HeaderEnricher();
transformer.setDefaultOverwrite(true);
MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testBean, testMethod);
transformer.setMessageProcessor(processor);
Message<String> message = MessageBuilder.withPayload("test")
.setHeader("prop1", "bad")
.setHeader("prop3", "baz").build();
Message<?> result = transformer.transform(message);
assertEquals("test", result.getPayload());
assertEquals("foo", result.getHeaders().get("prop1"));
assertEquals("bar", result.getHeaders().get("prop2"));
assertEquals("baz", result.getHeaders().get("prop3"));
}
@SuppressWarnings({"rawtypes", "unchecked"})
@Test // this changed in 2.0 see INT-785 and INT-1130
public void headerEnricherConfiguredWithMethodName() throws Exception {
TestBean testBean = new TestBean();
HeaderEnricher transformer = new HeaderEnricher();
MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testBean, "propertyEnricherTest");
transformer.setMessageProcessor(processor);
transformer.setDefaultOverwrite(true);
Message<String> message = MessageBuilder.withPayload("test")
.setHeader("prop1", "bad")
.setHeader("prop3", "baz").build();
Message<?> result = transformer.transform(message);
assertEquals("test", result.getPayload());
assertEquals("foo", result.getHeaders().get("prop1"));
assertEquals("bar", result.getHeaders().get("prop2"));
assertEquals("baz", result.getHeaders().get("prop3"));
}
@SuppressWarnings("unused")
private static class TestBean {
TestBean() {
super();
}
@Transformer
public String exclaim(String s) {
return s.toUpperCase() + "!";
}
@Transformer
public String headerTest(String s, @Header("number") Integer num) {
return s + num;
}
@Transformer
public String optionalHeaderTest(String s, @Header(value = "number", required = false) Integer num) {
return s + num;
}
@Transformer
public Properties propertyEnricherTest(String s) {
Properties properties = new Properties();
properties.setProperty("prop1", "foo");
properties.setProperty("prop2", "bar");
return properties;
}
@Transformer
public Properties propertyPayloadTest(Properties properties) {
properties.setProperty("prop1", "foo");
properties.setProperty("prop2", "bar");
return properties;
}
public Message<?> messageReturnValueTest(Message<?> message) {
return message;
}
public Object nullReturnValueTest(Message<?> message) {
return null;
}
}
}