package at.gv.egovernment.moa.spss.server.transaction;

/**
 * Provides each thread with an instance of <code>TransactionContext</code>.
 * 
 * The single instance of the <code>TransactionContextManager</code> should be
 * used to access contextual information for each web service transaction, e.g.
 * the transaction ID, MOA configuration, client certificate, etc.
 * 
 * @author Stefan Knirsch
 * @author Patrick Peck
 */
public class TransactionContextManager {

  /** The single instance of <code>TransactionContextManager</code> */ 
  private static TransactionContextManager instance = null;
  
  /** Contains a single <code>TransactionContext</code> for each thread. */
  private ThreadLocal context = null;

  /**
   * Get the single instance of <code>TransactionContextManager</code>.
   *   
   * @return The single instanc of <code>TransactionContextManager</code>.
   */
  public static synchronized TransactionContextManager getInstance() {
    if (instance == null) {
      instance = new TransactionContextManager();
    }
    return instance;
  }

  /**
   * Creates a new <code>TransactionContextManager</code>.
   * 
   * Protected to disallow direct instantiation.
   */
  protected TransactionContextManager() {
    context = new ThreadLocal();
  }

  /**
   * Set the <code>TransactionContext</code> for the current thread.
   * 
   * @param txContext The <code>TransactionContext</code> for this thread.
   */
  public void setTransactionContext(TransactionContext txContext) {
    context.set(txContext);
  }

  /**
   * Get the <code>TransactionContext</code> for the current thread.
   * 
   * @return The <code>TransactionContext</code> for the current thread or
   * <code>null</code>, if none has been set (or if this method is being invoked
   * outside the bounds of a transaction).
   */
  public TransactionContext getTransactionContext() {
    return (TransactionContext) context.get();
  }

}