diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java index 9cce696bb6..422c95b2b5 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java @@ -16,25 +16,27 @@ package org.springframework.integration.xml.config; +import org.w3c.dom.Element; + import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.transformer.AbstractPayloadTransformer; -import org.springframework.integration.transformer.config.AbstractPayloadTransformerParser; +import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.transformer.config.AbstractTransformerParser; import org.springframework.integration.xml.transformer.XmlPayloadMarshallingTransformer; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import org.w3c.dom.Element; /** * @author Jonas Partner * @author Mark Fisher */ -public class XmlMarshallingTransformerParser extends AbstractPayloadTransformerParser { +public class XmlMarshallingTransformerParser extends AbstractTransformerParser { private ResultFactoryResultTypeHelper resultFactoryHelper = new ResultFactoryResultTypeHelper(); + @Override - protected Class extends AbstractPayloadTransformer, ?>> getTransformerClass() { + protected Class extends Transformer> getTransformerClass() { return XmlPayloadMarshallingTransformer.class; } @@ -45,7 +47,6 @@ public class XmlMarshallingTransformerParser extends AbstractPayloadTransformerP String marshaller = element.getAttribute("marshaller"); String resultTransformer = element.getAttribute("result-transformer"); Assert.hasText(marshaller, "the 'marshaller' attribute is required"); - builder.addConstructorArgReference(marshaller); if (StringUtils.hasText(resultTransformer)) { builder.addConstructorArgReference(resultTransformer); diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParser.java index 1fe5cc457f..e2f681b5b0 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParser.java @@ -20,8 +20,8 @@ import org.w3c.dom.Element; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.transformer.AbstractPayloadTransformer; -import org.springframework.integration.transformer.config.AbstractPayloadTransformerParser; +import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.transformer.config.AbstractTransformerParser; import org.springframework.integration.xml.transformer.XmlPayloadUnmarshallingTransformer; import org.springframework.util.Assert; @@ -29,10 +29,10 @@ import org.springframework.util.Assert; * @author Jonas Partner * @author Mark Fisher */ -public class XmlUnmarshallingTransformerParser extends AbstractPayloadTransformerParser { +public class XmlUnmarshallingTransformerParser extends AbstractTransformerParser { @Override - protected Class extends AbstractPayloadTransformer, ?>> getTransformerClass() { + protected Class extends Transformer> getTransformerClass() { return XmlPayloadUnmarshallingTransformer.class; } diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java index 22a2aaecc9..4c26bb6ac1 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java @@ -16,25 +16,27 @@ package org.springframework.integration.xml.config; +import org.w3c.dom.Element; + import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.transformer.AbstractPayloadTransformer; -import org.springframework.integration.transformer.config.AbstractPayloadTransformerParser; +import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.transformer.config.AbstractTransformerParser; import org.springframework.integration.xml.transformer.XsltPayloadTransformer; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import org.w3c.dom.Element; /** * @author Jonas Partner * @author Mark Fisher */ -public class XsltPayloadTransformerParser extends AbstractPayloadTransformerParser { +public class XsltPayloadTransformerParser extends AbstractTransformerParser { private ResultFactoryResultTypeHelper resultFactoryHelper = new ResultFactoryResultTypeHelper(); + @Override - protected Class extends AbstractPayloadTransformer, ?>> getTransformerClass() { + protected Class extends Transformer> getTransformerClass() { return XsltPayloadTransformer.class; } @@ -45,7 +47,6 @@ public class XsltPayloadTransformerParser extends AbstractPayloadTransformerPars String resultTransformer = element.getAttribute("result-transformer"); String resultFactory = element.getAttribute("result-factory"); String resultType = element.getAttribute("result-type"); - boolean bothHaveText = StringUtils.hasText(xslResource) && StringUtils.hasText(xslTemplates); boolean oneHasText = StringUtils.hasText(xslResource) || StringUtils.hasText(xslTemplates); Assert.state(!bothHaveText && oneHasText, "Exactly one of 'xsl-resource' or 'xsl-templates' is required."); @@ -61,7 +62,6 @@ public class XsltPayloadTransformerParser extends AbstractPayloadTransformerPars } resultFactoryHelper.assertResultFactoryAndTypeValid(resultFactory, resultType); resultFactoryHelper.addResultFactory(builder, resultType, resultFactory); - if (StringUtils.hasText(resultTransformer)) { builder.addConstructorArgReference(resultTransformer); } diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd index fa9f309c02..1342c3b4c0 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd @@ -22,18 +22,21 @@ Defines an XML marshalling transformer. - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -44,8 +47,11 @@ Defines an XML unmarshalling transformer. - - + + + + + @@ -56,20 +62,23 @@ Defines an XSLT transformer. - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -87,4 +96,10 @@ + + + + + + \ No newline at end of file diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests-context.xml b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests-context.xml index 3b19d40cd2..b415169098 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests-context.xml +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests-context.xml @@ -1,30 +1,54 @@ - + + + + + + + + + + + + + input-channel="marshallingTransformerWithResultTransformer" + output-channel="output" + marshaller="marshaller" + result-transformer="resultTransformer" /> diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests.java index 7e4d102bb8..28ec59ff8c 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParserTests.java @@ -20,38 +20,44 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.sax.SAXResult; import org.junit.Before; import org.junit.Test; +import org.w3c.dom.Document; + import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.channel.MessageChannel; +import org.springframework.integration.channel.PollableChannel; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.Message; -import org.springframework.integration.transformer.Transformer; import org.springframework.integration.xml.config.StubResultFactory.StubStringResult; import org.springframework.xml.transform.StringResult; -import org.w3c.dom.Document; /** * @author Jonas Partner + * @author Mark Fisher */ public class XmlMarshallingTransformerParserTests { private ApplicationContext appContext; + private PollableChannel output; + @Before public void setUp() { this.appContext = new ClassPathXmlApplicationContext("XmlMarshallingTransformerParserTests-context.xml", getClass()); + this.output = (PollableChannel) appContext.getBean("output"); } @Test public void testDefault() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("marshallingTransformerNoResultFactory"); + MessageChannel input = (MessageChannel) appContext.getBean("marshallingTransformerNoResultFactory"); GenericMessage message = new GenericMessage("hello"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Wrong payload type", result.getPayload() instanceof DOMResult); Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); assertEquals("Wrong palyoad", "hello", doc.getDocumentElement().getTextContent()); @@ -59,9 +65,10 @@ public class XmlMarshallingTransformerParserTests { @Test public void testDefaultWithResultTransformer() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("marshallingTransformerWithResultTransformer"); + MessageChannel input = (MessageChannel) appContext.getBean("marshallingTransformerWithResultTransformer"); GenericMessage message = new GenericMessage("hello"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Wrong payload type", result.getPayload() instanceof String); String resultPayload = (String)result.getPayload(); assertEquals("Wrong palyoad", "testReturn", resultPayload); @@ -69,9 +76,10 @@ public class XmlMarshallingTransformerParserTests { @Test public void testDOMResult() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("marshallingTransformerDOMResultFactory"); + MessageChannel input = (MessageChannel) appContext.getBean("marshallingTransformerDOMResultFactory"); GenericMessage message = new GenericMessage("hello"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Wrong payload type ", result.getPayload() instanceof DOMResult); Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); assertEquals("Wrong palyoad", "hello", doc.getDocumentElement().getTextContent()); @@ -79,17 +87,19 @@ public class XmlMarshallingTransformerParserTests { @Test public void testStringResult() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("marshallingTransformerStringResultFactory"); + MessageChannel input = (MessageChannel) appContext.getBean("marshallingTransformerStringResultFactory"); GenericMessage message = new GenericMessage("hello"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Wrong payload type", result.getPayload() instanceof StringResult); } @Test public void testCustomResultFactory() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("marshallingTransformerCustomResultFactory"); + MessageChannel input = (MessageChannel) appContext.getBean("marshallingTransformerCustomResultFactory"); GenericMessage message = new GenericMessage("hello"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Wrong payload type", result.getPayload() instanceof StubStringResult); } diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests-context.xml b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests-context.xml index 9b37e65f9a..aadd4377dd 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests-context.xml +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests-context.xml @@ -1,14 +1,28 @@ + http://www.springframework.org/schema/integration/xml/spring-integration-xml-1.0.xsd + http://www.springframework.org/schema/integration + http://www.springframework.org/schema/integration/spring-integration-1.0.xsd"> - + - + + + + + + + + + diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests.java index fc73a9865a..dbae6b2b09 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XmlUnmarshallingTransformerParserTests.java @@ -26,15 +26,17 @@ import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.channel.MessageChannel; +import org.springframework.integration.channel.PollableChannel; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.Message; import org.springframework.integration.message.MessagingException; -import org.springframework.integration.transformer.Transformer; import org.springframework.integration.xml.util.XmlTestUtil; import org.springframework.xml.transform.StringSource; /** * @author Jonas Partner + * @author Mark Fisher */ public class XmlUnmarshallingTransformerParserTests { @@ -45,49 +47,54 @@ public class XmlUnmarshallingTransformerParserTests { @Before public void setUp() { - appContext = new ClassPathXmlApplicationContext("XmlUnmarshallingTransformerParserTests-context.xml", - getClass()); + appContext = new ClassPathXmlApplicationContext( + "XmlUnmarshallingTransformerParserTests-context.xml", this.getClass()); unmarshaller = (StubUnmarshaller) appContext.getBean("unmarshaller"); } @Test public void testDefaultUnmarshall() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("defaultUnmarshaller"); + MessageChannel input = (MessageChannel) appContext.getBean("input"); + PollableChannel output = (PollableChannel) appContext.getBean("output"); GenericMessage message = new GenericMessage(new StringSource( "test")); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertEquals("Wrong payload after unmarshalling", "unmarshalled", result.getPayload()); assertTrue("Wrong source passed to unmarshaller", unmarshaller.sourcesPassed.poll() instanceof StringSource); } @Test public void testUnmarshallString() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("defaultUnmarshaller"); + MessageChannel input = (MessageChannel) appContext.getBean("input"); + PollableChannel output = (PollableChannel) appContext.getBean("output"); GenericMessage message = new GenericMessage( "test"); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertEquals("Wrong payload after unmarshalling", "unmarshalled", result.getPayload()); assertTrue("Wrong source passed to unmarshaller", unmarshaller.sourcesPassed.poll() instanceof StringSource); } @Test public void testUnmarshallDocument() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("defaultUnmarshaller"); + MessageChannel input = (MessageChannel) appContext.getBean("input"); + PollableChannel output = (PollableChannel) appContext.getBean("output"); GenericMessage message = new GenericMessage( - XmlTestUtil - .getDocumentForString("test")); - Message> result = transformer.transform(message); + XmlTestUtil.getDocumentForString("test")); + input.send(message); + Message> result = output.receive(0); assertEquals("Wrong payload after unmarshalling", "unmarshalled", result.getPayload()); assertTrue("Wrong source passed to unmarshaller", unmarshaller.sourcesPassed.poll() instanceof DOMSource); } @Test(expected = MessagingException.class) public void testUnmarshallUnsupported() throws Exception { - Transformer transformer = (Transformer) appContext.getBean("defaultUnmarshaller"); + MessageChannel input = (MessageChannel) appContext.getBean("input"); GenericMessage message = new GenericMessage(new StringBuffer( "test")); - transformer.transform(message); + input.send(message); } } diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml index 2d027bacdd..6070c9368c 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml @@ -1,32 +1,59 @@ + + + + + + + + input-channel="withResourceIn" + output-channel="output" + xsl-resource="org/springframework/integration/xml/config/test.xsl"/> + + input-channel="withTemplatesIn" + output-channel="output" + xsl-templates="templates"/> + + input-channel="withTemplatesAndResultTransformerIn" + output-channel="output" + xsl-templates="templates" + result-transformer="resultTransformer"/> + + input-channel="withTemplatesAndResultFactoryIn" + output-channel="output" + xsl-templates="templates" + result-factory="stubResultFactory"/> - + + - + - + diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java index 7d6d907655..b7435b161e 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java @@ -23,20 +23,21 @@ import javax.xml.transform.dom.DOMResult; import org.junit.Before; import org.junit.Test; - import org.w3c.dom.Document; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.channel.MessageChannel; +import org.springframework.integration.channel.PollableChannel; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.Message; -import org.springframework.integration.transformer.Transformer; import org.springframework.integration.xml.config.StubResultFactory.StubStringResult; import org.springframework.integration.xml.util.XmlTestUtil; import org.springframework.xml.transform.StringResult; /** * @author Jonas Partner + * @author Mark Fisher */ public class XsltPayloadTransformerParserTests { @@ -44,19 +45,22 @@ public class XsltPayloadTransformerParserTests { private ApplicationContext applicationContext; + private PollableChannel output; + @Before public void setUp() { applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); + output = (PollableChannel) applicationContext.getBean("output"); } @Test public void testWithResourceProvided() throws Exception { - Transformer transformer = (Transformer) applicationContext - .getBean("xsltTransformerWithResource"); + MessageChannel input = (MessageChannel) applicationContext.getBean("withResourceIn"); GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); @@ -64,10 +68,10 @@ public class XsltPayloadTransformerParserTests { @Test public void testWithTemplatesProvided() throws Exception { - Transformer transformer = (Transformer) applicationContext - .getBean("xsltTransformerWithTemplates"); + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesIn"); GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); @@ -75,30 +79,30 @@ public class XsltPayloadTransformerParserTests { @Test public void testWithTemplatesAndResultTransformer() throws Exception { - Transformer transformer = (Transformer) applicationContext - .getBean("xsltTransformerWithTemplatesAndResultTransformer"); + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultTransformerIn"); GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertEquals("Wrong payload type", String.class, result.getPayload().getClass()); String strResult = (String)result.getPayload(); assertEquals("Wrong payload", "testReturn", strResult); } - + @Test public void testWithResourceProvidedndStubResultFactory() throws Exception { - Transformer transformer = (Transformer) applicationContext - .getBean("xsltTransformerWithTemplatesAndResultFactory"); + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultFactoryIn"); GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); } - + @Test public void testWithResourceAndStringResultType() throws Exception { - Transformer transformer = (Transformer) applicationContext - .getBean("xsltTransformerWithTemplatesAndStringResulType"); + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndStringResultTypeIn"); GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - Message> result = transformer.transform(message); + input.send(message); + Message> result = output.receive(0); assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractEndpointParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractEndpointParser.java index a4e4c11f6e..a00f143a42 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractEndpointParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractEndpointParser.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.ConfigurationException; import org.springframework.integration.endpoint.MessageEndpoint; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -54,8 +55,18 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio private static final String INTERCEPTORS_ELEMENT = "interceptors"; + /** + * Subclasses may override this method to specify whether the endpoint type + * expects a "ref" (and possibly a "method") in order to adapt an Object. + * + * The default is true. + */ + protected boolean requiresBeanReference() { + return true; + } + @Override - protected Class> getBeanClass(Element element) { + protected final Class> getBeanClass(Element element) { return this.getEndpointClass(); } @@ -71,17 +82,19 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String ref = element.getAttribute(REF_ATTRIBUTE); - if (!StringUtils.hasText(ref)) { - throw new ConfigurationException("The '" + REF_ATTRIBUTE + "' attribute is required."); - } - if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) { - String method = element.getAttribute(METHOD_ATTRIBUTE); - String adapterBeanName = this.parseAdapter(ref, method, element, parserContext); - builder.addConstructorArgReference(adapterBeanName); - } - else { - builder.addConstructorArgReference(ref); + if (this.requiresBeanReference()) { + String ref = element.getAttribute(REF_ATTRIBUTE); + if (!StringUtils.hasText(ref)) { + throw new ConfigurationException("The '" + REF_ATTRIBUTE + "' attribute is required."); + } + if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) { + String method = element.getAttribute(METHOD_ATTRIBUTE); + String adapterBeanName = this.parseAdapter(ref, method, element, parserContext); + builder.addConstructorArgReference(adapterBeanName); + } + else { + builder.addConstructorArgReference(ref); + } } String inputChannel = element.getAttribute(INPUT_CHANNEL_ATTRIBUTE); if (!StringUtils.hasText(inputChannel)) { @@ -110,10 +123,14 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio } private String parseAdapter(String ref, String method, Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(this.getMethodInvokingAdapterClass()); + Class> adapterClass = this.getMethodInvokingAdapterClass(); + Assert.state(adapterClass != null, + "Parser needs to create an adapter but 'getMethodInvokingAdapterClass()' returned null."); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(adapterClass); builder.addConstructorArgReference(ref); builder.addConstructorArgValue(method); - String adapterBeanName = BeanDefinitionReaderUtils.generateBeanName(builder.getBeanDefinition(), parserContext.getRegistry()); + String adapterBeanName = BeanDefinitionReaderUtils.generateBeanName( + builder.getBeanDefinition(), parserContext.getRegistry()); BeanDefinitionHolder holder = new BeanDefinitionHolder(builder.getBeanDefinition(), adapterBeanName); parserContext.registerBeanComponent(new BeanComponentDefinition(holder)); return adapterBeanName; @@ -125,8 +142,14 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio protected void postProcess(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { } + /** + * Subclasses must override this if the adapted object is created from + * the "ref" and "method" attribute values. + */ + protected Class> getMethodInvokingAdapterClass() { + return null; + } + protected abstract Class extends MessageEndpoint> getEndpointClass(); - protected abstract Class> getMethodInvokingAdapterClass(); - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java deleted file mode 100644 index 4376b87ea0..0000000000 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.config; - -import org.w3c.dom.Element; - -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.transformer.AbstractPayloadTransformer; - -/** - * @author Mark Fisher - */ -public abstract class AbstractPayloadTransformerParser extends AbstractSingleBeanDefinitionParser { - - @Override - protected boolean shouldGenerateId() { - return false; - } - - @Override - protected boolean shouldGenerateIdAsFallback() { - return true; - } - - @Override - protected Class> getBeanClass(Element element) { - return this.getTransformerClass(); - } - - @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - this.parsePayloadTransformer(element, parserContext, builder); - } - - protected abstract Class extends AbstractPayloadTransformer, ?>> getTransformerClass(); - - protected abstract void parsePayloadTransformer(Element element, ParserContext parserContext, BeanDefinitionBuilder builder); - -} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java new file mode 100644 index 0000000000..0f42e90345 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java @@ -0,0 +1,58 @@ +/* + * 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.config; + +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.integration.config.AbstractEndpointParser; +import org.springframework.integration.endpoint.MessageEndpoint; +import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.transformer.TransformerEndpoint; + +/** + * @author Mark Fisher + */ +public abstract class AbstractTransformerParser extends AbstractEndpointParser { + + @Override + protected boolean requiresBeanReference() { + return false; + } + + @Override + protected Class extends MessageEndpoint> getEndpointClass() { + return TransformerEndpoint.class; + } + + @Override + protected void postProcess(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + BeanDefinitionBuilder transformerBuilder = + BeanDefinitionBuilder.genericBeanDefinition(this.getTransformerClass()); + this.parsePayloadTransformer(element, parserContext, transformerBuilder); + String transformerBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName( + transformerBuilder.getBeanDefinition(), parserContext.getRegistry()); + builder.addConstructorArgReference(transformerBeanName); + } + + protected abstract Class extends Transformer> getTransformerClass(); + + protected abstract void parsePayloadTransformer(Element element, ParserContext parserContext, BeanDefinitionBuilder builder); + +}
The default is true. + */ + protected boolean requiresBeanReference() { + return true; + } + @Override - protected Class> getBeanClass(Element element) { + protected final Class> getBeanClass(Element element) { return this.getEndpointClass(); } @@ -71,17 +82,19 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String ref = element.getAttribute(REF_ATTRIBUTE); - if (!StringUtils.hasText(ref)) { - throw new ConfigurationException("The '" + REF_ATTRIBUTE + "' attribute is required."); - } - if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) { - String method = element.getAttribute(METHOD_ATTRIBUTE); - String adapterBeanName = this.parseAdapter(ref, method, element, parserContext); - builder.addConstructorArgReference(adapterBeanName); - } - else { - builder.addConstructorArgReference(ref); + if (this.requiresBeanReference()) { + String ref = element.getAttribute(REF_ATTRIBUTE); + if (!StringUtils.hasText(ref)) { + throw new ConfigurationException("The '" + REF_ATTRIBUTE + "' attribute is required."); + } + if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) { + String method = element.getAttribute(METHOD_ATTRIBUTE); + String adapterBeanName = this.parseAdapter(ref, method, element, parserContext); + builder.addConstructorArgReference(adapterBeanName); + } + else { + builder.addConstructorArgReference(ref); + } } String inputChannel = element.getAttribute(INPUT_CHANNEL_ATTRIBUTE); if (!StringUtils.hasText(inputChannel)) { @@ -110,10 +123,14 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio } private String parseAdapter(String ref, String method, Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(this.getMethodInvokingAdapterClass()); + Class> adapterClass = this.getMethodInvokingAdapterClass(); + Assert.state(adapterClass != null, + "Parser needs to create an adapter but 'getMethodInvokingAdapterClass()' returned null."); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(adapterClass); builder.addConstructorArgReference(ref); builder.addConstructorArgValue(method); - String adapterBeanName = BeanDefinitionReaderUtils.generateBeanName(builder.getBeanDefinition(), parserContext.getRegistry()); + String adapterBeanName = BeanDefinitionReaderUtils.generateBeanName( + builder.getBeanDefinition(), parserContext.getRegistry()); BeanDefinitionHolder holder = new BeanDefinitionHolder(builder.getBeanDefinition(), adapterBeanName); parserContext.registerBeanComponent(new BeanComponentDefinition(holder)); return adapterBeanName; @@ -125,8 +142,14 @@ public abstract class AbstractEndpointParser extends AbstractSingleBeanDefinitio protected void postProcess(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { } + /** + * Subclasses must override this if the adapted object is created from + * the "ref" and "method" attribute values. + */ + protected Class> getMethodInvokingAdapterClass() { + return null; + } + protected abstract Class extends MessageEndpoint> getEndpointClass(); - protected abstract Class> getMethodInvokingAdapterClass(); - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java deleted file mode 100644 index 4376b87ea0..0000000000 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractPayloadTransformerParser.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.config; - -import org.w3c.dom.Element; - -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.transformer.AbstractPayloadTransformer; - -/** - * @author Mark Fisher - */ -public abstract class AbstractPayloadTransformerParser extends AbstractSingleBeanDefinitionParser { - - @Override - protected boolean shouldGenerateId() { - return false; - } - - @Override - protected boolean shouldGenerateIdAsFallback() { - return true; - } - - @Override - protected Class> getBeanClass(Element element) { - return this.getTransformerClass(); - } - - @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - this.parsePayloadTransformer(element, parserContext, builder); - } - - protected abstract Class extends AbstractPayloadTransformer, ?>> getTransformerClass(); - - protected abstract void parsePayloadTransformer(Element element, ParserContext parserContext, BeanDefinitionBuilder builder); - -} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java new file mode 100644 index 0000000000..0f42e90345 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/config/AbstractTransformerParser.java @@ -0,0 +1,58 @@ +/* + * 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.config; + +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.integration.config.AbstractEndpointParser; +import org.springframework.integration.endpoint.MessageEndpoint; +import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.transformer.TransformerEndpoint; + +/** + * @author Mark Fisher + */ +public abstract class AbstractTransformerParser extends AbstractEndpointParser { + + @Override + protected boolean requiresBeanReference() { + return false; + } + + @Override + protected Class extends MessageEndpoint> getEndpointClass() { + return TransformerEndpoint.class; + } + + @Override + protected void postProcess(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + BeanDefinitionBuilder transformerBuilder = + BeanDefinitionBuilder.genericBeanDefinition(this.getTransformerClass()); + this.parsePayloadTransformer(element, parserContext, transformerBuilder); + String transformerBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName( + transformerBuilder.getBeanDefinition(), parserContext.getRegistry()); + builder.addConstructorArgReference(transformerBeanName); + } + + protected abstract Class extends Transformer> getTransformerClass(); + + protected abstract void parsePayloadTransformer(Element element, ParserContext parserContext, BeanDefinitionBuilder builder); + +}