    1   /***
    2    *
    3    * Copyright 2004 Hiram Chirino
    4    *
    5    * Licensed under the Apache License, Version 2.0 (the "License");
    6    * you may not use this file except in compliance with the License.
    7    * You may obtain a copy of the License at
    8    *
    9    * http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   **/
    18  package org.codehaus.activemq.ra;
    19
    20  import java.util.ArrayList;
    21  import java.util.Iterator;
    22
    23  import javax.resource.ResourceException;
    24  import javax.resource.spi.ConnectionEvent;
    25  import javax.resource.spi.ConnectionEventListener;
    26  import javax.resource.spi.ConnectionManager;
    27  import javax.resource.spi.ConnectionRequestInfo;
    28  import javax.resource.spi.ManagedConnection;
    29  import javax.resource.spi.ManagedConnectionFactory;
    30  import javax.security.auth.Subject;
    31
    32  import org.apache.commons.logging.Log;
    33  import org.apache.commons.logging.LogFactory;
    34
    35
    36  /***
    37   * A simple implementation of a ConnectionManager that can be extended so that it can
    38   * see how the RA connections are interacting with it.
    39   *
    40   * @version $Revision: 1.1 $
    41   */
    42  public class ConnectionManagerAdapter implements ConnectionManager, ConnectionEventListener {
    43
    44      private static final Log log = LogFactory.getLog(ConnectionManagerAdapter.class);
    45      ArrayList listners = new ArrayList();
    46      ArrayList connections = new ArrayList();
    47
    48      /***
    49       * Adds a listner to all connections created by this connection manager.
    50       * This listner will be added to all previously created connections.
    51       *
    52       * @param l
    53       */
    54      public void addConnectionEventListener(ConnectionEventListener l ) {
    55          for (Iterator iter = connections.iterator(); iter.hasNext();) {
    56              ManagedConnection c = (ManagedConnection) iter.next();
    57              c.addConnectionEventListener(l);
    58          }
    59          listners.add(l);
    60      }
    61
    62      /***
    63       * @see javax.resource.spi.ConnectionManager#allocateConnection(javax.resource.spi.ManagedConnectionFactory, javax.resource.spi.ConnectionRequestInfo)
    64       */
    65      public Object allocateConnection(ManagedConnectionFactory connectionFactory, ConnectionRequestInfo info) throws ResourceException {
    66          Subject subject = null;
    67          ManagedConnection connection = connectionFactory.createManagedConnection(subject, info);
    68          connection.addConnectionEventListener(this);
    69          for (Iterator iter = listners.iterator(); iter.hasNext();) {
    70              ConnectionEventListener l = (ConnectionEventListener) iter.next();
    71              connection.addConnectionEventListener(l);
    72          }
    73          connections.add(connection);
    74          return connection.getConnection(subject, info);
    75      }
    76
    77      /***
    78       * @see javax.resource.spi.ConnectionEventListener#connectionClosed(javax.resource.spi.ConnectionEvent)
    79       */
    80      public void connectionClosed(ConnectionEvent event) {
    81          connections.remove(event.getSource());
    82          try {
    83              ((ManagedConnection)event.getSource()).cleanup();
    84          } catch (ResourceException e) {
    85              log.warn("Error occured during the cleanup of a managed connection: ",e);
    86          }
    87          try {
    88              ((ManagedConnection)event.getSource()).destroy();
    89          } catch (ResourceException e) {
    90              log.warn("Error occured during the destruction of a managed connection: ",e);
    91          }
    92      }
    93
    94      /***
    95       * @see javax.resource.spi.ConnectionEventListener#localTransactionStarted(javax.resource.spi.ConnectionEvent)
    96       */
    97      public void localTransactionStarted(ConnectionEvent event) {
    98      }
    99
    100     /***
    101      * @see javax.resource.spi.ConnectionEventListener#localTransactionCommitted(javax.resource.spi.ConnectionEvent)
    102      */
    103     public void localTransactionCommitted(ConnectionEvent event) {
    104     }
    105
    106     /***
    107      * @see javax.resource.spi.ConnectionEventListener#localTransactionRolledback(javax.resource.spi.ConnectionEvent)
    108      */
    109     public void localTransactionRolledback(ConnectionEvent event) {
    110     }
    111
    112     /***
    113      * @see javax.resource.spi.ConnectionEventListener#connectionErrorOccurred(javax.resource.spi.ConnectionEvent)
    114      */
    115     public void connectionErrorOccurred(ConnectionEvent event) {
    116         log.warn("Managed connection experiened an error: ",event.getException());
    117         try {
    118             ((ManagedConnection)event.getSource()).cleanup();
    119         } catch (ResourceException e) {
    120             log.warn("Error occured during the cleanup of a managed connection: ",e);
    121         }
    122         try {
    123             ((ManagedConnection)event.getSource()).destroy();
    124         } catch (ResourceException e) {
    125             log.warn("Error occured during the destruction of a managed connection: ",e);
    126         }
    127     }
    128
    129 }