/* * Bitronix Transaction Manager * * Copyright (c) 2010, Bitronix Software. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package bitronix.tm.mock.resource; import javax.transaction.xa.*; import bitronix.tm.internal.BitronixXAException; import bitronix.tm.mock.events.*; import bitronix.tm.mock.resource.jdbc.*; /** * * @author lorban */ public class MockXAResource implements XAResource { private int prepareRc = XAResource.XA_OK; private int transactiontimeout; private MockitoXADataSource xads; private XAException endException; private XAException prepareException; private XAException commitException; private XAException rollbackException; private RuntimeException prepareRuntimeException; private XAException recoverException; private long recoveryDelay; public MockXAResource(MockitoXADataSource xads) { this.xads = xads; } public void setRecoveryDelay(long recoveryDelay) { this.recoveryDelay = recoveryDelay; } public void setPrepareRc(int prepareRc) { this.prepareRc = prepareRc; } public void addInDoubtXid(Xid xid) { xads.addInDoubtXid(xid); } private EventRecorder getEventRecorder() { return EventRecorder.getEventRecorder(this); } /* Interface implementation */ public int getTransactionTimeout() throws XAException { return transactiontimeout; } public boolean setTransactionTimeout(int i) throws XAException { this.transactiontimeout = i; return true; } public boolean isSameRM(XAResource xaResource) throws XAException { boolean result = xaResource == this; getEventRecorder().addEvent(new XAResourceIsSameRmEvent(this, xaResource, result)); return result; } public Xid[] recover(int flag) throws XAException { if (recoveryDelay > 0) { try { Thread.sleep(recoveryDelay); } catch (InterruptedException e) { // ignore } } if (recoverException != null) throw recoverException; if (xads == null) return new Xid[0]; return xads.getInDoubtXids(); } public int prepare(Xid xid) throws XAException { if (prepareException != null) { getEventRecorder().addEvent(new XAResourcePrepareEvent(this, prepareException, xid, -1)); prepareException.fillInStackTrace(); throw prepareException; } if (prepareRuntimeException != null) { prepareRuntimeException.fillInStackTrace(); getEventRecorder().addEvent(new XAResourcePrepareEvent(this, prepareRuntimeException, xid, -1)); throw prepareRuntimeException; } getEventRecorder().addEvent(new XAResourcePrepareEvent(this, xid, prepareRc)); return prepareRc; } public void forget(Xid xid) throws XAException { getEventRecorder().addEvent(new XAResourceForgetEvent(this, xid)); boolean found = xads.removeInDoubtXid(xid); if (!found) throw new BitronixXAException("unknown XID: " + xid, XAException.XAER_INVAL); } public void rollback(Xid xid) throws XAException { getEventRecorder().addEvent(new XAResourceRollbackEvent(this, rollbackException, xid)); if (rollbackException != null) throw rollbackException; if (xads != null) xads.removeInDoubtXid(xid); } public void end(Xid xid, int flag) throws XAException { getEventRecorder().addEvent(new XAResourceEndEvent(this, xid, flag)); if (endException != null) throw endException; } public void start(Xid xid, int flag) throws XAException { getEventRecorder().addEvent(new XAResourceStartEvent(this, xid, flag)); } public void commit(Xid xid, boolean b) throws XAException { getEventRecorder().addEvent(new XAResourceCommitEvent(this, commitException, xid, b)); if (commitException != null) throw commitException; if (xads != null) xads.removeInDoubtXid(xid); } public void setEndException(XAException endException) { this.endException = endException; } public void setPrepareException(XAException prepareException) { this.prepareException = prepareException; } public void setPrepareException(RuntimeException prepareException) { this.prepareRuntimeException = prepareException; } public void setCommitException(XAException commitException) { this.commitException = commitException; } public void setRollbackException(XAException rollbackException) { this.rollbackException = rollbackException; } public void setRecoverException(XAException recoverException) { this.recoverException = recoverException; } }