diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/TransformerFactoryBean.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/TransformerFactoryBean.java new file mode 100644 index 0000000000..072ad2be4e --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/TransformerFactoryBean.java @@ -0,0 +1,49 @@ +/* + * 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.config; + +import org.springframework.integration.message.MessageHandler; +import org.springframework.integration.transformer.MessageTransformingHandler; +import org.springframework.integration.transformer.MethodInvokingTransformer; +import org.springframework.integration.transformer.Transformer; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Factory bean for creating a Message Transformer. + * + * @author Mark Fisher + */ +public class TransformerFactoryBean extends AbstractMessageHandlerFactoryBean { + + @Override + protected MessageHandler createHandler(Object targetObject, String targetMethodName) { + Assert.notNull(targetObject, "targetObject must not be null"); + Transformer transformer = null; + if (targetObject instanceof Transformer) { + transformer = (Transformer) targetObject; + } + else if (StringUtils.hasText(targetMethodName)) { + transformer = new MethodInvokingTransformer(targetObject, targetMethodName); + } + else { + transformer = new MethodInvokingTransformer(targetObject); + } + return new MessageTransformingHandler(transformer); + } + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java index fe557bfdce..7758f98299 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/TransformerParser.java @@ -19,7 +19,6 @@ package org.springframework.integration.config.xml; import org.w3c.dom.Element; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; @@ -30,32 +29,21 @@ import org.springframework.util.StringUtils; */ public class TransformerParser extends AbstractConsumerEndpointParser { - private final static String TRANSFORMER_PACKAGE = IntegrationNamespaceUtils.BASE_PACKAGE + ".transformer"; - - @Override protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( - TRANSFORMER_PACKAGE + ".MessageTransformingHandler"); - builder.addConstructorArgReference(this.parseTransformer(element, parserContext)); + IntegrationNamespaceUtils.BASE_PACKAGE + ".config.TransformerFactoryBean"); + String ref = element.getAttribute(REF_ATTRIBUTE); + if (!StringUtils.hasText(ref)) { + parserContext.getReaderContext().error("The 'ref' attribute is required.", element); + return null; + } + builder.addPropertyReference("targetObject", ref); + String method = element.getAttribute(METHOD_ATTRIBUTE); + if (StringUtils.hasText(method)) { + builder.addPropertyValue("targetMethodName", method); + } return builder; } - private String parseTransformer(Element element, ParserContext parserContext) { - String ref = element.getAttribute("ref"); - if (!StringUtils.hasText(ref)) { - parserContext.getReaderContext().error("The 'ref' attribute is required.", element); - } - String method = element.getAttribute("method"); - if (!StringUtils.hasText(method)) { - return ref; - } - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( - TRANSFORMER_PACKAGE + ".MethodInvokingTransformer"); - builder.addConstructorArgReference(ref); - builder.addConstructorArgValue(method); - return BeanDefinitionReaderUtils.registerWithGeneratedName( - builder.getBeanDefinition(), parserContext.getRegistry()); - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java index c703b80138..ec68562372 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java @@ -41,6 +41,11 @@ public class MethodInvokingTransformer implements Transformer { this.invoker = new MessageMappingMethodInvoker(object, methodName); } + public MethodInvokingTransformer(Object object) { + this.invoker = new MessageMappingMethodInvoker(object, + org.springframework.integration.annotation.Transformer.class); + } + public Message transform(Message message) { Object result = this.invoker.invokeMethod(message);