From 0f0c93a559c7eb8ac29596c992d98f470beb90a1 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 19 Mar 2013 13:39:45 +0100 Subject: [PATCH] Removed JMS 1.0.2 support --- .../AbstractListenerContainerParser.java | 18 +- .../config/JmsListenerContainerParser.java | 19 +- .../connection/JmsTransactionManager102.java | 151 --- .../SingleConnectionFactory102.java | 131 --- .../jms/core/JmsTemplate102.java | 257 ----- .../DefaultMessageListenerContainer102.java | 117 --- .../SimpleMessageListenerContainer102.java | 99 -- .../adapter/MessageListenerAdapter102.java | 100 -- .../converter/SimpleMessageConverter102.java | 66 -- .../jms/config/jmsNamespaceHandlerTests.xml | 2 +- .../JmsTransactionManagerTests.java | 61 +- .../SingleConnectionFactoryTests.java | 44 - .../jms/core/JmsTemplate102JtaTests.java | 35 - .../jms/core/JmsTemplate102Tests.java | 987 ------------------ .../core/JmsTemplate102TransactedTests.java | 35 - .../MessageListenerAdapter102Tests.java | 308 ------ .../StubMessageListenerAdapter102.java | 43 - .../SimpleMessageConverter102Tests.java | 66 -- 18 files changed, 12 insertions(+), 2527 deletions(-) delete mode 100644 spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102.java delete mode 100644 spring-jms/src/main/java/org/springframework/jms/support/converter/SimpleMessageConverter102.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102JtaTests.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102Tests.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102TransactedTests.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102Tests.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/listener/adapter/StubMessageListenerAdapter102.java delete mode 100644 spring-jms/src/test/java/org/springframework/jms/support/SimpleMessageConverter102Tests.java diff --git a/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java b/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java index 9407db27f4a..fe937c97e8c 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * 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. @@ -18,6 +18,10 @@ package org.springframework.jms.config; import javax.jms.Session; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; @@ -26,9 +30,6 @@ import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; /** * Abstract parser for JMS listener container elements, providing support for @@ -156,10 +157,7 @@ abstract class AbstractListenerContainerParser implements BeanDefinitionParser { } } - // Remain JMS 1.0.2 compatible for the adapter if the container class indicates this. - boolean jms102 = indicatesJms102(containerDef); - listenerDef.setBeanClassName( - "org.springframework.jms.listener.adapter.MessageListenerAdapter" + (jms102 ? "102" : "")); + listenerDef.setBeanClassName("org.springframework.jms.listener.adapter.MessageListenerAdapter"); containerDef.getPropertyValues().add("messageListener", listenerDef); @@ -180,10 +178,6 @@ abstract class AbstractListenerContainerParser implements BeanDefinitionParser { return false; } - protected boolean indicatesJms102(BeanDefinition containerDef) { - return false; - } - protected void parseListenerConfiguration(Element ele, ParserContext parserContext, BeanDefinition configDef) { String destination = ele.getAttribute(DESTINATION_ATTRIBUTE); if (!StringUtils.hasText(destination)) { diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java index 05ecd8b5de8..77daef56b55 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * 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. @@ -62,21 +62,15 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser { if (!"".equals(containerClass)) { containerDef.setBeanClassName(containerClass); } - else if ("".equals(containerType) || "default".equals(containerType)) { + else if ("".equals(containerType) || containerType.startsWith("default")) { containerDef.setBeanClassName("org.springframework.jms.listener.DefaultMessageListenerContainer"); } - else if ("default102".equals(containerType)) { - containerDef.setBeanClassName("org.springframework.jms.listener.DefaultMessageListenerContainer102"); - } - else if ("simple".equals(containerType)) { + else if (containerType.startsWith("simple")) { containerDef.setBeanClassName("org.springframework.jms.listener.SimpleMessageListenerContainer"); } - else if ("simple102".equals(containerType)) { - containerDef.setBeanClassName("org.springframework.jms.listener.SimpleMessageListenerContainer102"); - } else { parserContext.getReaderContext().error( - "Invalid 'container-type' attribute: only \"default(102)\" and \"simple(102)\" supported.", containerEle); + "Invalid 'container-type' attribute: only \"default\" and \"simple\" supported.", containerEle); } String connectionFactoryBeanName = "connectionFactory"; @@ -178,9 +172,4 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser { return indicatesPubSubConfig(containerDef); } - @Override - protected boolean indicatesJms102(BeanDefinition containerDef) { - return containerDef.getBeanClassName().endsWith("102"); - } - } diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager102.java b/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager102.java deleted file mode 100644 index 5d73a3497cb..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager102.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.connection; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.Session; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; - -/** - * A subclass of {@link JmsTransactionManager} for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like JmsTransactionManager itself. - * This class can be used for JMS 1.0.2 providers, offering the same API as - * JmsTransactionManager does for JMS 1.1 providers. - * - *

You need to set the {@link #setPubSubDomain "pubSubDomain" property}, - * since this class will always explicitly differentiate between a - * {@link javax.jms.QueueConnection} and a {@link javax.jms.TopicConnection}. - * - * @author Juergen Hoeller - * @since 1.1 - * @see #setConnectionFactory - * @see #setPubSubDomain - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link JmsTransactionManager} - */ -@Deprecated -@SuppressWarnings("serial") -public class JmsTransactionManager102 extends JmsTransactionManager { - - private boolean pubSubDomain = false; - - - /** - * Create a new JmsTransactionManager102 for bean-style usage. - *

Note: The ConnectionFactory has to be set before using the instance. - * This constructor can be used to prepare a JmsTemplate via a BeanFactory, - * typically setting the ConnectionFactory via setConnectionFactory. - * @see #setConnectionFactory - */ - public JmsTransactionManager102() { - super(); - } - - /** - * Create a new JmsTransactionManager102, given a ConnectionFactory. - * @param connectionFactory the ConnectionFactory to manage transactions for - * @param pubSubDomain whether the Publish/Subscribe domain (Topics) or - * Point-to-Point domain (Queues) should be used - * @see #setPubSubDomain - */ - public JmsTransactionManager102(ConnectionFactory connectionFactory, boolean pubSubDomain) { - setConnectionFactory(connectionFactory); - this.pubSubDomain = pubSubDomain; - afterPropertiesSet(); - } - - - /** - * Configure the transaction manager with knowledge of the JMS domain used. - * This tells the JMS 1.0.2 provider which class hierarchy to use for creating - * Connections and Sessions. - *

Default is Point-to-Point (Queues). - * @param pubSubDomain {@code true} for Publish/Subscribe domain (Topics), - * {@code false} for Point-to-Point domain (Queues) - */ - public void setPubSubDomain(boolean pubSubDomain) { - this.pubSubDomain = pubSubDomain; - } - - /** - * Return whether the Publish/Subscribe domain (Topics) is used. - * Otherwise, the Point-to-Point domain (Queues) is used. - */ - public boolean isPubSubDomain() { - return this.pubSubDomain; - } - - - /** - * In addition to checking if the connection factory is set, make sure - * that the supplied connection factory is of the appropriate type for - * the specified destination type: QueueConnectionFactory for queues, - * and TopicConnectionFactory for topics. - */ - public void afterPropertiesSet() { - super.afterPropertiesSet(); - - // Make sure that the ConnectionFactory passed is consistent. - // Some provider implementations of the ConnectionFactory interface - // implement both domain interfaces under the cover, so just check if - // the selected domain is consistent with the type of connection factory. - if (isPubSubDomain()) { - if (!(getConnectionFactory() instanceof TopicConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 transaction manager for topics " + - "but did not supply an instance of TopicConnectionFactory"); - } - } - else { - if (!(getConnectionFactory() instanceof QueueConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 transaction manager for queues " + - "but did not supply an instance of QueueConnectionFactory"); - } - } - } - - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Connection createConnection() throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnectionFactory) getConnectionFactory()).createTopicConnection(); - } - else { - return ((QueueConnectionFactory) getConnectionFactory()).createQueueConnection(); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Session createSession(Connection con) throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnection) con).createTopicSession(true, Session.AUTO_ACKNOWLEDGE); - } - else { - return ((QueueConnection) con).createQueueSession(true, Session.AUTO_ACKNOWLEDGE); - } - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory102.java b/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory102.java deleted file mode 100644 index b9097d06a19..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory102.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.connection; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.jms.QueueConnectionFactory; -import javax.jms.TopicConnectionFactory; - -/** - * A subclass of {@link SingleConnectionFactory} for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like SingleConnectionFactory itself. - * This class can be used for JMS 1.0.2 providers, offering the same API as - * SingleConnectionFactory does for JMS 1.1 providers. - * - *

You need to set the {@link #setPubSubDomain "pubSubDomain" property}, - * since this class will always explicitly differentiate between a - * {@link javax.jms.QueueConnection} and a {@link javax.jms.TopicConnection}. - * - * @author Juergen Hoeller - * @since 1.1 - * @see #setTargetConnectionFactory - * @see #setPubSubDomain - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link SingleConnectionFactory} - */ -@Deprecated -public class SingleConnectionFactory102 extends SingleConnectionFactory { - - private boolean pubSubDomain = false; - - - /** - * Create a new SingleConnectionFactory102 for bean-style usage. - */ - public SingleConnectionFactory102() { - super(); - } - - /** - * Create a new SingleConnectionFactory102 that always returns a single - * Connection that it will lazily create via the given target - * ConnectionFactory. - * @param connectionFactory the target ConnectionFactory - * @param pubSubDomain whether the Publish/Subscribe domain (Topics) or - * Point-to-Point domain (Queues) should be used - */ - public SingleConnectionFactory102(ConnectionFactory connectionFactory, boolean pubSubDomain) { - setTargetConnectionFactory(connectionFactory); - this.pubSubDomain = pubSubDomain; - afterPropertiesSet(); - } - - - /** - * Configure the factory with knowledge of the JMS domain used. - * This tells the JMS 1.0.2 provider which class hierarchy to use for creating - * Connections and Sessions. - *

Default is Point-to-Point (Queues). - * @param pubSubDomain {@code true} for Publish/Subscribe domain (Topics), - * {@code false} for Point-to-Point domain (Queues) - */ - public void setPubSubDomain(boolean pubSubDomain) { - this.pubSubDomain = pubSubDomain; - } - - /** - * Return whether the Publish/Subscribe domain (Topics) is used. - * Otherwise, the Point-to-Point domain (Queues) is used. - */ - public boolean isPubSubDomain() { - return this.pubSubDomain; - } - - - /** - * In addition to checking whether the target ConnectionFactory is set, - * make sure that the supplied factory is of the appropriate type for - * the specified destination type: QueueConnectionFactory for queues, - * TopicConnectionFactory for topics. - */ - public void afterPropertiesSet() { - super.afterPropertiesSet(); - - // Make sure that the ConnectionFactory passed is consistent. - // Some provider implementations of the ConnectionFactory interface - // implement both domain interfaces under the cover, so just check if - // the selected domain is consistent with the type of connection factory. - if (isPubSubDomain()) { - if (!(getTargetConnectionFactory() instanceof TopicConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 SingleConnectionFactory for topics " + - "but did not supply an instance of TopicConnectionFactory"); - } - } - else { - if (!(getTargetConnectionFactory() instanceof QueueConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 SingleConnectionFactory for queues " + - "but did not supply an instance of QueueConnectionFactory"); - } - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Connection doCreateConnection() throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnectionFactory) getTargetConnectionFactory()).createTopicConnection(); - } - else { - return ((QueueConnectionFactory) getTargetConnectionFactory()).createQueueConnection(); - } - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate102.java b/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate102.java deleted file mode 100644 index 0aa7fbc49f4..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate102.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.core; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Queue; -import javax.jms.QueueBrowser; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.Topic; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; - -import org.springframework.jms.connection.JmsResourceHolder; -import org.springframework.jms.support.converter.SimpleMessageConverter102; - -/** - * A subclass of {@link JmsTemplate} for the JMS 1.0.2 specification, not relying - * on JMS 1.1 methods like JmsTemplate itself. This class can be used for JMS - * 1.0.2 providers, offering the same API as JmsTemplate does for JMS 1.1 providers. - * - *

You must specify the domain (or style) of messaging to be either - * Point-to-Point (Queues) or Publish/Subscribe (Topics), using the - * {@link #setPubSubDomain "pubSubDomain" property}. - * Point-to-Point (Queues) is the default domain. - * - *

The "pubSubDomain" property is an important setting due to the use of similar - * but separate class hierarchies in the JMS 1.0.2 API. JMS 1.1 provides a new - * domain-independent API that allows for easy mix-and-match use of Point-to-Point - * and Publish/Subscribe styles. - * - *

This template uses a - * {@link org.springframework.jms.support.destination.DynamicDestinationResolver} - * and a {@link org.springframework.jms.support.converter.SimpleMessageConverter102} - * as default strategies for resolving a destination name and converting a message, - * respectively. - * - * @author Mark Pollack - * @author Juergen Hoeller - * @since 1.1 - * @see #setConnectionFactory - * @see #setPubSubDomain - * @see javax.jms.Queue - * @see javax.jms.Topic - * @see javax.jms.QueueSession - * @see javax.jms.TopicSession - * @see javax.jms.QueueSender - * @see javax.jms.TopicPublisher - * @see javax.jms.QueueReceiver - * @see javax.jms.TopicSubscriber - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link JmsTemplate} - */ -@Deprecated -public class JmsTemplate102 extends JmsTemplate { - - /** - * Create a new JmsTemplate102 for bean-style usage. - *

Note: The ConnectionFactory has to be set before using the instance. - * This constructor can be used to prepare a JmsTemplate via a BeanFactory, - * typically setting the ConnectionFactory via setConnectionFactory. - * @see #setConnectionFactory - */ - public JmsTemplate102() { - super(); - } - - /** - * Create a new JmsTemplate102, given a ConnectionFactory. - * @param connectionFactory the ConnectionFactory to obtain Connections from - * @param pubSubDomain whether the Publish/Subscribe domain (Topics) or - * Point-to-Point domain (Queues) should be used - * @see #setPubSubDomain - */ - public JmsTemplate102(ConnectionFactory connectionFactory, boolean pubSubDomain) { - this(); - setConnectionFactory(connectionFactory); - setPubSubDomain(pubSubDomain); - afterPropertiesSet(); - } - - /** - * Initialize the default implementations for the template's strategies: - * DynamicDestinationResolver and SimpleMessageConverter102. - * @see #setDestinationResolver - * @see #setMessageConverter - * @see org.springframework.jms.support.destination.DynamicDestinationResolver - * @see org.springframework.jms.support.converter.SimpleMessageConverter102 - */ - protected void initDefaultStrategies() { - setMessageConverter(new SimpleMessageConverter102()); - } - - /** - * In addition to checking if the connection factory is set, make sure - * that the supplied connection factory is of the appropriate type for - * the specified destination type: QueueConnectionFactory for queues, - * and TopicConnectionFactory for topics. - */ - public void afterPropertiesSet() { - super.afterPropertiesSet(); - - // Make sure that the ConnectionFactory passed is consistent. - // Some provider implementations of the ConnectionFactory interface - // implement both domain interfaces under the cover, so just check if - // the selected domain is consistent with the type of connection factory. - if (isPubSubDomain()) { - if (!(getConnectionFactory() instanceof TopicConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 template for topics " + - "but did not supply an instance of TopicConnectionFactory"); - } - } - else { - if (!(getConnectionFactory() instanceof QueueConnectionFactory)) { - throw new IllegalArgumentException( - "Specified a Spring JMS 1.0.2 template for queues " + - "but did not supply an instance of QueueConnectionFactory"); - } - } - } - - - /** - * This implementation overrides the superclass method to accept either - * a QueueConnection or a TopicConnection, depending on the domain. - */ - protected Connection getConnection(JmsResourceHolder holder) { - return holder.getConnection(isPubSubDomain() ? (Class) TopicConnection.class : QueueConnection.class); - } - - /** - * This implementation overrides the superclass method to accept either - * a QueueSession or a TopicSession, depending on the domain. - */ - protected Session getSession(JmsResourceHolder holder) { - return holder.getSession(isPubSubDomain() ? (Class) TopicSession.class : QueueSession.class); - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Connection createConnection() throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnectionFactory) getConnectionFactory()).createTopicConnection(); - } - else { - return ((QueueConnectionFactory) getConnectionFactory()).createQueueConnection(); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Session createSession(Connection con) throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnection) con).createTopicSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - else { - return ((QueueConnection) con).createQueueSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException { - if (isPubSubDomain()) { - return ((TopicSession) session).createPublisher((Topic) destination); - } - else { - return ((QueueSession) session).createSender((Queue) destination); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected MessageConsumer createConsumer(Session session, Destination destination, String messageSelector) - throws JMSException { - - if (isPubSubDomain()) { - return ((TopicSession) session).createSubscriber((Topic) destination, messageSelector, isPubSubNoLocal()); - } - else { - return ((QueueSession) session).createReceiver((Queue) destination, messageSelector); - } - } - - protected QueueBrowser createBrowser(Session session, Queue queue, String messageSelector) - throws JMSException { - - if (isPubSubDomain()) { - throw new javax.jms.IllegalStateException("Cannot create QueueBrowser for a TopicSession"); - } - else { - return ((QueueSession) session).createBrowser(queue, messageSelector); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected void doSend(MessageProducer producer, Message message) throws JMSException { - if (isPubSubDomain()) { - if (isExplicitQosEnabled()) { - ((TopicPublisher) producer).publish(message, getDeliveryMode(), getPriority(), getTimeToLive()); - } - else { - ((TopicPublisher) producer).publish(message); - } - } - else { - if (isExplicitQosEnabled()) { - ((QueueSender) producer).send(message, getDeliveryMode(), getPriority(), getTimeToLive()); - } - else { - ((QueueSender) producer).send(message); - } - } - } - - /** - * This implementation overrides the superclass method to avoid using - * JMS 1.1's Session {@code getAcknowledgeMode()} method. - * The best we can do here is to check the setting on the template. - * @see #getSessionAcknowledgeMode() - */ - protected boolean isClientAcknowledge(Session session) throws JMSException { - return (getSessionAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE); - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer102.java b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer102.java deleted file mode 100644 index f15fb92323e..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer102.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.listener; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageConsumer; -import javax.jms.Queue; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.Topic; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; -import javax.jms.TopicSession; - -import org.springframework.jms.connection.JmsResourceHolder; - -/** - * A subclass of {@link DefaultMessageListenerContainer} for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like SimpleMessageListenerContainer itself. - * - *

This class can be used for JMS 1.0.2 providers, offering the same facility as - * DefaultMessageListenerContainer does for JMS 1.1 providers. - * - * @author Juergen Hoeller - * @since 2.0 - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link DefaultMessageListenerContainer} - */ -@Deprecated -public class DefaultMessageListenerContainer102 extends DefaultMessageListenerContainer { - - /** - * This implementation overrides the superclass method to accept either - * a QueueConnection or a TopicConnection, depending on the domain. - */ - protected Connection getConnection(JmsResourceHolder holder) { - return holder.getConnection(isPubSubDomain() ? TopicConnection.class : QueueConnection.class); - } - - /** - * This implementation overrides the superclass method to accept either - * a QueueSession or a TopicSession, depending on the domain. - */ - protected Session getSession(JmsResourceHolder holder) { - return holder.getSession(isPubSubDomain() ? TopicSession.class : QueueSession.class); - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Connection createConnection() throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnectionFactory) getConnectionFactory()).createTopicConnection(); - } - else { - return ((QueueConnectionFactory) getConnectionFactory()).createQueueConnection(); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Session createSession(Connection con) throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnection) con).createTopicSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - else { - return ((QueueConnection) con).createQueueSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException { - if (isPubSubDomain()) { - if (isSubscriptionDurable()) { - return ((TopicSession) session).createDurableSubscriber( - (Topic) destination, getDurableSubscriptionName(), getMessageSelector(), isPubSubNoLocal()); - } - else { - return ((TopicSession) session).createSubscriber( - (Topic) destination, getMessageSelector(), isPubSubNoLocal()); - } - } - else { - return ((QueueSession) session).createReceiver((Queue) destination, getMessageSelector()); - } - } - - /** - * This implementation overrides the superclass method to avoid using - * JMS 1.1's Session {@code getAcknowledgeMode()} method. - * The best we can do here is to check the setting on the listener container. - */ - protected boolean isClientAcknowledge(Session session) throws JMSException { - return (getSessionAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE); - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer102.java b/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer102.java deleted file mode 100644 index 758301eb404..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer102.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.listener; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageConsumer; -import javax.jms.Queue; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.Topic; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; -import javax.jms.TopicSession; - -/** - * A subclass of {@link SimpleMessageListenerContainer} for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like SimpleMessageListenerContainer itself. - * - *

This class can be used for JMS 1.0.2 providers, offering the same facility as - * SimpleMessageListenerContainer does for JMS 1.1 providers. - * - * @author Juergen Hoeller - * @since 2.0 - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link SimpleMessageListenerContainer} - */ -@Deprecated -public class SimpleMessageListenerContainer102 extends SimpleMessageListenerContainer { - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Connection createConnection() throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnectionFactory) getConnectionFactory()).createTopicConnection(); - } - else { - return ((QueueConnectionFactory) getConnectionFactory()).createQueueConnection(); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected Session createSession(Connection con) throws JMSException { - if (isPubSubDomain()) { - return ((TopicConnection) con).createTopicSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - else { - return ((QueueConnection) con).createQueueSession(isSessionTransacted(), getSessionAcknowledgeMode()); - } - } - - /** - * This implementation overrides the superclass method to use JMS 1.0.2 API. - */ - protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException { - if (isPubSubDomain()) { - if (isSubscriptionDurable()) { - return ((TopicSession) session).createDurableSubscriber( - (Topic) destination, getDurableSubscriptionName(), getMessageSelector(), isPubSubNoLocal()); - } - else { - return ((TopicSession) session).createSubscriber( - (Topic) destination, getMessageSelector(), isPubSubNoLocal()); - } - } - else { - return ((QueueSession) session).createReceiver((Queue) destination, getMessageSelector()); - } - } - - /** - * This implementation overrides the superclass method to avoid using - * JMS 1.1's Session {@code getAcknowledgeMode()} method. - * The best we can do here is to check the setting on the listener container. - */ - protected boolean isClientAcknowledge(Session session) throws JMSException { - return (getSessionAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE); - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102.java deleted file mode 100644 index 5c19d70311b..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.listener.adapter; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageProducer; -import javax.jms.Queue; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.Topic; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; - -import org.springframework.jms.support.JmsUtils; -import org.springframework.jms.support.converter.SimpleMessageConverter102; - -/** - * A {@link MessageListenerAdapter} subclass for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like MessageListenerAdapter itself. - * - *

This class can be used for JMS 1.0.2 providers, offering the same facility - * as MessageListenerAdapter does for JMS 1.1 providers. - * - * @author Juergen Hoeller - * @author Rick Evans - * @since 2.0 - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link MessageListenerAdapter} - */ -@Deprecated -public class MessageListenerAdapter102 extends MessageListenerAdapter { - - /** - * Create a new instance of the MessageListenerAdapter102 class - * with the default settings. - */ - public MessageListenerAdapter102() { - } - - /** - * Create a new instance of the MessageListenerAdapter102 class - * for the given delegate. - * @param delegate the target object to delegate message listening to - */ - public MessageListenerAdapter102(Object delegate) { - super(delegate); - } - - - /** - * Initialize the default implementations for the adapter's strategies: - * SimpleMessageConverter102. - * @see #setMessageConverter - * @see org.springframework.jms.support.converter.SimpleMessageConverter102 - */ - protected void initDefaultStrategies() { - setMessageConverter(new SimpleMessageConverter102()); - } - - /** - * Overrides the superclass method to use the JMS 1.0.2 API to send a response. - *

Uses the JMS pub-sub API if the given destination is a topic, - * else uses the JMS queue API. - */ - protected void sendResponse(Session session, Destination destination, Message response) throws JMSException { - MessageProducer producer = null; - try { - if (destination instanceof Topic) { - producer = ((TopicSession) session).createPublisher((Topic) destination); - postProcessProducer(producer, response); - ((TopicPublisher) producer).publish(response); - } - else { - producer = ((QueueSession) session).createSender((Queue) destination); - postProcessProducer(producer, response); - ((QueueSender) producer).send(response); - } - } - finally { - JmsUtils.closeMessageProducer(producer); - } - } - -} diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/SimpleMessageConverter102.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/SimpleMessageConverter102.java deleted file mode 100644 index 569b9cbedff..00000000000 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/SimpleMessageConverter102.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.support.converter; - -import java.io.ByteArrayOutputStream; - -import javax.jms.BytesMessage; -import javax.jms.JMSException; - -/** - * A subclass of {@link SimpleMessageConverter} for the JMS 1.0.2 specification, - * not relying on JMS 1.1 methods like SimpleMessageConverter itself. - * This class can be used for JMS 1.0.2 providers, offering the same functionality - * as SimpleMessageConverter does for JMS 1.1 providers. - * - *

The only difference to the default SimpleMessageConverter is that BytesMessage - * is handled differently: namely, without using the {@code getBodyLength()} - * method which has been introduced in JMS 1.1 and is therefore not available on a - * JMS 1.0.2 provider. - * - * @author Juergen Hoeller - * @since 1.1.1 - * @see javax.jms.BytesMessage#getBodyLength() - * @deprecated as of Spring 3.0, in favor of the JMS 1.1 based {@link SimpleMessageConverter} - */ -@Deprecated -public class SimpleMessageConverter102 extends SimpleMessageConverter { - - public static final int BUFFER_SIZE = 4096; - - - /** - * Overrides superclass method to copy bytes from the message into a - * ByteArrayOutputStream, using a buffer, to avoid using the - * {@code getBodyLength()} method which has been introduced in - * JMS 1.1 and is therefore not available on a JMS 1.0.2 provider. - * @see javax.jms.BytesMessage#getBodyLength() - */ - protected byte[] extractByteArrayFromMessage(BytesMessage message) throws JMSException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFFER_SIZE); - byte[] buffer = new byte[BUFFER_SIZE]; - int bufferCount = -1; - while ((bufferCount = message.readBytes(buffer)) >= 0) { - baos.write(buffer, 0, bufferCount); - if (bufferCount < BUFFER_SIZE) { - break; - } - } - return baos.toByteArray(); - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml b/spring-jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml index c9431ca417c..a0870f4cf5b 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml +++ b/spring-jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml @@ -52,7 +52,7 @@ - + diff --git a/spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java b/spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java index 77353d24dab..72624a7c62b 100644 --- a/spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java @@ -22,19 +22,13 @@ import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.QueueSession; import javax.jms.Session; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; -import javax.jms.TopicSession; import org.junit.After; import org.junit.Test; + import org.springframework.jms.StubQueue; import org.springframework.jms.core.JmsTemplate; -import org.springframework.jms.core.JmsTemplate102; import org.springframework.jms.core.MessageCreator; import org.springframework.jms.core.SessionCallback; import org.springframework.transaction.TransactionDefinition; @@ -331,57 +325,4 @@ public class JmsTransactionManagerTests { verify(con).close(); } - @Test - @Deprecated - public void testTransactionCommit102WithQueue() throws JMSException { - QueueConnectionFactory cf = mock(QueueConnectionFactory.class); - QueueConnection con = mock(QueueConnection.class); - final QueueSession session = mock(QueueSession.class); - - given(cf.createQueueConnection()).willReturn(con); - given(con.createQueueSession(true, Session.AUTO_ACKNOWLEDGE)).willReturn(session); - - JmsTransactionManager tm = new JmsTransactionManager102(cf, false); - TransactionStatus ts = tm.getTransaction(new DefaultTransactionDefinition()); - JmsTemplate jt = new JmsTemplate102(cf, false); - jt.execute(new SessionCallback() { - @Override - public Object doInJms(Session sess) { - assertTrue(sess == session); - return null; - } - }); - tm.commit(ts); - - verify(session).commit(); - verify(session).close(); - verify(con).close(); - } - - @Test - @Deprecated - public void testTransactionCommit102WithTopic() throws JMSException { - TopicConnectionFactory cf = mock(TopicConnectionFactory.class); - TopicConnection con = mock(TopicConnection.class); - final TopicSession session = mock(TopicSession.class); - - given(cf.createTopicConnection()).willReturn(con); - given(con.createTopicSession(true, Session.AUTO_ACKNOWLEDGE)).willReturn(session); - - JmsTransactionManager tm = new JmsTransactionManager102(cf, true); - TransactionStatus ts = tm.getTransaction(new DefaultTransactionDefinition()); - JmsTemplate jt = new JmsTemplate102(cf, true); - jt.execute(new SessionCallback() { - @Override - public Object doInJms(Session sess) { - assertTrue(sess == session); - return null; - } - }); - tm.commit(ts); - - verify(session).commit(); - verify(session).close(); - verify(con).close(); - } } diff --git a/spring-jms/src/test/java/org/springframework/jms/connection/SingleConnectionFactoryTests.java b/spring-jms/src/test/java/org/springframework/jms/connection/SingleConnectionFactoryTests.java index 3f323ec8b15..fe5e2ddb891 100644 --- a/spring-jms/src/test/java/org/springframework/jms/connection/SingleConnectionFactoryTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/connection/SingleConnectionFactoryTests.java @@ -309,50 +309,6 @@ public class SingleConnectionFactoryTests { assertEquals(1, listener.getCount()); } - @Test - public void testConnectionFactory102WithQueue() throws JMSException { - QueueConnectionFactory cf = mock(QueueConnectionFactory.class); - QueueConnection con = mock(QueueConnection.class); - - given(cf.createQueueConnection()).willReturn(con); - - SingleConnectionFactory scf = new SingleConnectionFactory102(cf, false); - QueueConnection con1 = scf.createQueueConnection(); - con1.start(); - con1.close(); // should be ignored - QueueConnection con2 = scf.createQueueConnection(); - con2.start(); - con2.close(); // should be ignored - scf.destroy(); // should trigger actual close - - verify(con).start(); - verify(con).stop(); - verify(con).close(); - verifyNoMoreInteractions(con); - } - - @Test - public void testConnectionFactory102WithTopic() throws JMSException { - TopicConnectionFactory cf = mock(TopicConnectionFactory.class); - TopicConnection con = mock(TopicConnection.class); - - given(cf.createTopicConnection()).willReturn(con); - - SingleConnectionFactory scf = new SingleConnectionFactory102(cf, true); - TopicConnection con1 = scf.createTopicConnection(); - con1.start(); - con1.close(); // should be ignored - TopicConnection con2 = scf.createTopicConnection(); - con2.start(); - con2.close(); // should be ignored - scf.destroy(); // should trigger actual close - - verify(con).start(); - verify(con).stop(); - verify(con).close(); - verifyNoMoreInteractions(con); - } - @Test public void testCachingConnectionFactory() throws JMSException { ConnectionFactory cf = mock(ConnectionFactory.class); diff --git a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102JtaTests.java b/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102JtaTests.java deleted file mode 100644 index cc3d345871f..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102JtaTests.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.core; - -/** - * @author Juergen Hoeller - * @since 06.01.2005 - */ -public class JmsTemplate102JtaTests extends JmsTemplate102Tests { - - @Override - protected boolean useTransactedSession() { - return true; - } - - @Override - protected boolean useTransactedTemplate() { - return false; - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102Tests.java b/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102Tests.java deleted file mode 100644 index 6b9e83581ed..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102Tests.java +++ /dev/null @@ -1,987 +0,0 @@ -/* - * 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.jms.core; - -import javax.jms.DeliveryMode; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Queue; -import javax.jms.QueueConnection; -import javax.jms.QueueConnectionFactory; -import javax.jms.QueueReceiver; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.TextMessage; -import javax.jms.Topic; -import javax.jms.TopicConnection; -import javax.jms.TopicConnectionFactory; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; -import javax.jms.TopicSubscriber; -import javax.naming.Context; -import javax.naming.NamingException; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.jms.InvalidClientIDException; -import org.springframework.jms.InvalidDestinationException; -import org.springframework.jms.InvalidSelectorException; -import org.springframework.jms.JmsException; -import org.springframework.jms.JmsSecurityException; -import org.springframework.jms.MessageEOFException; -import org.springframework.jms.MessageFormatException; -import org.springframework.jms.MessageNotReadableException; -import org.springframework.jms.MessageNotWriteableException; -import org.springframework.jms.ResourceAllocationException; -import org.springframework.jms.TransactionInProgressException; -import org.springframework.jms.TransactionRolledBackException; -import org.springframework.jms.UncategorizedJmsException; -import org.springframework.jms.support.converter.SimpleMessageConverter; -import org.springframework.jms.support.destination.JndiDestinationResolver; -import org.springframework.jndi.JndiTemplate; - -import static org.junit.Assert.*; -import static org.mockito.BDDMockito.*; - -/** - * Unit tests for the JmsTemplate implemented using JMS 1.0.2. - * - * @author Andre Biryukov - * @author Mark Pollack - */ -public class JmsTemplate102Tests { - - private Context jndiContext; - private QueueConnectionFactory queueConnectionFactory; - private QueueConnection queueConnection; - private QueueSession queueSession; - private Queue queue; - private TopicConnectionFactory topicConnectionFactory; - private TopicConnection topicConnection; - private TopicSession topicSession; - private Topic topic; - - private int deliveryMode = DeliveryMode.PERSISTENT; - private int priority = 9; - private int timeToLive = 10000; - - - @Before - public void setUpMocks() throws Exception { - jndiContext = mock(Context.class); - createMockForQueues(); - createMockForTopics(); - } - - private void createMockForTopics() throws JMSException, NamingException { - topicConnectionFactory = mock(TopicConnectionFactory.class); - topicConnection = mock(TopicConnection.class); - topic = mock(Topic.class); - topicSession = mock(TopicSession.class); - - given(topicConnectionFactory.createTopicConnection()).willReturn(topicConnection); - given(topicConnection.createTopicSession(useTransactedTemplate(), - Session.AUTO_ACKNOWLEDGE)).willReturn(topicSession); - given(topicSession.getTransacted()).willReturn(useTransactedSession()); - given(jndiContext.lookup("testTopic")).willReturn(topic); - } - - private void createMockForQueues() throws JMSException, NamingException { - queueConnectionFactory = mock(QueueConnectionFactory.class); - queueConnection = mock(QueueConnection.class); - queue = mock(Queue.class); - queueSession = mock(QueueSession.class); - - given(queueConnectionFactory.createQueueConnection()).willReturn(queueConnection); - given(queueConnection.createQueueSession(useTransactedTemplate(), - Session.AUTO_ACKNOWLEDGE)).willReturn(queueSession); - given(queueSession.getTransacted()).willReturn(useTransactedSession()); - given(jndiContext.lookup("testQueue")).willReturn(queue); - } - - private JmsTemplate102 createTemplate() { - JmsTemplate102 template = new JmsTemplate102(); - JndiDestinationResolver destMan = new JndiDestinationResolver(); - destMan.setJndiTemplate(new JndiTemplate() { - @Override - protected Context createInitialContext() { - return jndiContext; - } - }); - template.setDestinationResolver(destMan); - template.setSessionTransacted(useTransactedTemplate()); - return template; - } - - protected boolean useTransactedSession() { - return false; - } - - protected boolean useTransactedTemplate() { - return false; - } - - - @Test - public void testTopicSessionCallback() throws Exception { - JmsTemplate102 template = createTemplate(); - template.setPubSubDomain(true); - template.setConnectionFactory(topicConnectionFactory); - template.afterPropertiesSet(); - - template.execute(new SessionCallback() { - @Override - public Object doInJms(Session session) throws JMSException { - session.getTransacted(); - return null; - } - }); - - verify(topicSession).close(); - verify(topicConnection).close(); - } - - /** - * Test the execute(ProducerCallback) using a topic. - */ - @Test - public void testTopicProducerCallback() throws Exception { - JmsTemplate102 template = createTemplate(); - template.setPubSubDomain(true); - template.setConnectionFactory(topicConnectionFactory); - template.afterPropertiesSet(); - - TopicPublisher topicPublisher = mock(TopicPublisher.class); - - given(topicSession.createPublisher(null)).willReturn(topicPublisher); - given(topicPublisher.getPriority()).willReturn(4); - - template.execute(new ProducerCallback() { - @Override - public Object doInJms(Session session, MessageProducer producer) throws JMSException { - session.getTransacted(); - producer.getPriority(); - return null; - } - }); - - verify(topicPublisher).close(); - verify(topicSession).close(); - verify(topicConnection).close(); - } - - /** - * Test the execute(ProducerCallback) using a topic. - */ - @Test - public void testTopicProducerCallbackWithIdAndTimestampDisabled() throws Exception { - JmsTemplate102 template = createTemplate(); - template.setPubSubDomain(true); - template.setConnectionFactory(topicConnectionFactory); - template.setMessageIdEnabled(false); - template.setMessageTimestampEnabled(false); - template.afterPropertiesSet(); - - TopicPublisher topicPublisher = mock(TopicPublisher.class); - - given(topicSession.createPublisher(null)).willReturn(topicPublisher); - given(topicPublisher.getPriority()).willReturn(4); - - template.execute(new ProducerCallback() { - @Override - public Object doInJms(Session session, MessageProducer producer) throws JMSException { - boolean b = session.getTransacted(); - int i = producer.getPriority(); - return null; - } - }); - - verify(topicPublisher).setDisableMessageID(true); - verify(topicPublisher).setDisableMessageTimestamp(true); - verify(topicPublisher).close(); - verify(topicSession).close(); - verify(topicConnection).close(); - } - - /** - * Test the method execute(SessionCallback action) with using the - * point to point domain as specified by the value of isPubSubDomain = false. - */ - @Test - public void testQueueSessionCallback() throws Exception { - JmsTemplate102 template = createTemplate(); - // Point-to-Point (queues) are the default domain - template.setConnectionFactory(queueConnectionFactory); - template.afterPropertiesSet(); - - template.execute(new SessionCallback() { - @Override - public Object doInJms(Session session) throws JMSException { - boolean b = session.getTransacted(); - return null; - } - }); - - verify(queueSession).close(); - verify(queueConnection).close(); - } - - /** - * Test the method execute(ProducerCallback) with a Queue. - */ - @Test - public void testQueueProducerCallback() throws Exception { - JmsTemplate102 template = createTemplate(); - // Point-to-Point (queues) are the default domain. - template.setConnectionFactory(queueConnectionFactory); - template.afterPropertiesSet(); - - QueueSender queueSender = mock(QueueSender.class); - - given(queueSession.createSender(null)).willReturn(queueSender); - given(queueSender.getPriority()).willReturn(4); - - template.execute(new ProducerCallback() { - @Override - public Object doInJms(Session session, MessageProducer producer) - throws JMSException { - boolean b = session.getTransacted(); - int i = producer.getPriority(); - return null; - } - }); - - verify(queueSender).close(); - verify(queueSession).close(); - verify(queueConnection).close(); - } - - @Test - public void testQueueProducerCallbackWithIdAndTimestampDisabled() throws Exception { - JmsTemplate102 template = createTemplate(); - // Point-to-Point (queues) are the default domain. - template.setConnectionFactory(queueConnectionFactory); - template.setMessageIdEnabled(false); - template.setMessageTimestampEnabled(false); - template.afterPropertiesSet(); - - QueueSender queueSender = mock(QueueSender.class); - - given(queueSession.createSender(null)).willReturn(queueSender); - given(queueSender.getPriority()).willReturn(4); - - template.execute(new ProducerCallback() { - @Override - public Object doInJms(Session session, MessageProducer producer) throws JMSException { - boolean b = session.getTransacted(); - int i = producer.getPriority(); - return null; - } - }); - - verify(queueSender).setDisableMessageID(true); - verify(queueSender).setDisableMessageTimestamp(true); - verify(queueSender).close(); - verify(queueSession).close(); - verify(queueConnection).close(); - } - - /** - * Test the setting of the JmsTemplate properties. - */ - @Test - public void testBeanProperties() throws Exception { - JmsTemplate102 template = createTemplate(); - template.setConnectionFactory(queueConnectionFactory); - - assertTrue("connection factory ok", template.getConnectionFactory() == queueConnectionFactory); - - JmsTemplate102 s102 = createTemplate(); - try { - s102.afterPropertiesSet(); - fail("IllegalArgumentException not thrown. ConnectionFactory should be set"); - } - catch (IllegalArgumentException ex) { - // expected - } - - // The default is for the JmsTemplate102 to send to queues. - // Test to make sure exeception is thrown and has reasonable message. - s102 = createTemplate(); - s102.setConnectionFactory(topicConnectionFactory); - try { - s102.afterPropertiesSet(); - fail("IllegalArgumentException not thrown. Mismatch of Destination and ConnectionFactory types."); - } - catch (IllegalArgumentException ex) { - // expected - } - - s102 = createTemplate(); - s102.setConnectionFactory(queueConnectionFactory); - s102.setPubSubDomain(true); - try { - s102.afterPropertiesSet(); - fail("IllegalArgumentException not thrown. Mismatch of Destination and ConnectionFactory types."); - } - catch (IllegalArgumentException ex) { - // expected - } - } - - /** - * Test the method send(String destination, MessgaeCreator c) using - * a queue and default QOS values. - */ - @Test - public void testSendStringQueue() throws Exception { - sendQueue(true, false, false, true); - } - - /** - * Test the method send(String destination, MessageCreator c) when - * explicit QOS parameters are enabled, using a queue. - */ - @Test - public void testSendStringQueueWithQOS() throws Exception { - sendQueue(false, false, false, false); - } - - /** - * Test the method send(MessageCreator c) using default QOS values. - */ - @Test - public void testSendDefaultDestinationQueue() throws Exception { - sendQueue(true, false, true, true); - } - - /** - * Test the method send(MessageCreator c) using explicit QOS values. - */ - @Test - public void testSendDefaultDestinationQueueWithQOS() throws Exception { - sendQueue(false, false, true, false); - } - - /** - * Test the method send(String destination, MessageCreator c) using - * a topic and default QOS values. - */ - @Test - public void testSendStringTopic() throws Exception { - sendTopic(true, false); - } - - /** - * Test the method send(String destination, MessageCreator c) using explicit - * QOS values. - */ - @Test - public void testSendStringTopicWithQOS() throws Exception { - sendTopic(false, false); - } - - /** - * Test the method send(Destination queue, MessgaeCreator c) using - * a queue and default QOS values. - */ - @Test - public void testSendQueue() throws Exception { - sendQueue(true, false, false, true); - } - - /** - * Test the method send(Destination queue, MessageCreator c) sing explicit - * QOS values. - */ - @Test - public void testSendQueueWithQOS() throws Exception { - sendQueue(false, false, false, false); - } - - /** - * Test the method send(Destination queue, MessgaeCreator c) using - * a topic and default QOS values. - */ - @Test - public void testSendTopic() throws Exception { - sendTopic(true, false); - } - - /** - * Test the method send(Destination queue, MessageCreator c) using explicity - * QOS values. - */ - @Test - public void testSendTopicWithQOS() throws Exception { - sendQueue(false, false, false, true); - } - - /** - * Common method for testing a send method that uses the MessageCreator - * callback but with different QOS options. - */ - private void sendQueue( - boolean ignoreQOS, boolean explicitQueue, boolean useDefaultDestination, boolean disableIdAndTimestamp) - throws Exception { - - JmsTemplate102 template = createTemplate(); - template.setConnectionFactory(queueConnectionFactory); - template.afterPropertiesSet(); - - if (useDefaultDestination) { - template.setDefaultDestination(queue); - } - if (disableIdAndTimestamp) { - template.setMessageIdEnabled(false); - template.setMessageTimestampEnabled(false); - } - - QueueSender queueSender = mock(QueueSender.class); - TextMessage message = mock(TextMessage.class); - - - given(queueSession.createSender(this.queue)).willReturn(queueSender); - given(queueSession.createTextMessage("just testing")).willReturn(message); - - if (!ignoreQOS) { - template.setExplicitQosEnabled(true); - template.setDeliveryMode(deliveryMode); - template.setPriority(priority); - template.setTimeToLive(timeToLive); - } - - if (useDefaultDestination) { - template.send(new MessageCreator() { - @Override - public Message createMessage(Session session) throws JMSException { - return session.createTextMessage("just testing"); - } - }); - } - else { - if (explicitQueue) { - template.send(queue, new MessageCreator() { - @Override - public Message createMessage(Session session) throws JMSException { - return session.createTextMessage("just testing"); - } - }); - } - else { - template.send("testQueue", new MessageCreator() { - @Override - public Message createMessage(Session session) - throws JMSException { - return session.createTextMessage("just testing"); - } - }); - } - } - - if (disableIdAndTimestamp) { - verify(queueSender).setDisableMessageID(true); - verify(queueSender).setDisableMessageTimestamp(true); - } - - if (useTransactedTemplate()) { - verify(queueSession).commit(); - } - - if (ignoreQOS) { - verify(queueSender).send(message); - } - else { - verify(queueSender).send(message, deliveryMode, priority, timeToLive); - } - - verify(queueSender).close(); - verify(queueSession).close(); - verify(queueConnection).close(); - } - - private void sendTopic(boolean ignoreQOS, boolean explicitTopic) throws Exception { - JmsTemplate102 template = createTemplate(); - template.setPubSubDomain(true); - template.setConnectionFactory(topicConnectionFactory); - template.afterPropertiesSet(); - - TopicPublisher topicPublisher = mock(TopicPublisher.class); - TextMessage message = mock(TextMessage.class); - - given(topicSession.createPublisher(this.topic)).willReturn(topicPublisher); - given(topicSession.createTextMessage("just testing")).willReturn(message); - - if (ignoreQOS) { - topicPublisher.publish(message); - } - else { - template.setExplicitQosEnabled(true); - template.setDeliveryMode(deliveryMode); - template.setPriority(priority); - template.setTimeToLive(timeToLive); - topicPublisher.publish(message, deliveryMode, priority, timeToLive); - } - - template.setPubSubDomain(true); - - if (explicitTopic) { - template.send(topic, new MessageCreator() { - @Override - public Message createMessage(Session session) - throws JMSException { - return session.createTextMessage("just testing"); - } - }); - } - else { - template.send("testTopic", new MessageCreator() { - @Override - public Message createMessage(Session session) - throws JMSException { - return session.createTextMessage("just testing"); - } - }); - } - - if (useTransactedTemplate()) { - verify(topicSession).commit(); - } - verify(topicPublisher).close(); - verify(topicSession).close(); - verify(topicConnection).close(); - verify(jndiContext).close(); - } - - @Test - public void testConverter() throws Exception { - JmsTemplate102 template = createTemplate(); - template.setConnectionFactory(queueConnectionFactory); - template.setMessageConverter(new SimpleMessageConverter()); - String s = "Hello world"; - - QueueSender queueSender = mock(QueueSender.class); - TextMessage message = mock(TextMessage.class); - - given(queueSession.createSender(this.queue)).willReturn(queueSender); - given(queueSession.createTextMessage("Hello world")).willReturn(message); - - template.convertAndSend(queue, s); - - if (useTransactedTemplate()) { - verify(queueSession).commit(); - } - verify(queueSender).send(message); - verify(queueSender).close(); - verify(queueSession).close(); - verify(queueConnection).close(); - } - - @Test - public void testQueueReceiveDefaultDestination() throws Exception { - doTestReceive(false, false, true, false, false, false, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveDestination() throws Exception { - doTestReceive(false, true, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveDestinationWithClientAcknowledge() throws Exception { - doTestReceive(false, true, false, false, true, false, false, 1000); - } - - @Test - public void testQueueReceiveStringDestination() throws Exception { - doTestReceive(false, false, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); - } - - @Test - public void testQueueReceiveDefaultDestinationWithSelector() throws Exception { - doTestReceive(false, false, true, false, false, true, true, 1000); - } - - @Test - public void testQueueReceiveDestinationWithSelector() throws Exception { - doTestReceive(false, true, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); - } - - @Test - public void testQueueReceiveDestinationWithClientAcknowledgeWithSelector() throws Exception { - doTestReceive(false, true, false, false, true, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveStringDestinationWithSelector() throws Exception { - doTestReceive(false, false, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveAndConvertDefaultDestination() throws Exception { - doTestReceive(false, false, true, true, false, false, false, 1000); - } - - @Test - public void testQueueReceiveAndConvertStringDestination() throws Exception { - doTestReceive(false, false, false, true, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveAndConvertDestination() throws Exception { - doTestReceive(false, true, false, true, false, false, true, 1000); - } - - @Test - public void testQueueReceiveAndConvertDefaultDestinationWithSelector() throws Exception { - doTestReceive(false, false, true, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); - } - - @Test - public void testQueueReceiveAndConvertStringDestinationWithSelector() throws Exception { - doTestReceive(false, false, false, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testQueueReceiveAndConvertDestinationWithSelector() throws Exception { - doTestReceive(false, true, false, true, false, true, false, 1000); - } - - @Test - public void testTopicReceiveDefaultDestination() throws Exception { - doTestReceive(true, false, true, false, false, false, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveDestination() throws Exception { - doTestReceive(true, true, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveDestinationWithClientAcknowledge() throws Exception { - doTestReceive(true, true, false, false, true, false, false, 1000); - } - - @Test - public void testTopicReceiveStringDestination() throws Exception { - doTestReceive(true, false, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); - } - - @Test - public void testTopicReceiveDefaultDestinationWithSelector() throws Exception { - doTestReceive(true, false, true, false, false, true, true, 1000); - } - - @Test - public void testTopicReceiveDestinationWithSelector() throws Exception { - doTestReceive(true, true, false, false, false, true, false, 1000); - } - - @Test - public void testTopicReceiveDestinationWithClientAcknowledgeWithSelector() throws Exception { - doTestReceive(true, true, false, false, true, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveStringDestinationWithSelector() throws Exception { - doTestReceive(true, false, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveAndConvertDefaultDestination() throws Exception { - doTestReceive(true, false, true, true, false, false, false, 1000); - } - - @Test - public void testTopicReceiveAndConvertStringDestination() throws Exception { - doTestReceive(true, false, false, true, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveAndConvertDestination() throws Exception { - doTestReceive(true, true, false, true, false, false, true, 1000); - } - - @Test - public void testTopicReceiveAndConvertDefaultDestinationWithSelector() throws Exception { - doTestReceive(true, false, true, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); - } - - @Test - public void testTopicReceiveAndConvertStringDestinationWithSelector() throws Exception { - doTestReceive(true, false, false, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT); - } - - @Test - public void testTopicReceiveAndConvertDestinationWithSelector() throws Exception { - doTestReceive(true, true, false, true, false, true, false, 1000); - } - - private void doTestReceive( - boolean pubSub, - boolean explicitDestination, boolean useDefaultDestination, boolean testConverter, - boolean clientAcknowledge, boolean messageSelector, boolean noLocal, long timeout) - throws Exception { - - JmsTemplate102 template = createTemplate(); - template.setPubSubDomain(pubSub); - template.setConnectionFactory(pubSub ? topicConnectionFactory : queueConnectionFactory); - - // Override the default settings for client ack used in the test setup. - // Can't use Session.getAcknowledgeMode() - if (pubSub) { - reset(topicConnection); - if (clientAcknowledge) { - template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); - given(topicConnection.createTopicSession( - useTransactedTemplate(), Session.CLIENT_ACKNOWLEDGE)).willReturn(topicSession); - } - else { - template.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); - given(topicConnection.createTopicSession( - useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE)).willReturn(topicSession); - } - } - else { - reset(queueConnection); - if (clientAcknowledge) { - template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); - given(queueConnection.createQueueSession( - useTransactedTemplate(), Session.CLIENT_ACKNOWLEDGE)).willReturn(queueSession); - } - else { - template.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); - given(queueConnection.createQueueSession( - useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE)).willReturn(queueSession); - } - } - - Destination dest = pubSub ? (Destination) topic : (Destination) queue; - - if (useDefaultDestination) { - template.setDefaultDestination(dest); - } - if (noLocal) { - template.setPubSubNoLocal(true); - } - template.setReceiveTimeout(timeout); - - - String selectorString = "selector"; - MessageConsumer messageConsumer = null; - - if (pubSub) { - TopicSubscriber topicSubscriber = mock(TopicSubscriber.class); - messageConsumer = topicSubscriber; - given(topicSession.createSubscriber(topic, - messageSelector ? selectorString : null, noLocal)).willReturn(topicSubscriber); - } - else { - QueueReceiver queueReceiver = mock(QueueReceiver.class); - messageConsumer = queueReceiver; - given(queueSession.createReceiver(queue, - messageSelector ? selectorString : null)).willReturn(queueReceiver); - } - - TextMessage textMessage = mock(TextMessage.class); - - if (testConverter) { - given(textMessage.getText()).willReturn("Hello World!"); - } - - if (timeout == JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT) { - given(messageConsumer.receiveNoWait()).willReturn(textMessage); - } - else if (timeout == JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT) { - given(messageConsumer.receive()).willReturn(textMessage); - } - else { - given(messageConsumer.receive(timeout)).willReturn(textMessage); - } - - Message message = null; - String textFromMessage = null; - - if (useDefaultDestination) { - if (testConverter) { - textFromMessage = (String) - (messageSelector ? template.receiveSelectedAndConvert(selectorString) : - template.receiveAndConvert()); - } - else { - message = (messageSelector ? template.receiveSelected(selectorString) : template.receive()); - } - } - else if (explicitDestination) { - if (testConverter) { - textFromMessage = (String) - (messageSelector ? template.receiveSelectedAndConvert(dest, selectorString) : - template.receiveAndConvert(dest)); - } - else { - message = (messageSelector ? template.receiveSelected(dest, selectorString) : - template.receive(dest)); - } - } - else { - String destinationName = (pubSub ? "testTopic" : "testQueue"); - if (testConverter) { - textFromMessage = (String) - (messageSelector ? template.receiveSelectedAndConvert(destinationName, selectorString) : - template.receiveAndConvert(destinationName)); - } - else { - message = (messageSelector ? template.receiveSelected(destinationName, selectorString) : - template.receive(destinationName)); - } - } - - if (testConverter) { - assertEquals("Message text should be equal", "Hello World!", textFromMessage); - } - else { - assertEquals("Messages should refer to the same object", message, textMessage); - } - - if (pubSub) { - verify(topicConnection).start(); - verify(topicConnection).close(); - verify(topicSession).close(); - } - else { - verify(queueConnection).start(); - verify(queueConnection).close(); - verify(queueSession).close(); - } - - - if (useTransactedTemplate()) { - if (pubSub) { - verify(topicSession).commit(); - } - else { - verify(queueSession).commit(); - } - } - - if (!useTransactedSession() && clientAcknowledge) { - verify(textMessage).acknowledge(); - } - - verify(messageConsumer).close(); - } - - @Test - public void testIllegalStateException() throws Exception { - doTestJmsException(new javax.jms.IllegalStateException(""), org.springframework.jms.IllegalStateException.class); - } - - @Test - public void testInvalidClientIDException() throws Exception { - doTestJmsException(new javax.jms.InvalidClientIDException(""), InvalidClientIDException.class); - } - - @Test - public void testInvalidDestinationException() throws Exception { - doTestJmsException(new javax.jms.InvalidDestinationException(""), InvalidDestinationException.class); - } - - @Test - public void testInvalidSelectorException() throws Exception { - doTestJmsException(new javax.jms.InvalidSelectorException(""), InvalidSelectorException.class); - } - - @Test - public void testJmsSecurityException() throws Exception { - doTestJmsException(new javax.jms.JMSSecurityException(""), JmsSecurityException.class); - } - - @Test - public void testMessageEOFException() throws Exception { - doTestJmsException(new javax.jms.MessageEOFException(""), MessageEOFException.class); - } - - @Test - public void testMessageFormatException() throws Exception { - doTestJmsException(new javax.jms.MessageFormatException(""), MessageFormatException.class); - } - - @Test - public void testMessageNotReadableException() throws Exception { - doTestJmsException(new javax.jms.MessageNotReadableException(""), MessageNotReadableException.class); - } - - @Test - public void testMessageNotWriteableException() throws Exception { - doTestJmsException(new javax.jms.MessageNotWriteableException(""), MessageNotWriteableException.class); - } - - @Test - public void testResourceAllocationException() throws Exception { - doTestJmsException(new javax.jms.ResourceAllocationException(""), ResourceAllocationException.class); - } - - @Test - public void testTransactionInProgressException() throws Exception { - doTestJmsException(new javax.jms.TransactionInProgressException(""), TransactionInProgressException.class); - } - - @Test - public void testTransactionRolledBackException() throws Exception { - doTestJmsException(new javax.jms.TransactionRolledBackException(""), TransactionRolledBackException.class); - } - - @Test - public void testUncategorizedJmsException() throws Exception { - doTestJmsException(new javax.jms.JMSException(""), UncategorizedJmsException.class); - } - - protected void doTestJmsException(JMSException original, Class thrownExceptionClass) throws Exception { - JmsTemplate template = createTemplate(); - template.setConnectionFactory(queueConnectionFactory); - template.setMessageConverter(new SimpleMessageConverter()); - String s = "Hello world"; - - QueueSender queueSender = mock(QueueSender.class); - TextMessage textMessage = mock(TextMessage.class); - - reset(queueSession); - given(queueSession.createSender(queue)).willReturn(queueSender); - given(queueSession.createTextMessage("Hello world")).willReturn(textMessage); - - willThrow(original).given(queueSender).send(textMessage); - - try { - template.convertAndSend(queue, s); - fail("Should have thrown JmsException"); - } - catch (JmsException wrappedEx) { - // expected - assertEquals(thrownExceptionClass, wrappedEx.getClass()); - assertEquals(original, wrappedEx.getCause()); - } - - verify(queueSender).close(); - verify(queueSession).close(); - verify(queueConnection).close(); - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102TransactedTests.java b/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102TransactedTests.java deleted file mode 100644 index f83c7081982..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/core/JmsTemplate102TransactedTests.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.core; - -/** - * @author Juergen Hoeller - * @since 06.01.2005 - */ -public class JmsTemplate102TransactedTests extends JmsTemplate102Tests { - - @Override - protected boolean useTransactedSession() { - return true; - } - - @Override - protected boolean useTransactedTemplate() { - return true; - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102Tests.java b/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102Tests.java deleted file mode 100644 index 1d633b4e5f4..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapter102Tests.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * 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.jms.listener.adapter; - -import java.io.ByteArrayInputStream; - -import javax.jms.BytesMessage; -import javax.jms.InvalidDestinationException; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Queue; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.TextMessage; -import javax.jms.Topic; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; - -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.springframework.jms.support.converter.SimpleMessageConverter102; - -import static org.junit.Assert.*; -import static org.mockito.BDDMockito.*; - -/** - * Unit tests for the {@link MessageListenerAdapter102} class. - * - * @author Rick Evans - * @author Chris Beams - */ -@Deprecated -public final class MessageListenerAdapter102Tests { - - private static final String TEXT = "The Runaways"; - private static final String CORRELATION_ID = "100"; - private static final String RESPONSE_TEXT = "Old Lace"; - - - @Test - public void testWithMessageContentsDelegateForBytesMessage() throws Exception { - - BytesMessage bytesMessage = mock(BytesMessage.class); - // BytesMessage contents must be unwrapped... - given(bytesMessage.readBytes(any(byte[].class))).willAnswer(new Answer() { - @Override - public Integer answer(InvocationOnMock invocation) throws Throwable { - byte[] bytes = (byte[]) invocation.getArguments()[0]; - ByteArrayInputStream inputStream = new ByteArrayInputStream(TEXT.getBytes()); - return inputStream.read(bytes); - } - }); - MessageContentsDelegate delegate = mock(MessageContentsDelegate.class); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate); - adapter.onMessage(bytesMessage); - - verify(delegate).handleMessage(TEXT.getBytes()); - } - - @Test - public void testWithMessageDelegate() throws Exception { - - TextMessage textMessage = mock(TextMessage.class); - MessageDelegate delegate = mock(MessageDelegate.class); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate); - // we DON'T want the default SimpleMessageConversion happening... - adapter.setMessageConverter(null); - adapter.onMessage(textMessage); - - verify(delegate).handleMessage(textMessage); - } - - @Test - public void testThatTheDefaultMessageConverterisIndeedTheSimpleMessageConverter102() throws Exception { - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(); - assertNotNull("The default [MessageConverter] must never be null.", adapter.getMessageConverter()); - assertTrue("The default [MessageConverter] must be of the type [SimpleMessageConverter102]; if you've just changed it, then change this test to reflect your change.", adapter.getMessageConverter() instanceof SimpleMessageConverter102); - } - - @Test - public void testWithResponsiveMessageDelegate_DoesNotSendReturnTextMessageIfNoSessionSupplied() throws Exception { - - TextMessage textMessage = mock(TextMessage.class); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(textMessage)).willReturn(TEXT); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate); - // we DON'T want the default SimpleMessageConversion happening... - adapter.setMessageConverter(null); - adapter.onMessage(textMessage); - - verify(delegate).handleMessage(textMessage); - } - - @Test - public void testWithResponsiveMessageDelegateWithDefaultDestination_SendsReturnTextMessageWhenSessionSuppliedForQueue() throws Exception { - - Queue destination = mock(Queue.class); - - TextMessage sentTextMessage = mock(TextMessage.class); - // correlation ID is queried when response is being created... - given(sentTextMessage.getJMSCorrelationID()).willReturn(CORRELATION_ID); - // Reply-To is queried when response is being created... - given(sentTextMessage.getJMSReplyTo()).willReturn(null); - - TextMessage responseTextMessage = mock(TextMessage.class); - QueueSender queueSender = mock(QueueSender.class); - QueueSession session = mock(QueueSession.class); - given(session.createTextMessage(RESPONSE_TEXT)).willReturn(responseTextMessage); - given(session.createSender(destination)).willReturn(queueSender); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(sentTextMessage)).willReturn(RESPONSE_TEXT); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - adapter.setDefaultResponseDestination(destination); - adapter.onMessage(sentTextMessage, session); - - verify(responseTextMessage).setJMSCorrelationID(CORRELATION_ID); - verify(queueSender).send(responseTextMessage); - verify(queueSender).close(); - verify(delegate).handleMessage(sentTextMessage); - } - - @Test - public void testWithResponsiveMessageDelegateWithDefaultDestination_SendsReturnTextMessageWhenSessionSuppliedForTopic() throws Exception { - - Topic destination = mock(Topic.class); - TextMessage sentTextMessage = mock(TextMessage.class); - // correlation ID is queried when response is being created... - given(sentTextMessage.getJMSCorrelationID()).willReturn(CORRELATION_ID); - // Reply-To is queried when response is being created... - given(sentTextMessage.getJMSReplyTo()).willReturn(null); // we want to fall back to the default... - - TextMessage responseTextMessage = mock(TextMessage.class); - TopicPublisher topicPublisher = mock(TopicPublisher.class); - TopicSession session = mock(TopicSession.class); - given(session.createTextMessage(RESPONSE_TEXT)).willReturn(responseTextMessage); - given(session.createPublisher(destination)).willReturn(topicPublisher); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(sentTextMessage)).willReturn(RESPONSE_TEXT); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - adapter.setDefaultResponseDestination(destination); - adapter.onMessage(sentTextMessage, session); - - verify(responseTextMessage).setJMSCorrelationID(CORRELATION_ID); - verify(topicPublisher).publish(responseTextMessage); - verify(topicPublisher).close(); - verify(delegate).handleMessage(sentTextMessage); - } - - @Test - public void testWithResponsiveMessageDelegateNoDefaultDestination_SendsReturnTextMessageWhenSessionSupplied() throws Exception { - - Queue destination = mock(Queue.class); - TextMessage sentTextMessage = mock(TextMessage.class); - // correlation ID is queried when response is being created... - given(sentTextMessage.getJMSCorrelationID()).willReturn(CORRELATION_ID); - // Reply-To is queried when response is being created... - given(sentTextMessage.getJMSReplyTo()).willReturn(destination); - - TextMessage responseTextMessage = mock(TextMessage.class); - QueueSender queueSender = mock(QueueSender.class); - QueueSession session = mock(QueueSession.class); - given(session.createTextMessage(RESPONSE_TEXT)).willReturn(responseTextMessage); - given(session.createSender(destination)).willReturn(queueSender); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(sentTextMessage)).willReturn(RESPONSE_TEXT); - - MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - adapter.onMessage(sentTextMessage, session); - - - verify(responseTextMessage).setJMSCorrelationID(CORRELATION_ID); - verify(queueSender).send(responseTextMessage); - verify(queueSender).close(); - verify(delegate).handleMessage(sentTextMessage); - } - - @Test - public void testWithResponsiveMessageDelegateNoDefaultDestinationAndNoReplyToDestination_SendsReturnTextMessageWhenSessionSupplied() throws Exception { - - final TextMessage sentTextMessage = mock(TextMessage.class); - // correlation ID is queried when response is being created... - given(sentTextMessage.getJMSCorrelationID()).willReturn(CORRELATION_ID); - // Reply-To is queried when response is being created... - given(sentTextMessage.getJMSReplyTo()).willReturn(null); - - TextMessage responseTextMessage = mock(TextMessage.class); - - final QueueSession session = mock(QueueSession.class); - given(session.createTextMessage(RESPONSE_TEXT)).willReturn(responseTextMessage); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(sentTextMessage)).willReturn(RESPONSE_TEXT); - - final MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - try { - adapter.onMessage(sentTextMessage, session); - fail("expected InvalidDestinationException"); - } catch (InvalidDestinationException ex) { /* expected */ } - - verify(responseTextMessage).setJMSCorrelationID(CORRELATION_ID); - verify(delegate).handleMessage(sentTextMessage); - } - - @Test - public void testWithResponsiveMessageDelegateNoDefaultDestination_SendsReturnTextMessageWhenSessionSupplied_AndSendingThrowsJMSException() throws Exception { - - Queue destination = mock(Queue.class); - final TextMessage sentTextMessage = mock(TextMessage.class); - // correlation ID is queried when response is being created... - given(sentTextMessage.getJMSCorrelationID()).willReturn(CORRELATION_ID); - // Reply-To is queried when response is being created... - given(sentTextMessage.getJMSReplyTo()).willReturn(destination); - - TextMessage responseTextMessage = mock(TextMessage.class); - QueueSender queueSender = mock(QueueSender.class); - willThrow(new JMSException("Doe!")).given(queueSender).send(responseTextMessage); - // ensure that regardless of a JMSException the producer is closed... - - final QueueSession session = mock(QueueSession.class); - given(session.createTextMessage(RESPONSE_TEXT)).willReturn(responseTextMessage); - given(session.createSender(destination)).willReturn(queueSender); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - given(delegate.handleMessage(sentTextMessage)).willReturn(RESPONSE_TEXT); - - final MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - try { - adapter.onMessage(sentTextMessage, session); - fail("expected JMSException"); - } catch (JMSException ex) { /* expected */ } - - - verify(responseTextMessage).setJMSCorrelationID(CORRELATION_ID); - verify(queueSender).close(); - verify(delegate).handleMessage(sentTextMessage); - } - - @Test - public void testWithResponsiveMessageDelegateDoesNotSendReturnTextMessageWhenSessionSupplied_AndListenerMethodThrowsException() throws Exception { - - final TextMessage sentTextMessage = mock(TextMessage.class); - final QueueSession session = mock(QueueSession.class); - - ResponsiveMessageDelegate delegate = mock(ResponsiveMessageDelegate.class); - willThrow(new IllegalArgumentException("Doe!")).given(delegate).handleMessage(sentTextMessage); - - final MessageListenerAdapter102 adapter = new MessageListenerAdapter102(delegate) { - @Override - protected Object extractMessage(Message message) { - return message; - } - }; - try { - adapter.onMessage(sentTextMessage, session); - fail("expected ListenerExecutionFailedException"); - } catch (ListenerExecutionFailedException ex) { /* expected */ } - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/StubMessageListenerAdapter102.java b/spring-jms/src/test/java/org/springframework/jms/listener/adapter/StubMessageListenerAdapter102.java deleted file mode 100644 index 646ee8a6948..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/StubMessageListenerAdapter102.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2002-2012 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.jms.listener.adapter; - -/** - * Stub extension of the {@link MessageListenerAdapter102} class for use in testing. - * - * @author Rick Evans - */ -public class StubMessageListenerAdapter102 extends MessageListenerAdapter102 { - - private boolean wasCalled; - - - public boolean wasCalled() { - return this.wasCalled; - } - - - public void handleMessage(String message) { - this.wasCalled = true; - } - - @Override - protected void handleListenerException(Throwable ex) { - System.out.println(ex); - } - -} diff --git a/spring-jms/src/test/java/org/springframework/jms/support/SimpleMessageConverter102Tests.java b/spring-jms/src/test/java/org/springframework/jms/support/SimpleMessageConverter102Tests.java deleted file mode 100644 index 153cf0dd7a9..00000000000 --- a/spring-jms/src/test/java/org/springframework/jms/support/SimpleMessageConverter102Tests.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.jms.support; - -import java.io.ByteArrayInputStream; -import java.util.Random; - -import javax.jms.BytesMessage; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; - -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.springframework.jms.support.converter.SimpleMessageConverter102; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.mockito.BDDMockito.*; - -/** - * Unit tests for the {@link SimpleMessageConverter102} class. - * - * @author Juergen Hoeller - * @author Rick Evans - */ -public final class SimpleMessageConverter102Tests { - - @Test - public void testByteArrayConversion102() throws JMSException { - Session session = mock(Session.class); - BytesMessage message = mock(BytesMessage.class); - - byte[] content = new byte[5000]; - new Random().nextBytes(content); - - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(content); - given(session.createBytesMessage()).willReturn(message); - given(message.readBytes((byte[]) anyObject())).willAnswer(new Answer() { - @Override - public Integer answer(InvocationOnMock invocation) throws Throwable { - return byteArrayInputStream.read((byte[])invocation.getArguments()[0]); - } - }); - - SimpleMessageConverter102 converter = new SimpleMessageConverter102(); - Message msg = converter.toMessage(content, session); - assertThat((byte[])converter.fromMessage(msg), equalTo(content)); - } - -}