((Integer)cmd_props.get(MessageType.JMQ_MESSAGE_TYPE)).intValue();
int status = Status.OK;
String errMsg = null;
TransactionUID tid = null;
TransactionState ts = null;
TransactionHandler thandler = null;
// Get the packet handler that handles transaction packets
if (parent.adminPktRtr != null) {
thandler = (TransactionHandler)
parent.adminPktRtr.getHandler(PacketType.ROLLBACK_TRANSACTION);
}
Long id = (Long)cmd_props.get(MessageType.JMQ_TRANSACTION_ID);
HAMonitorService hamonitor = Globals.getHAMonitorService();
if (hamonitor != null && hamonitor.inTakeover()) {
status = Status.ERROR;
errMsg = rb.getString(rb.E_CANNOT_PROCEED_TAKEOVER_IN_PROCESS);
logger.log(Logger.ERROR, this.getClass().getName() + ": " + errMsg);
}
if (id != null) {
tid = new TransactionUID(id.longValue());
} else {
status = Status.BAD_REQUEST;
}
if (status == Status.OK) {
ts = tl.retrieveState(tid);
if (ts == null) {
// Specified transaction did not exist
status = Status.NOT_FOUND;
errMsg = rb.getString(rb.E_NO_SUCH_TRANSACTION, tid);
} else if (requestType == MessageType.COMMIT_TRANSACTION &&
ts.getState() != TransactionState.PREPARED) {
status = Status.PRECONDITION_FAILED;
errMsg = rb.getString(rb.E_TRANSACTION_NOT_PREPARED, tid);
} else if (requestType == MessageType.ROLLBACK_TRANSACTION &&
(ts.getState() < TransactionState.STARTED ||
ts.getState() > TransactionState.PREPARED)) {
status = Status.PRECONDITION_FAILED;
errMsg = rb.getString(rb.E_INVALID_TXN_STATE_FOR_ROLLBACK, tid);
} else {
JMQXid xid = tl.UIDToXid(tid);
if (xid == null &&
(!(Globals.getHAEnabled() &&
ts.getState() == TransactionState.PREPARED))) {
/*
* Need to pick the right error message:
* If (action is ROLLBACK and state is one of {STARTED, FAILED,
* INCOMPLETE, COMPLETE})
* "Rollback of non-XA transaction 123456789 in non-PREPARED state
* is not supported."
* else
* "Could not find Xid for 123456789"
*/
if (requestType == MessageType.ROLLBACK_TRANSACTION &&
(ts.getState() >= TransactionState.STARTED &&
ts.getState() < TransactionState.PREPARED)) {
errMsg = rb.getString(rb.E_INTERNAL_BROKER_ERROR,
"Rollback of non-XA transaction "
+ tid
+ " in non-PREPARED state is not supported.") ;
} else {
errMsg = rb.getString(rb.E_INTERNAL_BROKER_ERROR,
"Could not find Xid for " + tid) ;
}
status = Status.ERROR;
} else if (thandler == null) {
errMsg = rb.getString(rb.E_INTERNAL_BROKER_ERROR,
"Could not locate TransactionHandler") ;
status = Status.ERROR;
} else {
if (requestType == MessageType.ROLLBACK_TRANSACTION) {
if ( DEBUG ) {
logger.log(Logger.DEBUG,
"Rolling back " + tid + " in state " + ts);
}
try {
thandler.doRollback(tid, xid, null, ts, null,
con, RollbackReason.ADMIN);
} catch (BrokerException e) {
status = Status.ERROR;
errMsg = e.getMessage();
}
} else if (requestType == MessageType.COMMIT_TRANSACTION) {
if ( DEBUG ) {
logger.log(Logger.DEBUG,
"Committing " + tid + " in state " + ts);
}
try {
thandler.doCommit(tid, xid,
new Integer(XAResource.TMNOFLAGS), ts, null,
false, con, null);
} catch (BrokerException e) {
status = Status.ERROR;
errMsg = e.getMessage();