/* * Copyright (c) 2000-2007 MetaMatrix, Inc. * All rights reserved. */ package org.teiid.test.framework.transaction; import java.util.Random; import javax.transaction.xa.XAResource; import org.teiid.client.xa.XidImpl; import org.teiid.test.framework.TransactionContainer; import org.teiid.test.framework.TransactionQueryTestCase; import org.teiid.test.framework.exception.TransactionRuntimeException; public class StandaloneGlobalTransaction extends TransactionContainer { private static Random RANDOM = new Random(); private XidImpl xid; public StandaloneGlobalTransaction() { super(); } @Override protected void before(TransactionQueryTestCase test) { try { xid = createXid(); XAResource xaResource = test.getConnectionStrategy().getXAConnection().getXAResource(); xaResource.setTransactionTimeout(120); xaResource.start(xid, XAResource.TMNOFLAGS); } catch (Exception e) { throw new TransactionRuntimeException(e); } } public static XidImpl createXid() { byte[] gid = new byte[10]; byte[] bid = new byte[10]; RANDOM.nextBytes(gid); RANDOM.nextBytes(bid); return new XidImpl(0, gid, bid); } @Override protected void after(TransactionQueryTestCase test) { boolean delistSuccessful = false; boolean commit = false; try { XAResource xaResource = test.getConnectionStrategy().getXAConnection().getXAResource(); xaResource.end(xid, XAResource.TMSUCCESS); if (!test.exceptionExpected() && xaResource.prepare(xid) == XAResource.XA_OK) { commit = true; } delistSuccessful = true; } catch (Exception e) { throw new TransactionRuntimeException(e); } finally { try { if (!delistSuccessful || test.rollbackAllways()|| test.exceptionOccurred()) { test.getConnectionStrategy().getXAConnection().getXAResource().rollback(xid); } else if (commit) { test.getConnectionStrategy().getXAConnection().getXAResource().commit(xid, true); } } catch (Exception e) { throw new TransactionRuntimeException(e); } } } }