public void commit(Xid xid, boolean isOnePhase) throws XAException {
   // always call prepare() - even if this is just a 1PC!
   if (isOnePhase) prepare(xid);
   if (trace) log.trace("committing TransactionXaAdapter: " + globalTx);
   try {
     LocalTxInvocationContext ctx = icc.createTxInvocationContext();
     ctx.setXaCache(this);
     if (configuration.isOnePhaseCommit()) {
       checkMarkedForRollback();
       if (trace) log.trace("Doing an 1PC prepare call on the interceptor chain");
       PrepareCommand command = commandsFactory.buildPrepareCommand(globalTx, modifications, true);
       try {
         invoker.invoke(ctx, command);
       } catch (Throwable e) {
         log.error("Error while processing 1PC PrepareCommand", e);
         throw new XAException(XAException.XAER_RMERR);
       }
     } else {
       CommitCommand commitCommand = commandsFactory.buildCommitCommand(globalTx);
       try {
         invoker.invoke(ctx, commitCommand);
       } catch (Throwable e) {
         log.error("Error while processing 1PC PrepareCommand", e);
         throw new XAException(XAException.XAER_RMERR);
       }
     }
   } finally {
     txTable.removeLocalTransaction(transaction);
     this.modifications = null;
   }
 }
 public void testPrepareTxMarkedForRollback() {
   localTx.markForRollback();
   try {
     xaAdapter.prepare(xid);
     assert false;
   } catch (XAException e) {
     assert e.errorCode == XAException.XA_RBROLLBACK;
   }
 }
 public void testPrepareOnNonexistentXid() {
   DummyXid xid = new DummyXid();
   try {
     xaAdapter.prepare(xid);
     assert false;
   } catch (XAException e) {
     assert e.errorCode == XAException.XAER_NOTA;
   }
 }
 public void testOnePhaseCommitConfigured() throws XAException {
   configuration.setCacheMode(Configuration.CacheMode.INVALIDATION_ASYNC); // this would force 1pc
   assert XAResource.XA_OK == xaAdapter.prepare(xid);
 }