From 9d0089d51d7c89aceb784c208b8400d256da0682 Mon Sep 17 00:00:00 2001 From: David Liu Date: Mon, 4 Aug 2014 11:30:27 +0300 Subject: [PATCH] INT-3384: Rework JMS/XML Module XSD Enumerations JIRA: https://jira.spring.io/browse/INT-3384 Polishing --- .../jms/JmsDestinationPollingSource.java | 23 ++- .../jms/JmsMessageDrivenEndpoint.java | 20 +- .../integration/jms/JmsOutboundGateway.java | 36 +++- .../jms/config/JmsAdapterParserUtils.java | 50 ----- .../JmsInboundChannelAdapterParser.java | 1 + .../JmsMessageDrivenEndpointParser.java | 12 +- .../jms/config/JmsOutboundGatewayParser.java | 12 +- .../integration/jms/util/JmsAdapterUtils.java | 57 ++++++ .../jms/config/spring-integration-jms-4.1.xsd | 62 +++--- .../JmsInboundChannelAdapterTests-context.xml | 12 +- .../JmsOutboundInsideChainTests-context.xml | 3 +- .../GlobalChannelInterceptorTests-context.xml | 16 +- ...sOutboundGatewayWithDeliveryPersistent.xml | 17 +- .../config/MarshallingTransformerParser.java | 7 +- .../xml/config/XmlNamespaceUtils.java | 63 ------ .../XmlPayloadValidatingFilterParser.java | 8 +- .../config/XsltPayloadTransformerParser.java | 10 +- .../XmlValidatingMessageSelector.java | 35 +++- .../transformer/AbstractXmlTransformer.java | 106 ++++++++++ .../transformer/MarshallingTransformer.java | 15 +- .../transformer/XsltPayloadTransformer.java | 28 ++- .../xml/config/spring-integration-xml-4.1.xsd | 57 +++--- ...XPathHeaderEnricherParserTests-context.xml | 26 ++- .../XPathTransformerParserTests-context.xml | 26 ++- ...oadValidatingFilterParserTests-context.xml | 12 ++ ...XmlPayloadValidatingFilterParserTests.java | 19 +- ...tPayloadTransformerParserTests-context.xml | 29 ++- .../XsltPayloadTransformerParserTests.java | 181 +++++++++--------- ...ValidatingMessageSelectorTests-context.xml | 15 ++ .../XmlValidatingMessageSelectorTests.java | 39 ++-- ...axbMarshallingIntegrationTests-context.xml | 15 +- 31 files changed, 629 insertions(+), 383 deletions(-) create mode 100644 spring-integration-jms/src/main/java/org/springframework/integration/jms/util/JmsAdapterUtils.java delete mode 100644 spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlNamespaceUtils.java create mode 100644 spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java create mode 100644 spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests-context.xml diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java index 3ebc44bb72..3b7e67e256 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java @@ -22,6 +22,7 @@ import javax.jms.Destination; import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.integration.core.MessageSource; +import org.springframework.integration.jms.util.JmsAdapterUtils; import org.springframework.integration.support.AbstractIntegrationMessageBuilder; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.support.converter.MessageConverter; @@ -40,6 +41,7 @@ import org.springframework.util.Assert; */ public class JmsDestinationPollingSource extends IntegrationObjectSupport implements MessageSource { + private final JmsTemplate jmsTemplate; private volatile Destination destination; @@ -50,12 +52,12 @@ public class JmsDestinationPollingSource extends IntegrationObjectSupport implem private volatile JmsHeaderMapper headerMapper = new DefaultJmsHeaderMapper(); + private volatile String sessionAcknowledgeMode; public JmsDestinationPollingSource(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } - public void setDestination(Destination destination) { Assert.isNull(this.destinationName, "The 'destination' and 'destinationName' properties are mutually exclusive."); this.destination = destination; @@ -84,6 +86,10 @@ public class JmsDestinationPollingSource extends IntegrationObjectSupport implem this.headerMapper = headerMapper; } + public void setSessionAcknowledgeMode(String sessionAcknowledgeMode) { + this.sessionAcknowledgeMode = sessionAcknowledgeMode; + } + /** * Will receive a JMS {@link javax.jms.Message} converting and returning it as * a Spring Integration {@link Message}. This method will also use the current @@ -127,4 +133,19 @@ public class JmsDestinationPollingSource extends IntegrationObjectSupport implem return jmsMessage; } + @Override + protected void onInit() { + if (this.sessionAcknowledgeMode != null) { + Integer acknowledgeMode = JmsAdapterUtils.parseAcknowledgeMode(this.sessionAcknowledgeMode); + if (acknowledgeMode != null) { + if (JmsAdapterUtils.SESSION_TRANSACTED == acknowledgeMode) { + this.jmsTemplate.setSessionTransacted(true); + } + else { + this.jmsTemplate.setSessionAcknowledgeMode(acknowledgeMode); + } + } + } + } + } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsMessageDrivenEndpoint.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsMessageDrivenEndpoint.java index 00108de53f..6aeb9d4598 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsMessageDrivenEndpoint.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsMessageDrivenEndpoint.java @@ -19,6 +19,7 @@ package org.springframework.integration.jms; import org.springframework.beans.factory.DisposableBean; import org.springframework.integration.context.OrderlyShutdownCapable; import org.springframework.integration.endpoint.AbstractEndpoint; +import org.springframework.integration.jms.util.JmsAdapterUtils; import org.springframework.jms.listener.AbstractMessageListenerContainer; import org.springframework.util.Assert; @@ -35,8 +36,9 @@ public class JmsMessageDrivenEndpoint extends AbstractEndpoint implements Dispos private final AbstractMessageListenerContainer listenerContainer; private final ChannelPublishingJmsMessageListener listener; - - + + private volatile String sessionAcknowledgeMode; + public JmsMessageDrivenEndpoint(AbstractMessageListenerContainer listenerContainer, ChannelPublishingJmsMessageListener listener) { Assert.notNull(listenerContainer, "listener container must not be null"); @@ -51,7 +53,10 @@ public class JmsMessageDrivenEndpoint extends AbstractEndpoint implements Dispos setPhase(Integer.MAX_VALUE / 2); } - + public void setSessionAcknowledgeMode(String sessionAcknowledgeMode) { + this.sessionAcknowledgeMode = sessionAcknowledgeMode; + } + @Override public String getComponentType() { return "jms:message-driven-channel-adapter"; @@ -63,6 +68,15 @@ public class JmsMessageDrivenEndpoint extends AbstractEndpoint implements Dispos if (!this.listenerContainer.isActive()) { this.listenerContainer.afterPropertiesSet(); } + Integer acknowledgeMode = JmsAdapterUtils.parseAcknowledgeMode(this.sessionAcknowledgeMode); + if (acknowledgeMode != null) { + if (acknowledgeMode.intValue() == JmsAdapterUtils.SESSION_TRANSACTED) { + this.listenerContainer.setSessionTransacted(true); + } + else { + this.listenerContainer.setSessionAcknowledgeMode(acknowledgeMode); + } + } listener.setComponentName(this.getComponentName()); } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java index 3b723d9fa5..582602eedb 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java @@ -48,6 +48,7 @@ import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.integration.MessageTimeoutException; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor; +import org.springframework.integration.jms.util.JmsAdapterUtils; import org.springframework.jms.connection.ConnectionFactoryUtils; import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.support.JmsUtils; @@ -593,9 +594,28 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp if (this.replyContainerProperties.getRecoveryInterval() != null) { container.setRecoveryInterval(this.replyContainerProperties.getRecoveryInterval()); } - if (this.replyContainerProperties.getSessionAcknowledgeMode() != null) { - container.setSessionAcknowledgeMode(this.replyContainerProperties.getSessionAcknowledgeMode()); + if (StringUtils.hasText(this.replyContainerProperties.getSessionAcknowledgeModeName())) { + Integer acknowledgeMode = JmsAdapterUtils.parseAcknowledgeMode(this.replyContainerProperties.getSessionAcknowledgeModeName()); + if (acknowledgeMode != null) { + if (JmsAdapterUtils.SESSION_TRANSACTED == acknowledgeMode) { + container.setSessionTransacted(true); + } + else { + container.setSessionAcknowledgeMode(acknowledgeMode); + } + } } + else if (this.replyContainerProperties.getSessionAcknowledgeMode() != null) { + Integer sessionAcknowledgeMode = this.replyContainerProperties.getSessionAcknowledgeMode(); + if (Session.SESSION_TRANSACTED == sessionAcknowledgeMode) { + container.setSessionTransacted(true); + } + else { + container.setSessionAcknowledgeMode(sessionAcknowledgeMode); + } + + } + if (this.replyContainerProperties.getTaskExecutor() != null) { container.setTaskExecutor(this.replyContainerProperties.getTaskExecutor()); } @@ -610,6 +630,7 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp } } + @Override public void start() { synchronized (this.lifeCycleMonitor) { @@ -1209,11 +1230,12 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp } public static class ReplyContainerProperties { - private volatile Boolean sessionTransacted; private volatile Integer sessionAcknowledgeMode; + private volatile String sessionAcknowledgeModeName; + private volatile Long receiveTimeout; private volatile Long recoveryInterval; @@ -1232,6 +1254,14 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp private volatile Executor taskExecutor; + public String getSessionAcknowledgeModeName() { + return sessionAcknowledgeModeName; + } + + public void setSessionAcknowledgeModeName(String sessionAcknowledgeModeName) { + this.sessionAcknowledgeModeName = sessionAcknowledgeModeName; + } + public Boolean isSessionTransacted() { return sessionTransacted; } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java index b3f1e01546..6d2a272c50 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java @@ -17,7 +17,6 @@ package org.springframework.integration.jms.config; import org.w3c.dom.Element; - import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; @@ -68,21 +67,6 @@ abstract class JmsAdapterParserUtils { "receive-timeout", "session-transacted" }; - - /* - * The following constants match those of javax.jms.Session. - * They are duplicated here to avoid a dependency in tooling. - */ - - static final int SESSION_TRANSACTED = 0; - - private static final int AUTO_ACKNOWLEDGE = 1; - - private static final int CLIENT_ACKNOWLEDGE = 2; - - private static final int DUPS_OK_ACKNOWLEDGE = 3; - - static String determineConnectionFactoryBeanName(Element element, ParserContext parserContext) { String connectionFactoryBeanName = "connectionFactory"; if (element.hasAttribute(CONNECTION_FACTORY_ATTRIBUTE)) { @@ -95,30 +79,6 @@ abstract class JmsAdapterParserUtils { return connectionFactoryBeanName; } - static Integer parseAcknowledgeMode(Element element, ParserContext parserContext) { - String acknowledge = element.getAttribute("acknowledge"); - if (StringUtils.hasText(acknowledge)) { - int acknowledgeMode = AUTO_ACKNOWLEDGE; - if ("transacted".equals(acknowledge)) { - acknowledgeMode = SESSION_TRANSACTED; - } - else if ("dups-ok".equals(acknowledge)) { - acknowledgeMode = DUPS_OK_ACKNOWLEDGE; - } - else if ("client".equals(acknowledge)) { - acknowledgeMode = CLIENT_ACKNOWLEDGE; - } - else if (!"auto".equals(acknowledge)) { - parserContext.getReaderContext().error("Invalid JMS 'acknowledge' setting: " + - "only \"auto\", \"client\", \"dups-ok\" and \"transacted\" supported.", element); - } - return acknowledgeMode; - } - else { - return null; - } - } - static BeanDefinition parseJmsTemplateBeanDefinition(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(DynamicJmsTemplate.class); builder.addPropertyReference(JmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY, @@ -137,17 +97,7 @@ abstract class JmsAdapterParserUtils { else { builder.addPropertyValue("receiveTimeout", JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); } - Integer acknowledgeMode = parseAcknowledgeMode(element, parserContext); - if (acknowledgeMode != null) { - if (acknowledgeMode == SESSION_TRANSACTED) { - parserContext.getReaderContext().error( - "'transacted' is not a valid 'acknowledge-mode' here, use 'session-transacted'" + - " to enable transactions", element); - } - builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode); - } IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "session-transacted"); - return builder.getBeanDefinition(); } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java index de58758448..3831201933 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java @@ -64,6 +64,7 @@ public class JmsInboundChannelAdapterParser extends AbstractPollingInboundChanne else { builder.addConstructorArgValue(JmsAdapterParserUtils.parseJmsTemplateBeanDefinition(element, parserContext)); } + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "acknowledge", "sessionAcknowledgeMode"); if (hasDestinationRef || hasDestinationName) { if (hasDestinationRef) { if (hasDestinationName) { diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java index 54abca2327..98b669460d 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java @@ -116,6 +116,8 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition builder.addConstructorArgReference(listenerBeanName); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.AUTO_STARTUP); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.PHASE); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "acknowledge", "sessionAcknowledgeMode"); + } private String parseMessageListenerContainer(Element element, ParserContext parserContext) { @@ -161,15 +163,7 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition builder.addPropertyValue("destinationName", destinationName); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, pubSubDomainAttribute, "pubSubDomain"); } - Integer acknowledgeMode = JmsAdapterParserUtils.parseAcknowledgeMode(element, parserContext); - if (acknowledgeMode != null) { - if (acknowledgeMode.intValue() == JmsAdapterParserUtils.SESSION_TRANSACTED) { - builder.addPropertyValue("sessionTransacted", Boolean.TRUE); - } - else { - builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode); - } - } + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "transaction-manager"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "task-executor"); diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java index d587dab3fe..ca76d5ff5f 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java @@ -24,7 +24,6 @@ import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.integration.jms.JmsOutboundGateway; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; - import org.w3c.dom.Element; /** @@ -73,6 +72,7 @@ public class JmsOutboundGatewayParser extends AbstractConsumerEndpointParser { builder.addPropertyValue("deliveryPersistent", deliveryPersistent); } Element container = DomUtils.getChildElementByTagName(element, "reply-listener"); + if (container != null) { this.parseReplyContainer(builder, parserContext, container); } @@ -119,15 +119,7 @@ public class JmsOutboundGatewayParser extends AbstractConsumerEndpointParser { private void parseReplyContainer(BeanDefinitionBuilder gatewayBuilder, ParserContext parserContext, Element element) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(JmsOutboundGateway.ReplyContainerProperties.class); - Integer acknowledgeMode = JmsAdapterParserUtils.parseAcknowledgeMode(element, parserContext); - if (acknowledgeMode != null) { - if (JmsAdapterParserUtils.SESSION_TRANSACTED == acknowledgeMode) { - builder.addPropertyValue("sessionTransacted", Boolean.TRUE); - } - else { - builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode); - } - } + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "acknowledge", "sessionAcknowledgeModeName"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "concurrent-consumers"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-concurrent-consumers"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-messages-per-task"); diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/util/JmsAdapterUtils.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/util/JmsAdapterUtils.java new file mode 100644 index 0000000000..8bb5f9ef2b --- /dev/null +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/util/JmsAdapterUtils.java @@ -0,0 +1,57 @@ +/* + * Copyright 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.jms.util; + +import org.springframework.util.StringUtils; + +/** + * @author Liujiong + * @since 4.1 + * + */ +public abstract class JmsAdapterUtils { + + public static final int SESSION_TRANSACTED = 0; + + public static final int AUTO_ACKNOWLEDGE = 1; + + public static final int CLIENT_ACKNOWLEDGE = 2; + + public static final int DUPS_OK_ACKNOWLEDGE = 3; + + public static Integer parseAcknowledgeMode(String acknowledge) { + if (StringUtils.hasText(acknowledge)) { + int acknowledgeMode = AUTO_ACKNOWLEDGE; + if ("transacted".equals(acknowledge)) { + acknowledgeMode = SESSION_TRANSACTED; + } + else if ("dups-ok".equals(acknowledge)) { + acknowledgeMode = DUPS_OK_ACKNOWLEDGE; + } + else if ("client".equals(acknowledge)) { + acknowledgeMode = CLIENT_ACKNOWLEDGE; + } + else if (!"auto".equals(acknowledge)) { + throw new IllegalStateException("Invalid JMS 'acknowledge' setting: " + + "only \"auto\", \"client\", \"dups-ok\" and \"transacted\" supported."); + } + return acknowledgeMode; + } + else { + return null; + } + } +} diff --git a/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-4.1.xsd b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-4.1.xsd index ec439ec24d..81c0c9afeb 100644 --- a/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-4.1.xsd +++ b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-4.1.xsd @@ -170,10 +170,7 @@ ]]> - - - - + @@ -264,13 +261,7 @@ ]]> - - - - - - - + @@ -283,12 +274,7 @@ ]]> - - - - - - + @@ -755,12 +741,7 @@ ]]> - - - - - - + @@ -1269,12 +1250,7 @@ ]]> - - - - - - + @@ -1502,5 +1478,31 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsInboundChannelAdapterTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsInboundChannelAdapterTests-context.xml index 0c396cc64a..c60a24b4a7 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsInboundChannelAdapterTests-context.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsInboundChannelAdapterTests-context.xml @@ -3,13 +3,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-jms="http://www.springframework.org/schema/integration/jms" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + + + + transacted + + + receive-timeout="500" acknowledge="${jmsAcknowledgeModeTransacted}"> diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundInsideChainTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundInsideChainTests-context.xml index 746624cd58..3798f0686b 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundInsideChainTests-context.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundInsideChainTests-context.xml @@ -7,8 +7,7 @@ http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/jms - http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/GlobalChannelInterceptorTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/GlobalChannelInterceptorTests-context.xml index f3073b5f4a..d59d01fc71 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/GlobalChannelInterceptorTests-context.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/GlobalChannelInterceptorTests-context.xml @@ -3,16 +3,28 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-jms="http://www.springframework.org/schema/integration/jms" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + + + + none + simple + auto + + - - + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundGatewayWithDeliveryPersistent.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundGatewayWithDeliveryPersistent.xml index 93630ff89d..57c94fd370 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundGatewayWithDeliveryPersistent.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundGatewayWithDeliveryPersistent.xml @@ -4,15 +4,26 @@ xmlns:si="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" xmlns:task="http://www.springframework.org/schema/task" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> - + + + + + transacted + dups-ok + + asList(validationExceptions))); + Arrays.asList(validationExceptions))); } if (logger.isDebugEnabled()) { logger.debug("Message was rejected due to XML Validation errors"); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java new file mode 100644 index 0000000000..c2bd771460 --- /dev/null +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java @@ -0,0 +1,106 @@ +/* + * Copyright 2002-2013 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.xml.transformer; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.integration.transformer.AbstractTransformer; +import org.springframework.integration.xml.result.DomResultFactory; +import org.springframework.integration.xml.result.ResultFactory; +import org.springframework.integration.xml.result.StringResultFactory; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * super class for XmlTransformer + * + * @author Jonas Partner + * @author Mark Fisher + * @author Artem Bilan + * @author Liujiong + */ +public abstract class AbstractXmlTransformer extends AbstractTransformer { + + public static final String DOM_RESULT = "DOMResult"; + + public static final String STRING_RESULT = "StringResult"; + + private volatile String resultType; + + private volatile String resultFactoryName; + + private volatile ResultFactory resultFactory = new DomResultFactory(); + + public void setResultFactoryName(String resultFactoryName) { + this.resultFactoryName = resultFactoryName; + } + + public void setResultType(String resultType) { + this.resultType = resultType; + } + + public void setResultFactory(ResultFactory resultFactory) { + Assert.notNull(resultFactory, "ResultFactory must not be null"); + this.resultFactory = resultFactory; + } + + public String getResultType() { + return resultType; + } + + public String getResultFactoryName() { + return resultFactoryName; + } + + public ResultFactory getResultFactory() { + return resultFactory; + } + + @Override + protected void onInit() throws Exception { + super.onInit(); + ResultFactory generatedResultFactory = configureResultFactory(resultType, resultFactoryName, this.getBeanFactory()); + if (generatedResultFactory != null) { + resultFactory = generatedResultFactory; + } + } + + /** + * Helper method that encapsulates common logic for validating and building + * a bean definition for a {@link ResultFactory} based on either the + * 'result-factory' or 'result-type' attributes. + */ + private ResultFactory configureResultFactory(String resultType, String resultFactoryName, BeanFactory beanFactory) { + boolean bothHaveText = StringUtils.hasText(resultFactoryName) && StringUtils.hasText(resultType); + ResultFactory resultFactory = null; + Assert.state(!bothHaveText, "Only one of 'result-factory' or 'result-type' should be specified."); + if (StringUtils.hasText(resultType)) { + Assert.state(resultType.equals(DOM_RESULT) || resultType.equals(STRING_RESULT), + "Result type must be either 'DOMResult' or 'StringResult'"); + } + if (StringUtils.hasText(resultFactoryName)) { + resultFactory = (ResultFactory) beanFactory.getBean(resultFactoryName); + } + else if (STRING_RESULT.equals(resultType)) { + resultFactory = new StringResultFactory(); + } + else if (DOM_RESULT.equals(resultType)) { + resultFactory = new DomResultFactory(); + } + return resultFactory; + } + +} diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java index 8c50cc09d3..9db432c0f7 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java @@ -22,8 +22,6 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Result; import org.springframework.integration.transformer.AbstractTransformer; -import org.springframework.integration.xml.result.DomResultFactory; -import org.springframework.integration.xml.result.ResultFactory; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; import org.springframework.oxm.Marshaller; @@ -35,12 +33,10 @@ import org.springframework.util.Assert; * @author Mark Fisher * @author Jonas Partner */ -public class MarshallingTransformer extends AbstractTransformer { +public class MarshallingTransformer extends AbstractXmlTransformer { private final Marshaller marshaller; - private volatile ResultFactory resultFactory; - private final ResultTransformer resultTransformer; private volatile boolean extractPayload = true; @@ -50,7 +46,6 @@ public class MarshallingTransformer extends AbstractTransformer { Assert.notNull(marshaller, "a marshaller is required"); this.marshaller = marshaller; this.resultTransformer = resultTransformer; - this.resultFactory = new DomResultFactory(); } public MarshallingTransformer(Marshaller marshaller) throws ParserConfigurationException { @@ -58,11 +53,6 @@ public class MarshallingTransformer extends AbstractTransformer { } - public void setResultFactory(ResultFactory resultFactory) { - Assert.notNull(resultFactory, "ResultFactory must not be null"); - this.resultFactory = resultFactory; - } - /** * Specify whether the source Message's payload should be extracted prior * to marshalling. This value is set to "true" by default. To send the @@ -79,11 +69,12 @@ public class MarshallingTransformer extends AbstractTransformer { return "xml:marshalling-transformer"; } + @Override public Object doTransform(Message message) { Object source = (this.extractPayload) ? message.getPayload() : message; Object transformedPayload = null; - Result result = this.resultFactory.createResult(source); + Result result = this.getResultFactory().createResult(source); if (result == null) { throw new MessagingException( "Unable to marshal payload, ResultFactory returned null."); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java index 48b0e58a66..dc6386214e 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java @@ -36,7 +36,6 @@ import org.springframework.core.io.Resource; import org.springframework.expression.Expression; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.integration.expression.ExpressionUtils; -import org.springframework.integration.transformer.AbstractTransformer; import org.springframework.integration.xml.result.DomResultFactory; import org.springframework.integration.xml.result.ResultFactory; import org.springframework.integration.xml.source.DomSourceFactory; @@ -47,6 +46,7 @@ import org.springframework.messaging.MessagingException; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.PatternMatchUtils; +import org.springframework.util.StringUtils; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; @@ -77,7 +77,7 @@ import org.springframework.xml.transform.StringSource; * @author Mike Bazos * @author Gary Russell */ -public class XsltPayloadTransformer extends AbstractTransformer implements BeanClassLoaderAware { +public class XsltPayloadTransformer extends AbstractXmlTransformer implements BeanClassLoaderAware { private final ResultTransformer resultTransformer; @@ -93,8 +93,6 @@ public class XsltPayloadTransformer extends AbstractTransformer implements BeanC private volatile SourceFactory sourceFactory = new DomSourceFactory(); - private volatile ResultFactory resultFactory = new DomResultFactory(); - private volatile boolean resultFactoryExplicitlySet; private volatile boolean alwaysUseSourceFactory = false; @@ -155,8 +153,7 @@ public class XsltPayloadTransformer extends AbstractTransformer implements BeanC * @param resultFactory The result factory. */ public void setResultFactory(ResultFactory resultFactory) { - Assert.notNull(sourceFactory, "ResultFactory must not be null"); - this.resultFactory = resultFactory; + super.setResultFactory(resultFactory); this.resultFactoryExplicitlySet = true; } @@ -192,6 +189,21 @@ public class XsltPayloadTransformer extends AbstractTransformer implements BeanC this.classLoader = classLoader; } + @Override + public void setResultType(String resultType) { + super.setResultType(resultType); + if (StringUtils.hasText(resultType)) { + this.alwaysUseResultFactory = true; + } + } + + @Override + public void setResultFactoryName(String resultFactoryName) { + super.setResultFactoryName(resultFactoryName); + if (StringUtils.hasText(resultFactoryName)) { + this.alwaysUseResultFactory = true; + } + } @Override public String getComponentType() { @@ -270,7 +282,7 @@ public class XsltPayloadTransformer extends AbstractTransformer implements BeanC result = new StringResult(); } else { - result = this.resultFactory.createResult(payload); + result = this.getResultFactory().createResult(payload); } transformer.transform(source, result); if (this.resultTransformer != null) { @@ -300,7 +312,7 @@ public class XsltPayloadTransformer extends AbstractTransformer implements BeanC else { source = new DOMSource(documentPayload); } - Result result = this.resultFactory.createResult(documentPayload); + Result result = this.getResultFactory().createResult(documentPayload); if (!DOMResult.class.isAssignableFrom(result.getClass())) { throw new MessagingException( "Document to Document conversion requires a DOMResult-producing ResultFactory implementation."); diff --git a/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-4.1.xsd b/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-4.1.xsd index 05e39c7a3a..2eaa4fc9d8 100644 --- a/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-4.1.xsd +++ b/spring-integration-xml/src/main/resources/org/springframework/integration/xml/config/spring-integration-xml-4.1.xsd @@ -38,10 +38,7 @@ - - - - + @@ -211,10 +208,7 @@ ]]> - - - - + @@ -294,13 +288,7 @@ - - - - - - - + @@ -421,13 +409,7 @@ - - - - - - - + @@ -796,10 +778,7 @@ - - - - + @@ -883,5 +862,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathHeaderEnricherParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathHeaderEnricherParserTests-context.xml index e337495159..f53ea00c42 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathHeaderEnricherParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathHeaderEnricherParserTests-context.xml @@ -3,24 +3,38 @@ xmlns:beans="http://www.springframework.org/schema/beans" xmlns:si="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd"> - + + + + + BOOLEAN_RESULT + STRING_RESULT + NUMBER_RESULT + NODE_RESULT + NODE_LIST_RESULT + +
-
-
-
-
-
+
+
+
+
+
diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathTransformerParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathTransformerParserTests-context.xml index 5975b40ce0..fe9502afec 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathTransformerParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathTransformerParserTests-context.xml @@ -3,32 +3,46 @@ xmlns:beans="http://www.springframework.org/schema/beans" xmlns:si="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd"> - + + + + + BOOLEAN_RESULT + STRING_RESULT + NUMBER_RESULT + NODE_RESULT + NODE_LIST_RESULT + + - + - + - + - + - + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml index 7c156f1bb9..9abc05dc13 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests-context.xml @@ -3,11 +3,22 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-xml="http://www.springframework.org/schema/integration/xml" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd"> + + + + xml-schema + + + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java index 4f3de94ec6..4c92bf1647 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XmlPayloadValidatingFilterParserTests.java @@ -23,17 +23,20 @@ import static org.junit.Assert.fail; import org.hamcrest.Matchers; import org.junit.Test; +import org.junit.runner.RunWith; import org.w3c.dom.Document; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.MessageRejectedException; import org.springframework.integration.xml.AggregatedXmlMessageValidationException; import org.springframework.integration.xml.util.XmlTestUtil; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.GenericMessage; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Jonas Partner @@ -42,11 +45,15 @@ import org.springframework.test.context.ContextConfiguration; * @author Artem Bilan */ @ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +@DirtiesContext public class XmlPayloadValidatingFilterParserTests { + @Autowired + private ApplicationContext ac; + @Test public void testValidMessage() throws Exception { - ApplicationContext ac = new ClassPathXmlApplicationContext("XmlPayloadValidatingFilterParserTests-context.xml", this.getClass()); Document doc = XmlTestUtil.getDocumentForString("hello"); GenericMessage docMessage = new GenericMessage(doc); PollableChannel validChannel = ac.getBean("validOutputChannel", PollableChannel.class); @@ -56,7 +63,6 @@ public class XmlPayloadValidatingFilterParserTests { } @Test public void testInvalidMessageWithDiscardChannel() throws Exception { - ApplicationContext ac = new ClassPathXmlApplicationContext("XmlPayloadValidatingFilterParserTests-context.xml", this.getClass()); Document doc = XmlTestUtil.getDocumentForString(""); GenericMessage docMessage = new GenericMessage(doc); PollableChannel validChannel = ac.getBean("validOutputChannel", PollableChannel.class); @@ -68,7 +74,6 @@ public class XmlPayloadValidatingFilterParserTests { } @Test public void testInvalidMessageWithThrowException() throws Exception { - ApplicationContext ac = new ClassPathXmlApplicationContext("XmlPayloadValidatingFilterParserTests-context.xml", this.getClass()); Document doc = XmlTestUtil.getDocumentForString(""); GenericMessage docMessage = new GenericMessage(doc); MessageChannel inputChannel = ac.getBean("inputChannelB", MessageChannel.class); @@ -88,7 +93,6 @@ public class XmlPayloadValidatingFilterParserTests { } @Test public void testValidMessageWithValidator() throws Exception { - ApplicationContext ac = new ClassPathXmlApplicationContext("XmlPayloadValidatingFilterParserTests-context.xml", this.getClass()); Document doc = XmlTestUtil.getDocumentForString("hello"); GenericMessage docMessage = new GenericMessage(doc); PollableChannel validChannel = ac.getBean("validOutputChannel", PollableChannel.class); @@ -96,16 +100,15 @@ public class XmlPayloadValidatingFilterParserTests { inputChannel.send(docMessage); assertNotNull(validChannel.receive(100)); } - @SuppressWarnings("unused") + @Test public void testInvalidMessageWithValidatorAndDiscardChannel() throws Exception { - ApplicationContext ac = new ClassPathXmlApplicationContext("XmlPayloadValidatingFilterParserTests-context.xml", this.getClass()); Document doc = XmlTestUtil.getDocumentForString(""); GenericMessage docMessage = new GenericMessage(doc); - PollableChannel validChannel = ac.getBean("validOutputChannel", PollableChannel.class); PollableChannel invalidChannel = ac.getBean("invalidOutputChannel", PollableChannel.class); MessageChannel inputChannel = ac.getBean("inputChannelC", MessageChannel.class); inputChannel.send(docMessage); assertNotNull(invalidChannel.receive(100)); } + } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml index ea7d44dc81..b205bb1208 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml @@ -1,32 +1,46 @@ + + + + DOMResult + StringResult + + + + + + + + result-type="${stringResult}"/> @@ -80,5 +96,4 @@ - diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java index c023554a45..0a4a64c427 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java @@ -47,109 +47,104 @@ import org.springframework.xml.transform.StringResult; */ public class XsltPayloadTransformerParserTests { - private final String doc = "test"; + private final String doc = "test"; - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - private PollableChannel output; + private PollableChannel output; - @Before - public void setUp() { - applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); - output = (PollableChannel) applicationContext.getBean("output"); - } + @Before + public void setUp() { + applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); + output = (PollableChannel) applicationContext.getBean("output"); + } + @Test + public void testWithResourceProvided() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withResourceIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + 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()); + assertNotNull(TestUtils.getPropertyValue(applicationContext.getBean("xsltTransformerWithResource.handler"), + "transformer.evaluationContext.beanResolver")); + } - @Test - public void testWithResourceProvided() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withResourceIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - 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()); - assertNotNull(TestUtils.getPropertyValue(applicationContext.getBean("xsltTransformerWithResource.handler"), - "transformer.evaluationContext.beanResolver")); - } + @Test + public void testWithTemplatesProvided() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + 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()); + } - @Test - public void testWithTemplatesProvided() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - 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()); - } + @Test + public void testWithTemplatesAndResultTransformer() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultTransformerIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + 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 testWithTemplatesAndResultTransformer() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultTransformerIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - 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 testWithResourceProvidedAndStubResultFactory() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultFactoryIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); + } - @Test - public void testWithResourceProvidedAndStubResultFactory() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultFactoryIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); - } + @Test + public void testWithResourceAndStringResultType() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndStringResultTypeIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); + } - @Test - public void testWithResourceAndStringResultType() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndStringResultTypeIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); - } + @Test + public void docInStringResultOut() throws Exception { + MessageChannel input = applicationContext.getBean("docinStringResultOutTransformerChannel", + MessageChannel.class); + Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)).build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", StringResult.class, resultMessage.getPayload().getClass()); + String payload = resultMessage.getPayload().toString(); + Assert.assertTrue(payload.contains("test")); + } + @Test + public void stringInDocResultOut() throws Exception { + MessageChannel input = applicationContext.getBean("stringResultOutTransformerChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.doc).build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", DOMResult.class, resultMessage.getPayload().getClass()); + Document payload = (Document) ((DOMResult) resultMessage.getPayload()).getNode(); + Assert.assertTrue(XmlTestUtil.docToString(payload).contains("test")); + } - @Test - public void docInStringResultOut() throws Exception { - MessageChannel input = applicationContext.getBean("docinStringResultOutTransformerChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)). - build(); - input.send(message); - Message resultMessage = output.receive(); - Assert.assertEquals("Wrong payload type", StringResult.class, resultMessage.getPayload().getClass()); - String payload = resultMessage.getPayload().toString(); - Assert.assertTrue(payload.contains("test")); - } - - @Test - public void stringInDocResultOut() throws Exception { - MessageChannel input = applicationContext.getBean("stringResultOutTransformerChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.doc). - build(); - input.send(message); - Message resultMessage = output.receive(); - Assert.assertEquals("Wrong payload type", DOMResult.class, resultMessage.getPayload().getClass()); - Document payload = (Document) ((DOMResult) resultMessage.getPayload()).getNode(); - Assert.assertTrue(XmlTestUtil.docToString(payload).contains("test")); - } - - - @Test - public void stringInAndCustomResultFactory() throws Exception { - MessageChannel input = applicationContext.getBean("stringInCustomResultFactoryChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)). - build(); - input.send(message); - Message resultMessage = output.receive(); - Assert.assertEquals("Wrong payload type", CustomTestResultFactory.FixedStringResult.class, resultMessage.getPayload().getClass()); - String payload = resultMessage.getPayload().toString(); - Assert.assertTrue(payload.contains("fixedStringForTesting")); - } - + @Test + public void stringInAndCustomResultFactory() throws Exception { + MessageChannel input = applicationContext.getBean("stringInCustomResultFactoryChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)).build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", CustomTestResultFactory.FixedStringResult.class, resultMessage + .getPayload().getClass()); + String payload = resultMessage.getPayload().toString(); + Assert.assertTrue(payload.contains("fixedStringForTesting")); + } } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests-context.xml new file mode 100644 index 0000000000..75d008707d --- /dev/null +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests-context.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests.java index 486f297dec..e088823299 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelectorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -13,12 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.xml.selector; +import static org.junit.Assert.assertTrue; + import org.junit.Test; + +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; -import org.springframework.xml.validation.XmlValidatorFactory; +import org.springframework.integration.xml.selector.XmlValidatingMessageSelector.SchemaType; /** * @author Oleg Zhurakousky @@ -29,23 +35,34 @@ public class XmlValidatingMessageSelectorTests { @Test public void validateCreationWithSchemaAndDefaultSchemaType() throws Exception{ Resource resource = new ByteArrayResource("".getBytes()); - new XmlValidatingMessageSelector(resource, null); + new XmlValidatingMessageSelector(resource, (SchemaType) null); } - + @Test public void validateCreationWithSchemaAndProvidedSchemaType() throws Exception{ Resource resource = new ByteArrayResource("".getBytes()); - new XmlValidatingMessageSelector(resource, XmlValidatorFactory.SCHEMA_W3C_XML); + new XmlValidatingMessageSelector(resource, SchemaType.XML_SCHEMA); } - - @Test(expected=IllegalArgumentException.class) + + @Test public void validateFailureInvalidSchemaLanguage() throws Exception{ - Resource resource = new ByteArrayResource("".getBytes()); - new XmlValidatingMessageSelector(resource, "foo"); + ConfigurableApplicationContext context = null; + try { + context = new ClassPathXmlApplicationContext("XmlValidatingMessageSelectorTests-context.xml", this.getClass()); + } + catch (Exception e) { + assertTrue(e.getMessage().contains("java.lang.IllegalArgumentException: No enum constant")); + } + finally { + if(context != null) { + context.close(); + } + } } - + @Test(expected=IllegalArgumentException.class) public void validateFailureWhenNoSchemaResourceProvided() throws Exception{ - new XmlValidatingMessageSelector(null, null); + new XmlValidatingMessageSelector(null, (SchemaType) null); } + } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/jaxbmarshaling/JaxbMarshallingIntegrationTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/jaxbmarshaling/JaxbMarshallingIntegrationTests-context.xml index cd72860e37..d2f00d7a1e 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/jaxbmarshaling/JaxbMarshallingIntegrationTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/jaxbmarshaling/JaxbMarshallingIntegrationTests-context.xml @@ -4,22 +4,29 @@ xmlns:si-xml="http://www.springframework.org/schema/integration/xml" xmlns:si="http://www.springframework.org/schema/integration" xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> + + + + DOMResult + + - @@ -28,12 +35,10 @@ - - + - @@ -42,4 +47,4 @@ - \ No newline at end of file +