001    /** 
002     * Licensed under the Apache License, Version 2.0 (the "License"); 
003     * you may not use this file except in compliance with the License. 
004     * You may obtain a copy of the License at 
005     * 
006     * http://www.apache.org/licenses/LICENSE-2.0
007     * 
008     * Unless required by applicable law or agreed to in writing, software
009     * distributed under the License is distributed on an "AS IS" BASIS, 
010     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
011     * See the License for the specific language governing permissions and 
012     * limitations under the License. 
013     * 
014     **/
015    package org.jencks.pool;
016    
017    import java.util.Map;
018    
019    import javax.jms.Connection;
020    import javax.jms.JMSException;
021    import javax.jms.XAConnectionFactory;
022    import javax.jms.ConnectionFactory;
023    import javax.jms.XAConnection;
024    import javax.transaction.TransactionManager;
025    
026    import org.activemq.pool.ConnectionKey;
027    import org.springframework.transaction.jta.JtaTransactionManager;
028    
029    import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap;
030    
031    public class PooledSpringXAConnectionFactory implements ConnectionFactory {
032            private XAConnectionFactory connectionFactory;
033    
034            private TransactionManager transactionManager;
035    
036            private Map cache = new ConcurrentHashMap();
037    
038            private Map pooledClientIds = new ConcurrentHashMap();
039    
040            public PooledSpringXAConnectionFactory(
041                            final XAConnectionFactory connectionFactory,
042                            final TransactionManager transactionManager) {
043                    this.connectionFactory = connectionFactory;
044                    this.transactionManager = transactionManager;
045            }
046    
047            public PooledSpringXAConnectionFactory() {
048            }
049    
050            public TransactionManager getTransactionManager() {
051                    return this.transactionManager;
052            }
053    
054            public void setTransactionManager(final TransactionManager transactionManager) {
055                    this.transactionManager = transactionManager;
056            }
057    
058            public void setJtaTransactionManager(final JtaTransactionManager jtaTransactionManager) {
059                    setTransactionManager(jtaTransactionManager.getTransactionManager());
060            }
061    
062            public XAConnectionFactory getConnectionFactory() {
063                    return this.connectionFactory;
064            }
065    
066            public void setConnectionFactory(final XAConnectionFactory connectionFactory) {
067                    this.connectionFactory = connectionFactory;
068            }
069    
070            public Connection createConnection() throws JMSException {
071                    return createConnection(null, null);
072            }
073    
074            public synchronized Connection createConnection(final String userName, final String password) throws JMSException {
075                    final ConnectionKey key = new ConnectionKey(userName, password);
076                    PooledSpringXAConnection connection = (PooledSpringXAConnection) this.cache.get(key);
077                    if (connection == null) {
078                            final XAConnection delegate = createConnection(key);
079                            connection = new PooledSpringXAConnection(this, getTransactionManager(), delegate);
080                            this.cache.put(key, connection);
081                    }
082                    return connection.newInstance();
083            }
084    
085            protected XAConnection createConnection(ConnectionKey key) throws JMSException {
086                    if (key.getUserName() == null && key.getPassword() == null) {
087                            return this.connectionFactory.createXAConnection();
088                    } else {
089                            return this.connectionFactory.createXAConnection(key.getUserName(), key.getPassword());
090                    }
091            }
092    
093            public String generateClientID(final String requestedClientID) {
094                    if (requestedClientID == null) {
095                            return null;
096                    }
097    
098                    final int num;
099    
100                    synchronized (this) {
101                            final Integer lastCount = (Integer) this.pooledClientIds
102                                            .get(requestedClientID);
103                            if (lastCount == null) {
104                                    num = 1;
105                            } else {
106                                    num = lastCount.intValue() + 1;
107                            }
108                            this.pooledClientIds.put(requestedClientID, new Integer(num));
109                    }
110    
111                    return requestedClientID + "-" + num;
112            }
113    
114            public void start() throws JMSException {
115            }
116    
117            public void stop() throws JMSException {
118            }
119    }