001    /** 
002     * 
003     * Copyright 2004 Hiram Chirino
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.activemq.ra;
019    
020    import org.activemq.ra.jms.ConnectionProxy;
021    import org.apache.commons.logging.Log;
022    import org.apache.commons.logging.LogFactory;
023    
024    import javax.jms.Connection;
025    import javax.jms.ConnectionFactory;
026    import javax.jms.JMSException;
027    import javax.jms.QueueConnectionFactory;
028    import javax.jms.QueueConnection;
029    import javax.jms.TopicConnectionFactory;
030    import javax.jms.TopicConnection;
031    import javax.naming.Reference;
032    import javax.resource.Referenceable;
033    import javax.resource.ResourceException;
034    import javax.resource.spi.ConnectionManager;
035    import java.io.Serializable;
036    
037    
038    /**
039     * @version $Revision: 1.1.1.1 $
040     */
041    public class ActiveMQConnectionFactory implements ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory, Referenceable, Serializable {
042    
043        private static final long serialVersionUID = -5754338187296859149L;
044    
045        private static final Log log = LogFactory.getLog(ActiveMQConnectionFactory.class);
046        transient private ConnectionManager manager;
047        transient private ActiveMQManagedConnectionFactory factory;
048        private Reference reference;
049        private final ActiveMQConnectionRequestInfo info;
050    
051    
052        /**
053         * @param factory
054         * @param manager
055         * @param info
056         */
057        public ActiveMQConnectionFactory(ActiveMQManagedConnectionFactory factory, ConnectionManager manager, ActiveMQConnectionRequestInfo info) {
058            this.factory = factory;
059            this.manager = manager;
060            this.info = info;
061        }
062    
063        /**
064         * @see javax.jms.ConnectionFactory#createConnection()
065         */
066        public Connection createConnection() throws JMSException {
067            return createConnection(info.copy());
068        }
069    
070        /**
071         * @see javax.jms.ConnectionFactory#createConnection(java.lang.String, java.lang.String)
072         */
073        public Connection createConnection(String userName, String password) throws JMSException {
074            ActiveMQConnectionRequestInfo i = info.copy();
075            i.setUserName(userName);
076            i.setPassword(password);
077            return createConnection(i);
078        }
079    
080        /**
081         * @param info
082         * @return
083         * @throws JMSException
084         */
085        private Connection createConnection(ActiveMQConnectionRequestInfo info) throws JMSException {
086            try {
087                if( info.isUseInboundSessionEnabled() ) {
088                    return new ConnectionProxy();
089                }
090                return (Connection) manager.allocateConnection(factory, info);
091            }
092            catch (ResourceException e) {
093                // Throw the root cause if it was a JMSException..
094                if (e.getCause() instanceof JMSException) {
095                    throw (JMSException) e.getCause();
096                }
097                log.debug("Connection could not be created:", e);
098                throw new JMSException(e.getMessage());
099            }
100        }
101    
102        /**
103         * @see javax.naming.Referenceable#getReference()
104         */
105        public Reference getReference() {
106            return reference;
107        }
108    
109        /**
110         * @see javax.resource.Referenceable#setReference(javax.naming.Reference)
111         */
112        public void setReference(Reference reference) {
113            this.reference = reference;
114        }
115    
116        public QueueConnection createQueueConnection() throws JMSException {
117            return (QueueConnection) createConnection();
118        }
119    
120        public QueueConnection createQueueConnection(String userName, String password) throws JMSException {
121            return (QueueConnection) createConnection(userName, password);
122        }
123    
124        public TopicConnection createTopicConnection() throws JMSException {
125            return (TopicConnection) createConnection();
126        }
127    
128        public TopicConnection createTopicConnection(String userName, String password) throws JMSException {
129            return (TopicConnection) createConnection(userName, password);
130        }
131    }