package pt.ist.fenixframework.util; import java.lang.ref.WeakReference; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.RollbackException; import javax.transaction.Synchronization; import javax.transaction.SystemException; import javax.transaction.xa.XAResource; import pt.ist.fenixframework.FenixAbstractTransaction; import pt.ist.fenixframework.txintrospector.TxIntrospector; import pt.ist.fenixframework.txintrospector.TxStats; public class JTADelegatingTransaction extends FenixAbstractTransaction { private final WeakReference<javax.transaction.Transaction> delegateTxRef; public JTADelegatingTransaction(javax.transaction.Transaction delegateTx) { super(); this.delegateTxRef = new WeakReference<javax.transaction.Transaction>(delegateTx); } private javax.transaction.Transaction getDelegateTx() { javax.transaction.Transaction delegateTx = delegateTxRef.get(); if (delegateTx == null) { throw new IllegalStateException("Delegate transaction no longer exists"); } return delegateTx; } @Override public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, SystemException { getDelegateTx().commit(); } @Override public boolean delistResource(XAResource xaRes, int flag) throws IllegalStateException, SystemException { return getDelegateTx().delistResource(xaRes, flag); } @Override public boolean enlistResource(XAResource xaRes) throws RollbackException, IllegalStateException, SystemException { return getDelegateTx().enlistResource(xaRes); } @Override public int getStatus() throws SystemException { return getDelegateTx().getStatus(); } @Override public void registerSynchronization(Synchronization sync) throws RollbackException, IllegalStateException, SystemException { getDelegateTx().registerSynchronization(sync); } @Override public void rollback() throws IllegalStateException, SystemException { getDelegateTx().rollback(); } @Override public void setRollbackOnly() throws IllegalStateException, SystemException { getDelegateTx().setRollbackOnly(); } private final TxIntrospector introspector = TxStats.newInstance(); @Override public TxIntrospector getTxIntrospector() { return introspector; } }