1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
/*
* 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;
}
}
|