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 javax.jms.JMSException;
018    import javax.jms.XAConnection;
019    import javax.jms.XASession;
020    
021    import org.apache.commons.pool.PoolableObjectFactory;
022    import org.apache.commons.pool.ObjectPool;
023    import org.apache.commons.pool.impl.GenericObjectPool;
024    import org.apache.commons.logging.Log;
025    import org.apache.commons.logging.LogFactory;
026    
027    public class XASessionPool implements PoolableObjectFactory
028    {
029      private static final Log log = LogFactory.getLog(XASessionPool.class);
030      
031      private XAConnection connection;
032      private ObjectPool sessionPool;
033    
034      public XASessionPool(final XAConnection connection)
035      {
036        this(connection, new GenericObjectPool(null, -1));
037      }
038    
039      public XASessionPool(final XAConnection connection,
040                           final ObjectPool sessionPool)
041      {
042        this.connection = connection;
043        this.sessionPool = sessionPool;
044        sessionPool.setFactory(this);
045      }
046    
047      public PooledSpringXASession borrowSession() throws JMSException
048      {
049        try {
050          if(log.isDebugEnabled()) log.debug("---->>>>> BORROWING JMS SESSION FROM POOL...");
051          Object object = sessionPool.borrowObject();
052          if(log.isDebugEnabled()) log.debug("---->>>>> BORROWED SESSION: " + object);
053          return (PooledSpringXASession) object;
054        }
055        catch (JMSException e) {
056          throw e;
057        }
058        catch (Exception e) {
059          final JMSException jmsException = new JMSException("Unhandled exception");
060          jmsException.initCause(e);
061          throw jmsException;
062        }
063      }
064      
065      
066    
067      // PoolableObjectFactory methods
068      //-------------------------------------------------------------------------
069      public Object makeObject() throws Exception
070      {
071        if(log.isDebugEnabled()) log.debug("---->>>>> CREATING NEW SESSION TO SATISFY REQUEST!!");
072        return new PooledSpringXASession(createSession(), sessionPool);
073      }
074    
075      public void destroyObject(Object o) throws Exception
076      {
077        if(log.isDebugEnabled()) log.debug("---->>>>> DESTROYING SESSION AND PERMANENTLY REMOVING FROM POOL: " + o);
078        PooledSpringXASession session = (PooledSpringXASession) o;
079        session.getActualSession().close();
080      }
081    
082      public boolean validateObject(Object o)
083      {
084        return true;
085      }
086    
087      public void activateObject(Object o) throws Exception
088      {
089      }
090    
091      public void passivateObject(Object o) throws Exception
092      {
093        if(log.isDebugEnabled()) log.debug("---->>>>> SESSION HAS BEEN RETURNED TO POOL: " + o);
094      }
095    
096      // Implemention methods
097      //-------------------------------------------------------------------------
098      protected XAConnection getConnection() throws JMSException
099      {
100        if (this.connection == null) {
101          throw new JMSException("Already closed");
102        }
103        return connection;
104      }
105    
106      protected XASession createSession() throws JMSException
107      {
108        return getConnection().createXASession();
109      }
110    
111    
112    }