001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.jms.connection;
018:
019: import javax.jms.Connection;
020: import javax.jms.ConnectionFactory;
021: import javax.jms.JMSException;
022: import javax.jms.QueueConnectionFactory;
023: import javax.jms.TopicConnectionFactory;
024:
025: /**
026: * A subclass of {@link SingleConnectionFactory} for the JMS 1.0.2 specification,
027: * not relying on JMS 1.1 methods like SingleConnectionFactory itself.
028: * This class can be used for JMS 1.0.2 providers, offering the same API as
029: * SingleConnectionFactory does for JMS 1.1 providers.
030: *
031: * <p>You need to set the {@link #setPubSubDomain "pubSubDomain" property},
032: * since this class will always explicitly differentiate between a
033: * {@link javax.jms.QueueConnection} and a {@link javax.jms.TopicConnection}.
034: *
035: * @author Juergen Hoeller
036: * @since 1.1
037: * @see #setTargetConnectionFactory
038: * @see #setPubSubDomain
039: */
040: public class SingleConnectionFactory102 extends SingleConnectionFactory {
041:
042: private boolean pubSubDomain = false;
043:
044: /**
045: * Create a new SingleConnectionFactory102 for bean-style usage.
046: */
047: public SingleConnectionFactory102() {
048: super ();
049: }
050:
051: /**
052: * Create a new SingleConnectionFactory102 that always returns a single
053: * Connection that it will lazily create via the given target
054: * ConnectionFactory.
055: * @param connectionFactory the target ConnectionFactory
056: * @param pubSubDomain whether the Publish/Subscribe domain (Topics) or
057: * Point-to-Point domain (Queues) should be used
058: */
059: public SingleConnectionFactory102(
060: ConnectionFactory connectionFactory, boolean pubSubDomain) {
061: setTargetConnectionFactory(connectionFactory);
062: this .pubSubDomain = pubSubDomain;
063: afterPropertiesSet();
064: }
065:
066: /**
067: * Configure the factory with knowledge of the JMS domain used.
068: * This tells the JMS 1.0.2 provider which class hierarchy to use for creating
069: * Connections and Sessions.
070: * <p>Default is Point-to-Point (Queues).
071: * @param pubSubDomain <code>true</code> for Publish/Subscribe domain (Topics),
072: * <code>false</code> for Point-to-Point domain (Queues)
073: */
074: public void setPubSubDomain(boolean pubSubDomain) {
075: this .pubSubDomain = pubSubDomain;
076: }
077:
078: /**
079: * Return whether the Publish/Subscribe domain (Topics) is used.
080: * Otherwise, the Point-to-Point domain (Queues) is used.
081: */
082: public boolean isPubSubDomain() {
083: return this .pubSubDomain;
084: }
085:
086: /**
087: * In addition to checking whether the target ConnectionFactory is set,
088: * make sure that the supplied factory is of the appropriate type for
089: * the specified destination type: QueueConnectionFactory for queues,
090: * TopicConnectionFactory for topics.
091: */
092: public void afterPropertiesSet() {
093: super .afterPropertiesSet();
094:
095: // Make sure that the ConnectionFactory passed is consistent.
096: // Some provider implementations of the ConnectionFactory interface
097: // implement both domain interfaces under the cover, so just check if
098: // the selected domain is consistent with the type of connection factory.
099: if (isPubSubDomain()) {
100: if (!(getTargetConnectionFactory() instanceof TopicConnectionFactory)) {
101: throw new IllegalArgumentException(
102: "Specified a Spring JMS 1.0.2 SingleConnectionFactory for topics "
103: + "but did not supply an instance of TopicConnectionFactory");
104: }
105: } else {
106: if (!(getTargetConnectionFactory() instanceof QueueConnectionFactory)) {
107: throw new IllegalArgumentException(
108: "Specified a Spring JMS 1.0.2 SingleConnectionFactory for queues "
109: + "but did not supply an instance of QueueConnectionFactory");
110: }
111: }
112: }
113:
114: /**
115: * This implementation overrides the superclass method to use JMS 1.0.2 API.
116: */
117: protected Connection doCreateConnection() throws JMSException {
118: if (isPubSubDomain()) {
119: return ((TopicConnectionFactory) getTargetConnectionFactory())
120: .createTopicConnection();
121: } else {
122: return ((QueueConnectionFactory) getTargetConnectionFactory())
123: .createQueueConnection();
124: }
125: }
126:
127: }
|