docs: public final void start() throws XAException
      {
          if (tc.isEntryEnabled()) Tr.entry(tc, "start", new Object[]{_resource, printState(_state)});
          if (tcSummary.isDebugEnabled()) Tr.debug(tcSummary, "xa_start", this);
  
          int rc = -1;  // not an XA RC
          try
          {
              int flags;
              // Check the current state of the XAResource.
              switch (_state)
              {
                  case NOT_ASSOCIATED:
                      flags = _startFlag;
                      break;
                  case NOT_ASSOCIATED_AND_TMJOIN:
                      flags = XAResource.TMJOIN;
                      break;
                  case ACTIVE:
                      if (tc.isEntryEnabled()) Tr.exit(tc, "startAssociation");
                      return;
                  case SUSPENDED:
                      if (!_supportResume)
                      {
                          Tr.warning(tc, "WTRN0021_TMRESUME_NOT_SUPPORTED");
                          throw new XAException(XAException.XAER_INVAL);
                      }
  
                      flags = XAResource.TMRESUME;
                      break;
                  case ROLLBACK_ONLY:
                      throw new XAException(XAException.XA_RBROLLBACK);
                  default:
                      //
                      // should never happen.
                      //
                      Tr.warning(tc, "WTRN0022_UNKNOWN_XARESOURCE_STATE");
                  case FAILED:
                  case IDLE:
                      throw new XAException(XAException.XAER_PROTO);
              }
  
              if (tc.isEventEnabled()) Tr.event(tc, "xa_start with flag: " + Util.printFlag(flags));
  
              _resource.start(_xid, flags);
              rc = XAResource.XA_OK;
              _state = ACTIVE;
          }
          catch (XAException xae)
          {
              processXAException("start", xae);
              rc = xae.errorCode;
  
              if (xae.errorCode >= XAException.XA_RBBASE && xae.errorCode <= XAException.XA_RBEND)
                  _state = ROLLBACK_ONLY;
              else if (xae.errorCode != XAException.XAER_OUTSIDE)
                  _state = FAILED;
  
              throw xae;
          }
          catch (Throwable t)
          { 
              _state = FAILED;
              processThrowable("start", t);
          }
          finally
          {
              if (tc.isEntryEnabled()) Tr.exit(tc, "start");
              if (tcSummary.isDebugEnabled()) Tr.debug(tcSummary, "xa_start result:", XAReturnCodeHelper.convertXACode(rc));
          }
      }