/*
 * The contents of this file are subject to the terms 
 * of the Common Development and Distribution License 
 * (the License).  You may not use this file except in
 * compliance with the License.
 * 
 * You can obtain a copy of the license at 
 * https://glassfish.dev.java.net/public/CDDLv1.0.html or
 * glassfish/bootstrap/legal/CDDLv1.0.txt.
 * See the License for the specific language governing 
 * permissions and limitations under the License.
 * 
 * When distributing Covered Code, include this CDDL 
 * Header Notice in each file and include the License file 
 * at glassfish/bootstrap/legal/CDDLv1.0.txt.  
 * If applicable, add the following below the CDDL Header, 
 * with the fields enclosed by brackets [] replaced by
 * you own identifying information: 
 * "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
 */

package javax.jms;

import javax.transaction.xa.XAResource;

/** The <CODE>XASession</CODE> interface extends the capability of 
  * <CODE>Session</CODE> by adding access to a JMS provider's support for the
  * Java Transaction API (JTA) (optional). This support takes the form of a 
  * <CODE>javax.transaction.xa.XAResource</CODE> object. The functionality of 
  * this object closely resembles that defined by the standard X/Open XA 
  * Resource interface.
  *
  * <P>An application server controls the transactional assignment of an 
  * <CODE>XASession</CODE> by obtaining its <CODE>XAResource</CODE>. It uses 
  * the <CODE>XAResource</CODE> to assign the session to a transaction, prepare 
  * and commit work on the transaction, and so on.
  *
  * <P>An <CODE>XAResource</CODE> provides some fairly sophisticated facilities 
  * for interleaving work on multiple transactions, recovering a list of 
  * transactions in progress, and so on. A JTA aware JMS provider must fully 
  * implement this functionality. This could be done by using the services 
  * of a database that supports XA, or a JMS provider may choose to implement 
  * this functionality from scratch.
  *
  * <P>A client of the application server is given what it thinks is a 
  * regular JMS <CODE>Session</CODE>. Behind the scenes, the application server 
  * controls the transaction management of the underlying 
  * <CODE>XASession</CODE>.
  *
  * <P>The <CODE>XASession</CODE> interface is optional.  JMS providers 
  * are not required to support this interface. This interface is for 
  * use by JMS providers to support transactional environments. 
  * Client programs are strongly encouraged to use the transactional support
  * available in their environment, rather than use these XA
  * interfaces directly. 
  *
  * @version     1.1 February 2, 2002
  * @author      Mark Hapner
  * @author      Rich Burridge
  * @author      Kate Stout
  *
  * @see         javax.jms.Session
  */ 
 
public interface XASession extends Session {

   /** Gets the session associated with this <CODE>XASession</CODE>.
      *  
      * @return the  session object
      *  
      * @exception JMSException if an internal error occurs.
      *
      * @since 1.1
      */ 
 
        Session
        getSession() throws JMSException;
  
    /** Returns an XA resource to the caller.
      *
      * @return an XA resource to the caller
      */

     XAResource
     getXAResource();

    /** Indicates whether the session is in transacted mode.
      *  
      * @return true
      *  
      * @exception JMSException if the JMS provider fails to return the 
      *                         transaction mode due to some internal error.
      */ 

    boolean
    getTransacted() throws JMSException;


    /** Throws a <CODE>TransactionInProgressException</CODE>, since it should 
      * not be called for an <CODE>XASession</CODE> object.
      *
      * @exception TransactionInProgressException if the method is called on 
      *                         an <CODE>XASession</CODE>.
      *                                     
      */

    void
    commit() throws JMSException;


    /** Throws a <CODE>TransactionInProgressException</CODE>, since it should 
      * not be called for an <CODE>XASession</CODE> object.
      *
      * @exception TransactionInProgressException if the method is called on 
      *                         an <CODE>XASession</CODE>.
      *                                     
      */

    void
    rollback() throws JMSException;
}
