001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
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.pool;
019    
020    import org.apache.commons.pool.ObjectPool;
021    import org.apache.commons.pool.PoolableObjectFactory;
022    import org.apache.commons.pool.impl.GenericObjectPool;
023    import org.activemq.ActiveMQSession;
024    import org.activemq.ActiveMQConnection;
025    import org.activemq.AlreadyClosedException;
026    import org.activemq.util.JMSExceptionHelper;
027    
028    import javax.jms.JMSException;
029    
030    /**
031     * Represents the session pool for a given JMS connection.
032     *
033     * @version $Revision: 1.1 $
034     */
035    public class SessionPool implements PoolableObjectFactory {
036        private ActiveMQConnection connection;
037        private SessionKey key;
038        private ObjectPool sessionPool;
039    
040        public SessionPool(ActiveMQConnection connection, SessionKey key) {
041            this(connection, key, new GenericObjectPool());
042        }
043    
044        public SessionPool(ActiveMQConnection connection, SessionKey key, ObjectPool sessionPool) {
045            this.connection = connection;
046            this.key = key;
047            this.sessionPool = sessionPool;
048            sessionPool.setFactory(this);
049        }
050    
051        public PooledSession borrowSession() throws JMSException {
052            try {
053                Object object = sessionPool.borrowObject();
054                return (PooledSession) object;
055            }
056            catch (JMSException e) {
057                throw e;
058            }
059            catch (Exception e) {
060                throw JMSExceptionHelper.newJMSException(e);
061            }
062        }
063    
064        // PoolableObjectFactory methods
065        //-------------------------------------------------------------------------
066        public Object makeObject() throws Exception {
067            return new PooledSession(createSession(), sessionPool);
068        }
069    
070        public void destroyObject(Object o) throws Exception {
071            PooledSession session = (PooledSession) o;
072            session.getSession().close();
073        }
074    
075        public boolean validateObject(Object o) {
076            return true;
077        }
078    
079        public void activateObject(Object o) throws Exception {
080        }
081    
082        public void passivateObject(Object o) throws Exception {
083        }
084    
085        // Implemention methods
086        //-------------------------------------------------------------------------
087        protected ActiveMQConnection getConnection() throws JMSException {
088            if (connection == null) {
089                throw new AlreadyClosedException();
090            }
091            return connection;
092        }
093    
094        protected ActiveMQSession createSession() throws JMSException {
095            return (ActiveMQSession) getConnection().createSession(key.isTransacted(), key.getAckMode());
096        }
097    
098    
099    }