diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/TransformerMessageHandlerAdapter.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformer.java similarity index 61% rename from org.springframework.integration/src/main/java/org/springframework/integration/transformer/TransformerMessageHandlerAdapter.java rename to org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformer.java index 17bfb0c4ab..c662d0f766 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/TransformerMessageHandlerAdapter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformer.java @@ -16,24 +16,15 @@ package org.springframework.integration.transformer; -import org.springframework.integration.handler.MessageHandler; -import org.springframework.integration.message.Message; +import org.springframework.integration.util.AbstractMethodInvokingAdapter; /** * @author Mark Fisher */ -public class TransformerMessageHandlerAdapter implements MessageHandler { +public class MethodInvokingPayloadTransformer extends AbstractMethodInvokingAdapter implements PayloadTransformer { - private final MessageTransformer transformer; - - - public TransformerMessageHandlerAdapter(MessageTransformer transformer) { - this.transformer = transformer; - } - - - public Message handle(Message message) { - return this.transformer.transform(message); + public Object transform(Object payload) throws Exception { + return this.invokeMethod(payload); } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformer.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformer.java new file mode 100644 index 0000000000..a31fea3007 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformer.java @@ -0,0 +1,26 @@ +/* + * 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.transformer; + +/** + * @author Mark Fisher + */ +public interface PayloadTransformer { + + U transform(T payload) throws Exception; + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformerAdapter.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformingMessageHandler.java similarity index 67% rename from org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformerAdapter.java rename to org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformingMessageHandler.java index cda984aafc..183507911c 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformerAdapter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/PayloadTransformingMessageHandler.java @@ -16,20 +16,30 @@ package org.springframework.integration.transformer; +import org.springframework.integration.handler.MessageHandler; import org.springframework.integration.message.Message; import org.springframework.integration.message.MessageBuilder; import org.springframework.integration.message.MessagingException; -import org.springframework.integration.util.AbstractMethodInvokingAdapter; +import org.springframework.util.Assert; /** * @author Mark Fisher */ -public class PayloadTransformerAdapter extends AbstractMethodInvokingAdapter implements MessageTransformer { +@SuppressWarnings("unchecked") +public class PayloadTransformingMessageHandler implements MessageHandler { - @SuppressWarnings("unchecked") - public Message transform(Message message) { + private final PayloadTransformer transformer; + + + public PayloadTransformingMessageHandler(PayloadTransformer transformer) { + Assert.notNull(transformer, "transformer must not be null"); + this.transformer = transformer; + } + + + public Message handle(Message message) { try { - Object result = this.invokeMethod(message.getPayload()); + Object result = this.transformer.transform(message.getPayload()); return MessageBuilder.fromPayload(result).copyHeaders(message.getHeaders()).build(); } catch (Exception e) { throw new MessagingException(message, "failed to transform message payload", e); diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformerTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformerTests.java new file mode 100644 index 0000000000..f81e5bc861 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/transformer/MethodInvokingPayloadTransformerTests.java @@ -0,0 +1,62 @@ +/* + * 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.transformer; + +import static org.junit.Assert.assertEquals; + +import java.util.Date; + +import org.junit.Test; + +/** + * @author Mark Fisher + */ +public class MethodInvokingPayloadTransformerTests { + + @Test + public void testSimpleMethod() throws Exception { + MethodInvokingPayloadTransformer transformer = new MethodInvokingPayloadTransformer(); + transformer.setObject(new TestBean()); + transformer.setMethodName("exclaim"); + assertEquals("FOO!", transformer.transform("foo")); + } + + @Test + public void testTypeConversion() throws Exception { + MethodInvokingPayloadTransformer transformer = new MethodInvokingPayloadTransformer(); + transformer.setObject(new TestBean()); + transformer.setMethodName("exclaim"); + assertEquals("123!", transformer.transform(123)); + } + + @Test(expected=NoSuchMethodException.class) + public void testTypeConversionFailure() throws Exception { + MethodInvokingPayloadTransformer transformer = new MethodInvokingPayloadTransformer(); + transformer.setObject(new TestBean()); + transformer.setMethodName("exclaim"); + transformer.transform(new Date()); + } + + + private static class TestBean { + + String exclaim(String input) { + return input.toUpperCase() + "!"; + } + } + +} diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformerAdapterTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformingMessageHandlerTests.java similarity index 54% rename from org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformerAdapterTests.java rename to org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformingMessageHandlerTests.java index aa5d02eef5..ce8b2d9c0f 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformerAdapterTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/transformer/PayloadTransformingMessageHandlerTests.java @@ -30,42 +30,41 @@ import org.springframework.integration.message.StringMessage; /** * @author Mark Fisher */ -public class PayloadTransformerAdapterTests { +public class PayloadTransformingMessageHandlerTests { @Test - public void testSimpleMethod() { - PayloadTransformerAdapter adapter = new PayloadTransformerAdapter(); - adapter.setObject(new TestBean()); - adapter.setMethodName("exclaim"); + public void testSuccessfulTransformation() { + PayloadTransformingMessageHandler handler = new PayloadTransformingMessageHandler( + new TestPayloadTransformer()); Message message = new StringMessage("foo"); - Message result = adapter.transform(message); - assertEquals("FOO!", result.getPayload()); - } - - @Test - public void testTypeConversion() { - PayloadTransformerAdapter adapter = new PayloadTransformerAdapter(); - adapter.setObject(new TestBean()); - adapter.setMethodName("exclaim"); - Message message = new GenericMessage(123); - Message result = adapter.transform(message); - assertEquals("123!", result.getPayload()); + Message result = handler.handle(message); + assertEquals(3, result.getPayload()); } @Test(expected=MessagingException.class) - public void testTypeConversionFailure() { - PayloadTransformerAdapter adapter = new PayloadTransformerAdapter(); - adapter.setObject(new TestBean()); - adapter.setMethodName("exclaim"); + public void testExceptionThrownByTransformer() { + PayloadTransformingMessageHandler handler = new PayloadTransformingMessageHandler( + new TestPayloadTransformer()); + Message message = new StringMessage("bad"); + handler.handle(message); + } + + @Test(expected=MessagingException.class) + public void testWrongPayloadType() { + PayloadTransformingMessageHandler handler = new PayloadTransformingMessageHandler( + new TestPayloadTransformer()); Message message = new GenericMessage(new Date()); - adapter.transform(message); + handler.handle(message); } - private static class TestBean { + private static class TestPayloadTransformer implements PayloadTransformer { - String exclaim(String input) { - return input.toUpperCase() + "!"; + public Integer transform(String s) throws Exception { + if (s.equals("bad")) { + throw new Exception("bad input!"); + } + return s.length(); } }