001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  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    package org.apache.activemq.ra;
018    
019    import java.io.Serializable;
020    
021    import javax.jms.Connection;
022    import javax.jms.ConnectionFactory;
023    import javax.jms.JMSException;
024    import javax.jms.QueueConnection;
025    import javax.jms.QueueConnectionFactory;
026    import javax.jms.TopicConnection;
027    import javax.jms.TopicConnectionFactory;
028    import javax.naming.Reference;
029    import javax.resource.Referenceable;
030    import javax.resource.ResourceException;
031    import javax.resource.spi.ConnectionManager;
032    
033    import org.slf4j.Logger;
034    import org.slf4j.LoggerFactory;
035    
036    /**
037     * 
038     */
039    public class ActiveMQConnectionFactory implements ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory, Referenceable, Serializable {
040    
041        private static final long serialVersionUID = -5754338187296859149L;
042    
043        private static final Logger LOG = LoggerFactory.getLogger(ActiveMQConnectionFactory.class);
044        private ConnectionManager manager;
045        private ActiveMQManagedConnectionFactory factory;
046        private Reference reference;
047        private final ActiveMQConnectionRequestInfo info;
048    
049        /**
050         * @param factory
051         * @param manager
052         * @param connectionRequestInfo
053         */
054        public ActiveMQConnectionFactory(
055                ActiveMQManagedConnectionFactory factory, 
056                ConnectionManager manager, 
057                ActiveMQConnectionRequestInfo connectionRequestInfo) {
058            this.factory = factory;
059            this.manager = manager;
060            this.info = connectionRequestInfo;
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,
072         *      java.lang.String)
073         */
074        public Connection createConnection(String userName, String password) throws JMSException {
075            ActiveMQConnectionRequestInfo i = info.copy();
076            i.setUserName(userName);
077            i.setPassword(password);
078            return createConnection(i);
079        }
080    
081        /**
082         * @param connectionRequestInfo
083         * @return
084         * @throws JMSException
085         */
086        private Connection createConnection(ActiveMQConnectionRequestInfo connectionRequestInfo) throws JMSException {
087            try {
088                if (connectionRequestInfo.isUseInboundSessionEnabled()) {
089                    return new InboundConnectionProxy();
090                }
091                if (manager == null) {
092                    throw new JMSException("No JCA ConnectionManager configured! Either enable UseInboundSessionEnabled or get your JCA container to configure one.");
093                }
094                return (Connection)manager.allocateConnection(factory, connectionRequestInfo);
095            } catch (ResourceException e) {
096                // Throw the root cause if it was a JMSException..
097                if (e.getCause() instanceof JMSException) {
098                    throw (JMSException)e.getCause();
099                }
100                LOG.debug("Connection could not be created:", e);
101                throw new JMSException(e.getMessage());
102            }
103        }
104    
105        /**
106         * @see javax.naming.Referenceable#getReference()
107         */
108        public Reference getReference() {
109            return reference;
110        }
111    
112        /**
113         * @see javax.resource.Referenceable#setReference(javax.naming.Reference)
114         */
115        public void setReference(Reference reference) {
116            this.reference = reference;
117        }
118    
119        public QueueConnection createQueueConnection() throws JMSException {
120            return (QueueConnection)createConnection();
121        }
122    
123        public QueueConnection createQueueConnection(String userName, String password) throws JMSException {
124            return (QueueConnection)createConnection(userName, password);
125        }
126    
127        public TopicConnection createTopicConnection() throws JMSException {
128            return (TopicConnection)createConnection();
129        }
130    
131        public TopicConnection createTopicConnection(String userName, String password) throws JMSException {
132            return (TopicConnection)createConnection(userName, password);
133        }
134    }