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  }