You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2004/01/23 19:54:16 UTC

cvs commit: incubator-geronimo/modules/transaction/src/test/org/apache/geronimo/transaction/manager MockResource.java MockResourceManager.java TestTransactionManager.java XATransactionTester.java

dain        2004/01/23 10:54:16

  Added:       modules/transaction .cvsignore project.properties
                        project.xml
               modules/transaction/src/java/org/apache/geronimo/transaction
                        GeronimoRollbackException.java
                        GeronimoTransactionRolledbackException.java
                        GeronimoTransactionRolledbackLocalException.java
                        TransactionManagerProxy.java TransactionProxy.java
               modules/transaction/src/java/org/apache/geronimo/transaction/log
                        UnrecoverableLog.java
               modules/transaction/src/java/org/apache/geronimo/transaction/manager
                        TransactionImpl.java TransactionLog.java
                        TransactionManagerImpl.java
                        UserTransactionImpl.java XidFactory.java
                        XidImpl.java
               modules/transaction/src/test/org/apache/geronimo/transaction/manager
                        MockResource.java MockResourceManager.java
                        TestTransactionManager.java
                        XATransactionTester.java
  Log:
  Moved from core module
  
  Revision  Changes    Path
  1.1                  incubator-geronimo/modules/transaction/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  target
  maven.log
  junit64798903.properties
  
  
  
  1.1                  incubator-geronimo/modules/transaction/project.properties
  
  Index: project.properties
  ===================================================================
  ##
  ## $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
  ##
  
  maven.repo.remote=http://www.apache.org/~dain/maven, http://www.ibiblio.org/maven
  
  
  
  1.1                  incubator-geronimo/modules/transaction/project.xml
  
  Index: project.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!-- $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $ -->
  
  <project>
      <pomVersion>3</pomVersion>
      <extend>${basedir}/../../etc/project.xml</extend>
  
      <!-- ===================== -->
      <!-- Module Identification -->
      <!-- ===================== -->
  
      <name>Geronimo :: Transaction</name>
      <id>geronimo-transaction</id>
      <shortDescription>Geronimo Transaction</shortDescription>
      <description>Geronimo Transaction</description>
      <url>http://incubator.apache.org/projects/geronimo/transaction/</url>
      <siteDirectory>/www/incubator.apache.org/projects/geronimo/transaction</siteDirectory>
      <distributionDirectory>/www/incubator.apache.org/projects/geronimo/builds/transaction</distributionDirectory>
  
      <currentVersion>DEV</currentVersion>
  
      <!-- ============ -->
      <!-- Dependencies -->
      <!-- ============ -->
  
      <dependencies>
  
          <!-- Module Dependencies -->
  
          <dependency>
              <groupId>geronimo</groupId>
              <artifactId>geronimo-kernel</artifactId>
              <version>DEV</version>
              <properties>
                  <module>true</module>
              </properties>
          </dependency>
  
          <dependency>
              <groupId>geronimo-spec</groupId>
              <artifactId>geronimo-spec-jta</artifactId>
              <version>DEV</version>
              <properties>
                  <module>true</module>
              </properties>
          </dependency>
  
          <dependency>
              <groupId>geronimo-spec</groupId>
              <artifactId>geronimo-spec-ejb</artifactId>
              <version>DEV</version>
              <properties>
                  <module>true</module>
              </properties>
          </dependency>
  
          <dependency>
              <groupId>geronimo-spec</groupId>
              <artifactId>geronimo-spec-j2ee-connector</artifactId>
              <version>DEV</version>
              <properties>
                  <module>true</module>
              </properties>
          </dependency>
  
          <!-- Thirdparty -->
  
          <dependency>
              <id>commons-logging</id>
              <version>1.0.3</version>
              <url>http://jakarta.apache.org/commons/logging/</url>
              <properties>
                  <runtime>false</runtime>
              </properties>
          </dependency>
  
      </dependencies>
  </project>
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/GeronimoRollbackException.java
  
  Index: GeronimoRollbackException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction;
  
  
  /**
   *
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
   * @todo investigate using the 1.4 cause instead
   */
  public class GeronimoRollbackException extends RuntimeException {
      public GeronimoRollbackException() {
      }
  
      public GeronimoRollbackException(String message) {
          super(message);
      }
  
      public GeronimoRollbackException(String message, Throwable cause) {
          super(message, cause);
      }
  
      public GeronimoRollbackException(Throwable cause) {
          super(cause);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/GeronimoTransactionRolledbackException.java
  
  Index: GeronimoTransactionRolledbackException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction;
  
  import javax.transaction.TransactionRolledbackException;
  
  /**
   *
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
   * @todo investigate using the 1.4 cause instead
   */
  public class GeronimoTransactionRolledbackException extends TransactionRolledbackException {
      public GeronimoTransactionRolledbackException() {
      }
  
      public GeronimoTransactionRolledbackException(String s) {
          super(s);
      }
  
      public GeronimoTransactionRolledbackException(String s, Throwable t) {
          super(s);
          this.detail = t;
      }
  
      public GeronimoTransactionRolledbackException(Throwable t) {
          super();
          this.detail = t;
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/GeronimoTransactionRolledbackLocalException.java
  
  Index: GeronimoTransactionRolledbackLocalException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction;
  
  import javax.ejb.TransactionRolledbackLocalException;
  
  /**
   *
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
   * @todo investigate using the 1.4 cause instead
   */
  public class GeronimoTransactionRolledbackLocalException extends TransactionRolledbackLocalException {
      public GeronimoTransactionRolledbackLocalException() {
      }
  
      public GeronimoTransactionRolledbackLocalException(String s) {
          super(s);
      }
  
      public GeronimoTransactionRolledbackLocalException(String s, Exception e) {
          super(s, e);
      }
  
      public GeronimoTransactionRolledbackLocalException(Exception e) {
          super(null, e);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/TransactionManagerProxy.java
  
  Index: TransactionManagerProxy.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction;
  
  import javax.resource.spi.XATerminator;
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.InvalidTransactionException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.Status;
  import javax.transaction.SystemException;
  import javax.transaction.Transaction;
  import javax.transaction.TransactionManager;
  import javax.transaction.xa.XAException;
  import javax.transaction.xa.Xid;
  
  import org.apache.geronimo.gbean.GBeanInfo;
  import org.apache.geronimo.gbean.GBeanInfoFactory;
  import org.apache.geronimo.gbean.GOperationInfo;
  import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
  
  /**
   * A wrapper for a TransactionManager that wraps all Transactions in a TransactionProxy
   * so that we can add addition metadata to the Transaction. Only begin (and setTransactionTimeout)
   * are delegated to the wrapped TransactionManager; all other operations are delegated to the
   * wrapped Transaction.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
   */
  public class TransactionManagerProxy implements TransactionManager, XATerminator {
  
      private static final GBeanInfo GBEAN_INFO;
  
      private final TransactionManager delegate;
      private final ThreadLocal threadTx = new ThreadLocal();
  
      /**
       * Constructor taking the TransactionManager to wrap.
       * @param delegate the TransactionManager that should be wrapped
       */
      public TransactionManagerProxy(TransactionManager delegate) {
          this.delegate = delegate;
      }
  
      /**
       * Possibly temporary constructor to enable deploying this as a geronimo mbean w/o a managed constructor.
       */
      public TransactionManagerProxy() {
          this.delegate = new TransactionManagerImpl();
      }
  
      public void setTransactionTimeout(int timeout) throws SystemException {
          delegate.setTransactionTimeout(timeout);
      }
  
      public void begin() throws NotSupportedException, SystemException {
          delegate.begin();
          threadTx.set(new TransactionProxy(delegate.getTransaction()));
      }
  
      public int getStatus() throws SystemException {
          Transaction tx = getTransaction();
          return (tx != null) ? tx.getStatus() : Status.STATUS_NO_TRANSACTION;
      }
  
      public Transaction getTransaction() throws SystemException {
          return (Transaction) threadTx.get();
      }
  
      public Transaction suspend() throws SystemException {
          Transaction tx = getTransaction();
          threadTx.set(null);
          return tx;
      }
  
      public void resume(Transaction tx) throws IllegalStateException, InvalidTransactionException, SystemException {
          if (threadTx.get() != null) {
              throw new IllegalStateException("Transaction already associated with current thread");
          }
          if (tx instanceof TransactionProxy == false) {
              throw new InvalidTransactionException("Cannot resume foreign transaction: " + tx);
          }
          threadTx.set(tx);
      }
  
      public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          try {
              tx.commit();
          } finally {
              threadTx.set(null);
          }
      }
  
      public void rollback() throws IllegalStateException, SecurityException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          try {
              tx.rollback();
          } finally {
              threadTx.set(null);
          }
      }
  
      public void setRollbackOnly() throws IllegalStateException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          tx.setRollbackOnly();
      }
  
      /**
       * @see javax.resource.spi.XATerminator#commit(javax.transaction.xa.Xid, boolean)
       */
      public void commit(Xid arg0, boolean arg1) throws XAException {
          throw new XAException("Not implemented.");
      }
  
      /**
       * @see javax.resource.spi.XATerminator#forget(javax.transaction.xa.Xid)
       */
      public void forget(Xid arg0) throws XAException {
          throw new XAException("Not implemented.");
      }
  
      /**
       * @see javax.resource.spi.XATerminator#prepare(javax.transaction.xa.Xid)
       */
      public int prepare(Xid arg0) throws XAException {
          throw new XAException("Not implemented.");
      }
  
      /**
       * @see javax.resource.spi.XATerminator#recover(int)
       */
      public Xid[] recover(int arg0) throws XAException {
          throw new XAException("Not implemented.");
      }
  
      /**
       * @see javax.resource.spi.XATerminator#rollback(javax.transaction.xa.Xid)
       */
      public void rollback(Xid arg0) throws XAException {
          throw new XAException("Not implemented.");
      }
  
      //for now we use the default constructor.
      static {
          GBeanInfoFactory infoFactory = new GBeanInfoFactory(TransactionManagerProxy.class.getName());
          infoFactory.addOperation(new GOperationInfo("setTransactionTimeout", new String[] {Integer.TYPE.getName()}));
          infoFactory.addOperation(new GOperationInfo("begin"));
          infoFactory.addOperation(new GOperationInfo("getStatus"));
          infoFactory.addOperation(new GOperationInfo("getTransaction"));
          infoFactory.addOperation(new GOperationInfo("suspend"));
          infoFactory.addOperation(new GOperationInfo("resume", new String[] {Transaction.class.getName()}));
          infoFactory.addOperation(new GOperationInfo("commit"));
          infoFactory.addOperation(new GOperationInfo("rollback"));
          infoFactory.addOperation(new GOperationInfo("setRollbackOnly"));
          GBEAN_INFO = infoFactory.getBeanInfo();
      }
  
      public static GBeanInfo getGBeanInfo() {
          return GBEAN_INFO;
      }
  
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/TransactionProxy.java
  
  Index: TransactionProxy.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction;
  
  import javax.transaction.Transaction;
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.RollbackException;
  import javax.transaction.SystemException;
  import javax.transaction.Synchronization;
  import javax.transaction.xa.XAResource;
  
  /**
   * Our version of a JTA Transaction which also carries metadata such as isolation level
   * and write-intent. Delegates all Transaction methods to a real Transaction obtained from
   * the vendor's TransactionManager.
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:15 $
   */
  public class TransactionProxy implements Transaction {
      private final Transaction delegate;
  
      public TransactionProxy(Transaction delegate) {
          this.delegate = delegate;
      }
  
      public void commit() throws HeuristicMixedException, HeuristicRollbackException, RollbackException, SecurityException, SystemException {
          delegate.commit();
      }
  
      public boolean delistResource(XAResource xaResource, int i) throws IllegalStateException, SystemException {
          return delegate.delistResource(xaResource, i);
      }
  
      public boolean enlistResource(XAResource xaResource) throws IllegalStateException, RollbackException, SystemException {
          return delegate.enlistResource(xaResource);
      }
  
      public int getStatus() throws SystemException {
          return delegate.getStatus();
      }
  
      public void registerSynchronization(Synchronization synchronization) throws IllegalStateException, RollbackException, SystemException {
          delegate.registerSynchronization(synchronization);
      }
  
      public void rollback() throws IllegalStateException, SystemException {
          delegate.rollback();
      }
  
      public void setRollbackOnly() throws IllegalStateException, SystemException {
          delegate.setRollbackOnly();
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/log/UnrecoverableLog.java
  
  Index: UnrecoverableLog.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.log;
  
  import java.io.IOException;
  import javax.transaction.xa.Xid;
  
  import org.apache.geronimo.transaction.manager.TransactionLog;
  
  /**
   * A log sink that doesn't actually do anything.
   * Not recommended for production use as heuristic recovery will be needed if
   * the transaction coordinator dies.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class UnrecoverableLog implements TransactionLog {
      public void begin(Xid xid) throws IOException {
      }
  
      public void prepare(Xid xid) throws IOException {
      }
  
      public void commit(Xid xid) throws IOException {
      }
  
      public void rollback(Xid xid) throws IOException {
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
  
  Index: TransactionImpl.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.LinkedList;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.RollbackException;
  import javax.transaction.Status;
  import javax.transaction.Synchronization;
  import javax.transaction.SystemException;
  import javax.transaction.Transaction;
  import javax.transaction.xa.XAException;
  import javax.transaction.xa.XAResource;
  import javax.transaction.xa.Xid;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  /**
   * Basic local transaction with support for multiple resources.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class TransactionImpl implements Transaction {
      private static final Log log = LogFactory.getLog("Transaction");
  
      private final XidFactory xidFactory;
      private final Xid xid;
      private final TransactionLog txnLog;
      private int status = Status.STATUS_NO_TRANSACTION;
      private List syncList = new ArrayList(5);
      private LinkedList resourceManagers = new LinkedList();
      private Map xaResources = new HashMap(3);
  
      TransactionImpl(XidFactory xidFactory, TransactionLog txnLog) throws SystemException {
          this.xidFactory = xidFactory;
          this.txnLog = txnLog;
          this.xid = xidFactory.createXid();
          try {
              txnLog.begin(xid);
          } catch (IOException e) {
              status = Status.STATUS_MARKED_ROLLBACK;
              SystemException ex = new SystemException("Error logging begin; transaction marked for roll back)");
              ex.initCause(e);
              throw ex;
          }
          status = Status.STATUS_ACTIVE;
      }
  
      public synchronized int getStatus() throws SystemException {
          return status;
      }
  
      public synchronized void setRollbackOnly() throws IllegalStateException, SystemException {
          switch (status) {
          case Status.STATUS_ACTIVE:
          case Status.STATUS_PREPARING:
              status = Status.STATUS_MARKED_ROLLBACK;
              break;
          case Status.STATUS_MARKED_ROLLBACK:
          case Status.STATUS_ROLLING_BACK:
              // nothing to do
              break;
          default:
              throw new IllegalStateException("Cannot set rollback only, status is " + getStateString(status));
          }
      }
  
      public synchronized void registerSynchronization(Synchronization synch) throws IllegalStateException, RollbackException, SystemException {
          if (synch == null) {
              throw new IllegalArgumentException("Synchronization is null");
          }
          switch (status) {
          case Status.STATUS_ACTIVE:
          case Status.STATUS_PREPARING:
              break;
          case Status.STATUS_MARKED_ROLLBACK:
              throw new RollbackException("Transaction is marked for rollback");
          default:
              throw new IllegalStateException("Status is " + getStateString(status));
          }
          syncList.add(synch);
      }
  
      public synchronized boolean enlistResource(XAResource xaRes) throws IllegalStateException, RollbackException, SystemException {
          if (xaRes == null) {
              throw new IllegalArgumentException("XAResource is null");
          }
          switch (status) {
          case Status.STATUS_ACTIVE:
              break;
          case Status.STATUS_MARKED_ROLLBACK:
              throw new RollbackException("Transaction is marked for rollback");
          default:
              throw new IllegalStateException("Status is " + getStateString(status));
          }
  
          try {
              for (Iterator i = resourceManagers.iterator(); i.hasNext();) {
                  ResourceManager manager = (ResourceManager) i.next();
                  boolean sameRM;
                  //if the xares is already known, we must be resuming after a suspend.
                  if (xaRes == manager.committer) {
                      xaRes.start(manager.branchId, XAResource.TMRESUME);
                      return true;
                  }
                  //Otherwise, see if this is a new xares for the same resource manager
                  try {
                      sameRM = xaRes.isSameRM(manager.committer);
                  } catch (XAException e) {
                      log.warn("Unexpected error checking for same RM", e);
                      continue;
                  }
                  if (sameRM) {
                      xaRes.start(manager.branchId, XAResource.TMJOIN);
                      xaResources.put(xaRes, manager);
                      return true;
                  }
              }
  
              Xid branchId = xidFactory.createBranch(xid, resourceManagers.size() + 1);
              xaRes.start(branchId, XAResource.TMNOFLAGS);
              ResourceManager manager = new ResourceManager(xaRes, branchId);
              resourceManagers.add(manager);
              xaResources.put(xaRes, manager);
              return true;
          } catch (XAException e) {
              log.warn("Unable to enlist XAResource " + xaRes, e);
              return false;
          }
      }
  
      public synchronized boolean delistResource(XAResource xaRes, int flag) throws IllegalStateException, SystemException {
          if (xaRes == null) {
              throw new IllegalArgumentException("XAResource is null");
          }
          switch (status) {
          case Status.STATUS_ACTIVE:
          case Status.STATUS_MARKED_ROLLBACK:
              break;
          default:
              throw new IllegalStateException("Status is " + getStateString(status));
          }
          ResourceManager manager = (ResourceManager) xaResources.remove(xaRes);
          if (manager == null) {
              throw new IllegalStateException("Resource not enlisted");
          }
          try {
              xaRes.end(manager.branchId, flag);
              return true;
          } catch (XAException e) {
              log.warn("Unable to delist XAResource " + xaRes, e);
              return false;
          }
      }
  
      public void commit() throws HeuristicMixedException, HeuristicRollbackException, RollbackException, SecurityException, SystemException {
          synchronized (this) {
              switch (status) {
              case Status.STATUS_ACTIVE:
              case Status.STATUS_MARKED_ROLLBACK:
                  break;
              default:
                  throw new IllegalStateException("Status is " + getStateString(status));
              }
          }
  
          beforeCompletion();
          endResources();
          try {
              LinkedList rms;
              synchronized (this) {
                  if (status == Status.STATUS_ACTIVE) {
                      if (resourceManagers.size() == 0) {
                          // nothing to commit
                          status = Status.STATUS_COMMITTED;
                      } else if (resourceManagers.size() == 1) {
                          // one-phase commit decision
                          status = Status.STATUS_COMMITTING;
                      } else {
                          // start prepare part of two-phase
                          status = Status.STATUS_PREPARING;
                      }
                  }
                  // resourceManagers is now immutable
                  rms = resourceManagers;
              }
  
              // one-phase
              if (rms.size() == 1) {
                  ResourceManager manager = (ResourceManager) rms.getFirst();
                  try {
                      manager.committer.commit(manager.branchId, true);
                      synchronized (this) {
                          status = Status.STATUS_COMMITTED;
                      }
                      return;
                  } catch (XAException e) {
                      synchronized (this) {
                          status = Status.STATUS_ROLLEDBACK;
                      }
                      RollbackException ex = new RollbackException("Error during one-phase commit");
                      ex.initCause(e);
                      throw ex;
                  }
              }
  
              // two-phase
              try {
                  txnLog.prepare(xid);
              } catch (IOException e) {
                  try {
                      rollbackResources(rms);
                  } catch (Exception se) {
                      log.error("Unable to rollback after failure to log prepare", se.getCause());
                  }
                  SystemException ex = new SystemException("Error logging prepare; transaction was rolled back)");
                  ex.initCause(e);
                  throw ex;
              }
              for (Iterator i = rms.iterator(); i.hasNext();) {
                  synchronized (this) {
                      if (status != Status.STATUS_PREPARING) {
                          // we were marked for rollback
                          break;
                      }
                  }
                  ResourceManager manager = (ResourceManager) i.next();
                  try {
                      int vote = manager.committer.prepare(manager.branchId);
                      if (vote == XAResource.XA_RDONLY) {
                          // we don't need to consider this RM any more
                          i.remove();
                      }
                  } catch (XAException e) {
                      synchronized (this) {
                          status = Status.STATUS_MARKED_ROLLBACK;
                      }
                  }
              }
  
              // decision time...
              boolean willCommit;
              synchronized (this) {
                  willCommit = (status != Status.STATUS_MARKED_ROLLBACK);
                  if (willCommit) {
                      status = Status.STATUS_PREPARED;
                  }
              }
  
              // log our decision
              try {
                  if (willCommit) {
                      txnLog.commit(xid);
                  } else {
                      txnLog.rollback(xid);
                  }
              } catch (IOException e) {
                  try {
                      rollbackResources(rms);
                  } catch (Exception se) {
                      log.error("Unable to rollback after failure to log decision", se.getCause());
                  }
                  SystemException ex = new SystemException("Error logging decision (outcome is unknown)");
                  ex.initCause(e);
                  throw ex;
              }
  
              // notify the RMs
              if (willCommit) {
                  commitResources(rms);
              } else {
                  rollbackResources(rms);
                  throw new RollbackException("Unable to commit");
              }
          } finally {
              afterCompletion();
              synchronized (this) {
                  status = Status.STATUS_NO_TRANSACTION;
              }
          }
      }
  
      public void rollback() throws IllegalStateException, SystemException {
          List rms;
          synchronized (this) {
              switch (status) {
              case Status.STATUS_ACTIVE:
                  status = Status.STATUS_MARKED_ROLLBACK;
                  break;
              case Status.STATUS_MARKED_ROLLBACK:
                  break;
              default:
                  throw new IllegalStateException("Status is " + getStateString(status));
              }
              rms = resourceManagers;
          }
  
          beforeCompletion();
          endResources();
          try {
              try {
                  txnLog.rollback(xid);
              } catch (IOException e) {
                  try {
                      rollbackResources(rms);
                  } catch (Exception se) {
                      log.error("Unable to rollback after failure to log decision", se.getCause());
                  }
                  SystemException ex = new SystemException("Error logging rollback");
                  ex.initCause(e);
                  throw ex;
              }
              rollbackResources(rms);
          } finally {
              afterCompletion();
              synchronized (this) {
                  status = Status.STATUS_NO_TRANSACTION;
              }
          }
      }
  
      private void beforeCompletion() {
          int i = 0;
          while (true) {
              Synchronization synch;
              synchronized (this) {
                  if (i == syncList.size()) {
                      return;
                  }
                  synch = (Synchronization) syncList.get(i++);
              }
              try {
                  synch.beforeCompletion();
              } catch (Exception e) {
                  log.warn("Unexpected exception from beforeCompletion; transaction will roll back", e);
                  synchronized (this) {
                      status = Status.STATUS_MARKED_ROLLBACK;
                  }
              }
          }
      }
  
      private void afterCompletion() {
          // this does not synchronize because nothing can modify our state at this time
          for (Iterator i = syncList.iterator(); i.hasNext();) {
              Synchronization synch = (Synchronization) i.next();
              try {
                  synch.afterCompletion(status);
              } catch (Exception e) {
                  log.warn("Unexpected exception from afterCompletion; continuing", e);
                  continue;
              }
          }
      }
  
      private void endResources() {
          while (true) {
              XAResource xaRes;
              ResourceManager manager;
              int flags;
              synchronized (this) {
                  Set entrySet = xaResources.entrySet();
                  if (entrySet.isEmpty()) {
                      return;
                  }
                  Map.Entry entry = (Map.Entry) entrySet.iterator().next();
                  xaRes = (XAResource) entry.getKey();
                  manager = (ResourceManager) entry.getValue();
                  flags = (status == Status.STATUS_MARKED_ROLLBACK) ? XAResource.TMFAIL : XAResource.TMSUCCESS;
                  xaResources.remove(xaRes);
              }
              try {
                  xaRes.end(manager.branchId, flags);
              } catch (XAException e) {
                  log.warn("Error ending association for XAResource " + xaRes + "; transaction will roll back", e);
                  synchronized (this) {
                      status = Status.STATUS_MARKED_ROLLBACK;
                  }
              }
          }
      }
  
      private void rollbackResources(List rms) throws SystemException {
          SystemException cause = null;
          synchronized (this) {
              status = Status.STATUS_ROLLING_BACK;
          }
          for (Iterator i = rms.iterator(); i.hasNext();) {
              ResourceManager manager = (ResourceManager) i.next();
              try {
                  manager.committer.rollback(manager.branchId);
              } catch (XAException e) {
                  log.error("Unexpected exception rolling back " + manager.committer + "; continuing with rollback", e);
                  if (cause == null) {
                      cause = new SystemException(e.errorCode);
                  }
                  continue;
              }
          }
          synchronized (this) {
              status = Status.STATUS_ROLLEDBACK;
          }
          if (cause != null) {
              throw cause;
          }
      }
  
      private void commitResources(List rms) throws SystemException {
          SystemException cause = null;
          synchronized (this) {
              status = Status.STATUS_COMMITTING;
          }
          for (Iterator i = rms.iterator(); i.hasNext();) {
              ResourceManager manager = (ResourceManager) i.next();
              try {
                  manager.committer.commit(manager.branchId, false);
              } catch (XAException e) {
                  log.error("Unexpected exception committing" + manager.committer + "; continuing to commit other RMs", e);
                  if (cause == null) {
                      cause = new SystemException(e.errorCode);
                  }
                  continue;
              }
          }
          synchronized (this) {
              status = Status.STATUS_COMMITTED;
          }
          if (cause != null) {
              throw cause;
          }
      }
  
      private static String getStateString(int status) {
          switch (status) {
          case Status.STATUS_ACTIVE:
              return "STATUS_ACTIVE";
          case Status.STATUS_PREPARING:
              return "STATUS_PREPARING";
          case Status.STATUS_PREPARED:
              return "STATUS_PREPARED";
          case Status.STATUS_MARKED_ROLLBACK:
              return "STATUS_MARKED_ROLLBACK";
          case Status.STATUS_ROLLING_BACK:
              return "STATUS_ROLLING_BACK";
          case Status.STATUS_COMMITTING:
              return "STATUS_COMMITTING";
          case Status.STATUS_COMMITTED:
              return "STATUS_COMMITTED";
          case Status.STATUS_ROLLEDBACK:
              return "STATUS_ROLLEDBACK";
          case Status.STATUS_NO_TRANSACTION:
              return "STATUS_NO_TRANSACTION";
          case Status.STATUS_UNKNOWN:
              return "STATUS_UNKNOWN";
          default:
              throw new AssertionError();
          }
      }
  
      public boolean equals(Object obj) {
          if (obj instanceof TransactionImpl) {
              TransactionImpl other = (TransactionImpl) obj;
              return xid.equals(other.xid);
          } else {
              return false;
          }
      }
  
      private static class ResourceManager {
          private final XAResource committer;
          private final Xid branchId;
  
          public ResourceManager(XAResource xaRes, Xid branchId) {
              committer = xaRes;
              this.branchId = branchId;
          }
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionLog.java
  
  Index: TransactionLog.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.io.IOException;
  import javax.transaction.xa.Xid;
  
  /**
   * Interface used to notify a logging subsystem of transaction events.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public interface TransactionLog {
      public void begin(Xid xid) throws IOException;
  
      public void prepare(Xid xid) throws IOException;
  
      public void commit(Xid xid) throws IOException;
  
      public void rollback(Xid xid) throws IOException;
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java
  
  Index: TransactionManagerImpl.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.InvalidTransactionException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.Status;
  import javax.transaction.SystemException;
  import javax.transaction.Transaction;
  import javax.transaction.TransactionManager;
  
  import org.apache.geronimo.transaction.log.UnrecoverableLog;
  
  /**
   * Simple implementation of a local transaction manager.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class TransactionManagerImpl implements TransactionManager {
      private final TransactionLog txnLog;
      private final XidFactory xidFactory = new XidFactory();
      private volatile int timeout;
      private final ThreadLocal threadTx = new ThreadLocal();
  
      public TransactionManagerImpl() {
          txnLog = new UnrecoverableLog();
      }
  
      public TransactionManagerImpl(TransactionLog txnLog) {
          this.txnLog = txnLog;
      }
  
      public Transaction getTransaction() throws SystemException {
          return (Transaction) threadTx.get();
      }
  
      public void setTransactionTimeout(int seconds) throws SystemException {
          timeout = seconds;
      }
  
      public int getStatus() throws SystemException {
          Transaction tx = getTransaction();
          return (tx != null) ? tx.getStatus() : Status.STATUS_NO_TRANSACTION;
      }
  
      public void begin() throws NotSupportedException, SystemException {
          if (getStatus() != Status.STATUS_NO_TRANSACTION) {
              throw new NotSupportedException("Nested Transactions are not supported");
          }
          TransactionImpl tx = new TransactionImpl(xidFactory, txnLog);
          threadTx.set(tx);
      }
  
      public Transaction suspend() throws SystemException {
          Transaction tx = getTransaction();
          threadTx.set(null);
          return tx;
      }
  
      public void resume(Transaction tx) throws IllegalStateException, InvalidTransactionException, SystemException {
          if (threadTx.get() != null) {
              throw new IllegalStateException("Transaction already associated with current thread");
          }
          if (tx instanceof TransactionImpl == false) {
              throw new InvalidTransactionException("Cannot resume foreign transaction: " + tx);
          }
          threadTx.set(tx);
      }
  
      public void setRollbackOnly() throws IllegalStateException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          tx.setRollbackOnly();
      }
  
      public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          try {
              tx.commit();
          } finally {
              threadTx.set(null);
          }
      }
  
      public void rollback() throws IllegalStateException, SecurityException, SystemException {
          Transaction tx = getTransaction();
          if (tx == null) {
              throw new IllegalStateException("No transaction associated with current thread");
          }
          try {
              tx.rollback();
          } finally {
              threadTx.set(null);
          }
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/UserTransactionImpl.java
  
  Index: UserTransactionImpl.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.io.Serializable;
  
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.SystemException;
  import javax.transaction.TransactionManager;
  import javax.transaction.UserTransaction;
  
  //import org.apache.geronimo.connector.outbound.connectiontracking.TrackedConnectionAssociator;
  
  /**
   * TODO this needs to migrate to using TransactionContext.
   * TODO this needs to notify the TrackedConnectionAssociator when a tx starts.
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class UserTransactionImpl implements UserTransaction, Serializable{
      private transient TransactionManager transactionManager;
  //    private transient TrackedConnectionAssociator trackedConnectionAssociator;
  
      public UserTransactionImpl() {
      }
  
      public TransactionManager getTransactionManager() {
          return transactionManager;
      }
  
      public void setTransactionManager(TransactionManager transactionManager) {
          this.transactionManager = transactionManager;
      }
  
  //    public TrackedConnectionAssociator getTrackedConnectionAssociator() {
  //        return trackedConnectionAssociator;
  //    }
  
  //    public void setTrackedConnectionAssociator(TrackedConnectionAssociator trackedConnectionAssociator) {
  //        this.trackedConnectionAssociator = trackedConnectionAssociator;
  //    }
  
      public void begin() throws NotSupportedException, SystemException {
          checkState();
          transactionManager.begin();
      }
  
      public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
          checkState();
          transactionManager.commit();
      }
  
      public int getStatus() throws SystemException {
          checkState();
          return transactionManager.getStatus();
      }
  
      public void rollback() throws IllegalStateException, SecurityException, SystemException {
          checkState();
          transactionManager.rollback();
      }
  
      public void setRollbackOnly() throws IllegalStateException, SystemException {
          checkState();
          transactionManager.setRollbackOnly();
      }
  
      public void setTransactionTimeout(int timeout) throws SystemException {
          checkState();
          transactionManager.setTransactionTimeout(timeout);
      }
  
      private void checkState() {
  //        if (transactionManager == null || trackedConnectionAssociator == null) {
  //            throw new IllegalStateException("UserTransaction is disabled");
  //        }
      }
  
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/XidFactory.java
  
  Index: XidFactory.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.net.InetAddress;
  import java.net.UnknownHostException;
  import javax.transaction.xa.Xid;
  
  /**
   * Factory for transaction ids.
   * The Xid is constructed of three parts:
   * <ol><li>8 byte count (LSB first)</li>
   * <li>4 byte system id</li>
   * <li>4 or 16 byte IP address of host</li>
   * <ol>
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   * @todo Should have a way of setting baseId
   */
  public class XidFactory {
      byte[] baseId = new byte[Xid.MAXGTRIDSIZE];
      long count = 1;
  
      public XidFactory() {
          byte[] hostid;
          try {
              hostid = InetAddress.getLocalHost().getAddress();
          } catch (UnknownHostException e) {
              hostid = new byte[]{127, 0, 0, 1};
          }
          int uid = System.identityHashCode(this);
          baseId[8] = (byte) uid;
          baseId[9] = (byte) (uid >>> 8);
          baseId[10] = (byte) (uid >>> 16);
          baseId[11] = (byte) (uid >>> 24);
          System.arraycopy(hostid, 0, baseId, 12, hostid.length);
      }
  
      public Xid createXid() {
          byte[] globalId = (byte[]) baseId.clone();
          long id;
          synchronized (this) {
              id = count++;
          }
          globalId[0] = (byte) id;
          globalId[1] = (byte) (id >>> 8);
          globalId[2] = (byte) (id >>> 16);
          globalId[3] = (byte) (id >>> 24);
          globalId[4] = (byte) (id >>> 32);
          globalId[5] = (byte) (id >>> 40);
          globalId[6] = (byte) (id >>> 48);
          globalId[7] = (byte) (id >>> 56);
          return new XidImpl(globalId);
      }
  
      public Xid createBranch(Xid globalId, int branch) {
          return new XidImpl(globalId, branch);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/java/org/apache/geronimo/transaction/manager/XidImpl.java
  
  Index: XidImpl.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.io.Serializable;
  import java.util.Arrays;
  import javax.transaction.xa.Xid;
  
  /**
   * Unique id for a transaction.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class XidImpl implements Xid, Serializable {
      private static int FORMAT_ID = 0x4765526f;  // Gero
      private final byte[] globalId;
      private final byte[] branchId;
      private final int hash;
  
      /**
       * Constructor taking a global id (for the main transaction)
       * @param globalId the global transaction id
       */
      public XidImpl(byte[] globalId) {
          this.globalId = globalId;
          this.hash = hash(globalId);
          branchId = new byte[Xid.MAXBQUALSIZE];
      }
  
      /**
       * Constructor for a branch id
       * @param global the xid of the global transaction this branch belongs to
       * @param branch the branch id
       */
      public XidImpl(Xid global, int branch) {
          int hash;
          if (global instanceof XidImpl) {
              globalId = ((XidImpl) global).globalId;
              hash = ((XidImpl) global).hash;
          } else {
              globalId = global.getGlobalTransactionId();
              hash = hash(globalId);
          }
          branchId = new byte[Xid.MAXBQUALSIZE];
          branchId[0] = (byte) branch;
          branchId[1] = (byte) (branch >>> 8);
          branchId[2] = (byte) (branch >>> 16);
          branchId[3] = (byte) (branch >>> 24);
          for (int i = 0; i < 4; i++) {
              hash = (hash * 37) + branchId[i];
          }
          this.hash = hash;
      }
  
      private int hash(byte[] id) {
          int hash = 0;
          for (int i = 0; i < id.length; i++) {
              hash = (hash * 37) + id[i];
          }
          return hash;
      }
  
      public int getFormatId() {
          return FORMAT_ID;
      }
  
      public byte[] getGlobalTransactionId() {
          return (byte[]) globalId.clone();
      }
  
      public byte[] getBranchQualifier() {
          return (byte[]) branchId.clone();
      }
  
      public boolean equals(Object obj) {
          if (obj instanceof XidImpl == false) {
              return false;
          }
          XidImpl other = (XidImpl) obj;
          return Arrays.equals(globalId, other.globalId) && Arrays.equals(branchId, other.branchId);
      }
  
      public int hashCode() {
          return hash;
      }
  
      public String toString() {
          StringBuffer s = new StringBuffer();
          s.append("[globalId=");
          for (int i = 0; i < globalId.length; i++) {
              s.append(Integer.toHexString(globalId[i]));
          }
          s.append(",branchId=");
          for (int i = 0; i < branchId.length; i++) {
              s.append(Integer.toHexString(branchId[i]));
          }
          s.append("]");
          return s.toString();
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/test/org/apache/geronimo/transaction/manager/MockResource.java
  
  Index: MockResource.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import javax.transaction.xa.XAException;
  import javax.transaction.xa.XAResource;
  import javax.transaction.xa.Xid;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class MockResource implements XAResource {
      private Xid xid;
      private MockResourceManager manager;
      private int timeout = 0;
  
      public MockResource(MockResourceManager manager) {
          this.manager = manager;
      }
  
      public int getTransactionTimeout() throws XAException {
          return timeout;
      }
  
      public boolean setTransactionTimeout(int seconds) throws XAException {
          return false;
      }
  
      public Xid getXid() {
          return xid;
      }
  
      public void start(Xid xid, int flags) throws XAException {
          if (this.xid != null) {
              throw new XAException(XAException.XAER_PROTO);
          }
          if ((flags & XAResource.TMJOIN) != 0) {
              manager.join(xid, this);
          } else {
              manager.newTx(xid, this);
          }
          this.xid = xid;
      }
  
      public void end(Xid xid, int flags) throws XAException {
          if (this.xid != xid) {
              throw new XAException(XAException.XAER_INVAL);
          }
          this.xid = null;
      }
  
      public int prepare(Xid xid) throws XAException {
          return 0;
      }
  
      public void commit(Xid xid, boolean onePhase) throws XAException {
      }
  
      public void rollback(Xid xid) throws XAException {
          manager.forget(xid, this);
      }
  
      public boolean isSameRM(XAResource xaResource) throws XAException {
          if (xaResource instanceof MockResource) {
              return manager == ((MockResource) xaResource).manager;
          }
          return false;
      }
  
      public void forget(Xid xid) throws XAException {
          throw new UnsupportedOperationException();
      }
  
      public Xid[] recover(int flag) throws XAException {
          throw new UnsupportedOperationException();
      }
  
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/test/org/apache/geronimo/transaction/manager/MockResourceManager.java
  
  Index: MockResourceManager.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Set;
  import javax.transaction.xa.XAException;
  import javax.transaction.xa.XAResource;
  import javax.transaction.xa.Xid;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class MockResourceManager {
      private boolean willCommit;
      private Map xids = new HashMap();
  
      public MockResourceManager(boolean willCommit) {
          this.willCommit = willCommit;
      }
  
      public MockResource getResource() {
          return new MockResource(this);
      }
  
      public void join(Xid xid, XAResource xaRes) throws XAException {
          Set resSet = (Set) xids.get(xid);
          if (resSet == null) {
              throw new XAException(XAException.XAER_NOTA);
          }
          resSet.add(xaRes);
      }
  
      public void newTx(Xid xid, XAResource xaRes) throws XAException {
          if (xids.containsKey(xid)) {
              throw new XAException(XAException.XAER_DUPID);
          }
          Set resSet = new HashSet();
          resSet.add(xaRes);
          xids.put(xid, resSet);
      }
  
      public void forget(Xid xid, XAResource xaRes) throws XAException {
          if (xids.remove(xid) == null) {
              throw new XAException(XAException.XAER_NOTA);
          }
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/test/org/apache/geronimo/transaction/manager/TestTransactionManager.java
  
  Index: TestTransactionManager.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import javax.transaction.Status;
  import javax.transaction.Transaction;
  import javax.transaction.TransactionManager;
  import javax.transaction.xa.XAResource;
  
  import junit.framework.TestCase;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class TestTransactionManager extends TestCase {
      TransactionManager tm;
      MockResourceManager rm1, rm2, rm3;
  
      public void testNoTransaction() throws Exception {
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          assertNull(tm.getTransaction());
      }
  
      public void testNoResource() throws Exception {
          Transaction tx;
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          tm.begin();
          assertEquals(Status.STATUS_ACTIVE, tm.getStatus());
          tx = tm.getTransaction();
          assertNotNull(tx);
          assertEquals(Status.STATUS_ACTIVE, tx.getStatus());
          tm.rollback();
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          assertNull(tm.getTransaction());
          assertEquals(Status.STATUS_NO_TRANSACTION, tx.getStatus());
  
          tm.begin();
          assertEquals(Status.STATUS_ACTIVE, tm.getStatus());
          tm.rollback();
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
      }
  
      public void testTxOp() throws Exception {
          Transaction tx;
          tm.begin();
          tx = tm.getTransaction();
          tx.rollback();
          assertEquals(Status.STATUS_NO_TRANSACTION, tx.getStatus());
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
  
          tm.begin();
          assertFalse(tx.equals(tm.getTransaction()));
          tm.rollback();
      }
  
      public void testSuspend() throws Exception {
          Transaction tx;
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          tm.begin();
          assertEquals(Status.STATUS_ACTIVE, tm.getStatus());
          tx = tm.getTransaction();
          assertNotNull(tx);
          assertEquals(Status.STATUS_ACTIVE, tx.getStatus());
  
          tx = tm.suspend();
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          assertNull(tm.getTransaction());
  
          tm.resume(tx);
          assertEquals(Status.STATUS_ACTIVE, tm.getStatus());
          assertEquals(tx, tm.getTransaction());
  
          tm.rollback();
          assertEquals(Status.STATUS_NO_TRANSACTION, tm.getStatus());
          assertNull(tm.getTransaction());
      }
  
      public void testOneResource() throws Exception {
          Transaction tx;
          MockResource res1 = rm1.getResource();
          tm.begin();
          tx = tm.getTransaction();
          assertNull(res1.getXid());
          assertTrue(tx.enlistResource(res1));
          assertNotNull(res1.getXid());
          assertTrue(tx.delistResource(res1, XAResource.TMFAIL));
          assertNull(res1.getXid());
          tm.rollback();
  
          tm.begin();
          tx = tm.getTransaction();
          assertTrue(tx.enlistResource(res1));
          tm.rollback();
          assertNull(res1.getXid());
      }
  
      protected void setUp() throws Exception {
          tm = new TransactionManagerImpl();
          rm1 = new MockResourceManager(true);
          rm2 = new MockResourceManager(true);
          rm3 = new MockResourceManager(false);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/transaction/src/test/org/apache/geronimo/transaction/manager/XATransactionTester.java
  
  Index: XATransactionTester.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.transaction.manager;
  
  import java.sql.Connection;
  import java.sql.Statement;
  import java.io.IOException;
  import javax.sql.XAConnection;
  import javax.sql.XADataSource;
  import javax.transaction.TransactionManager;
  import javax.transaction.xa.XAResource;
  import javax.transaction.xa.Xid;
  import javax.transaction.xa.XAException;
  
  /**
   *
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/23 18:54:16 $
   */
  public class XATransactionTester {
      private TransactionLog log;
      private TransactionManager manager;
      private XADataSource ds;
      private Xid xid;
  
      public static void main(String[] args) throws Exception {
          new XATransactionTester().run(args);
      }
  
      public void run(String[] args) throws Exception {
          ds = getDataSource(args);
          XAConnection xaConn = ds.getXAConnection("test", "test");
          XAResource xaRes = xaConn.getXAResource();
          log = new DummyLog();
          manager = new TransactionManagerImpl(log);
          Connection c = xaConn.getConnection();
          Statement s = c.createStatement();
  
          manager.begin();
          manager.getTransaction().enlistResource(xaRes);
          s.execute("UPDATE XA_TEST SET X=X+1");
          manager.getTransaction().delistResource(xaRes, XAResource.TMSUCCESS);
          manager.commit();
  
  /*
          manager.begin();
          manager.getTransaction().enlistResource(xaRes);
          xid = new XidImpl(xid, 1);
          System.out.println("xid = " + xid);
          s.execute("UPDATE XA_TEST SET X=X+1");
  
          xaRes.end(xid, XAResource.TMSUCCESS);
          xaRes.prepare(xid);
          c.close();
  */
  
  /*
          Xid[] prepared = xaRes.recover(XAResource.TMNOFLAGS);
          for (int i = 0; i < prepared.length; i++) {
              Xid xid = prepared[i];
              StringBuffer s = new StringBuffer();
              s.append(Integer.toHexString(xid.getFormatId())).append('.');
              byte[] globalId = xid.getGlobalTransactionId();
              for (int j = 0; j < globalId.length; j++) {
                  s.append(Integer.toHexString(globalId[j]));
              }
  
              System.out.println("recovery = " + s);
              xaRes.forget(xid);
          }
  */
  
      }
  
      /*
       * @todo get something that loads this from a file
       */
      private XADataSource getDataSource(String[] args) throws Exception {
  //        oracle.jdbc.xa.client.OracleXADataSource ds = new oracle.jdbc.xa.client.OracleXADataSource();
  //        ds.setURL("jdbc:oracle:thin:@localhost:1521:ABU");
  //        return ds;
          return null;
      }
  
      private class DummyLog implements TransactionLog {
  
          public void begin(Xid xid) throws IOException {
              XATransactionTester.this.xid = xid;
          }
  
          public void prepare(Xid xid) throws IOException {
          }
  
          public void commit(Xid xid) throws IOException {
          }
  
          public void rollback(Xid xid) throws IOException {
          }
      }
  }