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 }