View Javadoc

1   /***
2    * 
3    * Copyright 2004 Hiram Chirino
4    * Copyright 2004 Protique Ltd
5    * 
6    * Licensed under the Apache License, Version 2.0 (the "License"); 
7    * you may not use this file except in compliance with the License. 
8    * You may obtain a copy of the License at 
9    * 
10   * http://www.apache.org/licenses/LICENSE-2.0
11   * 
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS, 
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
15   * See the License for the specific language governing permissions and 
16   * limitations under the License. 
17   * 
18   **/
19  package org.codehaus.activemq.store.jdbc;
20  
21  import org.apache.commons.logging.Log;
22  import org.apache.commons.logging.LogFactory;
23  
24  import java.sql.Connection;
25  
26  import javax.sql.DataSource;
27  
28  /***
29   * Helps keep track of the current transaction/JDBC connection.
30   *
31   * @version $Revision: 1.2 $
32   */
33  public class TransactionContext {
34      private static final Log log = LogFactory.getLog(TransactionContext.class);
35      private static ThreadLocal threadLocalTxn = new ThreadLocal();
36  	private final DataSource dataSource;
37  
38      TransactionContext( DataSource dataSource ) {
39  		this.dataSource = dataSource;
40      }
41      
42      /***
43       * Pops off the current Connection from the stack
44       */
45      public static Connection popConnection() {
46          Connection[] tx = (Connection[]) threadLocalTxn.get();
47          if (tx == null || tx[0]==null) {
48              log.warn("Attempt to pop connection when no transaction in progress");
49              return null;
50          }
51          else {
52          	Connection answer = tx[0];
53          	tx[0]=null;
54          	return answer;
55          }
56      }
57  
58      /***
59       * Sets the current transaction, possibly including nesting
60       */
61      public static void pushConnection(Connection connection) {
62          Connection[] tx = (Connection[]) threadLocalTxn.get();
63          if (tx == null) {
64              tx = new Connection[]{null};
65              threadLocalTxn.set(tx);
66          }
67          if (tx[0] != null) {
68              throw new IllegalStateException("A transaction is allready in progress");
69          }
70          tx[0] = connection;
71      }
72  
73      /***
74       * @return the current thread local connection that is associated
75       *  with the JMS transaction or null if there is no 
76       *  transaction in progress.
77       */
78      public static Connection peekConnection() {
79          Connection tx[] = (Connection[]) threadLocalTxn.get();
80          if (tx != null && tx[0]!=null ) {
81              return tx[0];
82          }
83          return null;
84      }
85  
86  }