/**
   * Handle the request.
   *
   * @param soapMessage The current message context.
   * @param installSubordinateTx true if a subordinate transaction should be interposed and false if
   *     the handler should just resume the incoming transaction. currently only works for AT
   *     transactions but will eventually be extended to work for BA transactions too.
   */
  protected boolean handleInboundMessage(
      final SOAPMessage soapMessage, boolean installSubordinateTx) {
    if (soapMessage != null) {
      try {
        final SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
        final SOAPHeader soapHeader = soapEnvelope.getHeader();
        final SOAPHeaderElement soapHeaderElement =
            getHeaderElement(
                soapHeader,
                CoordinationConstants.WSCOOR_NAMESPACE,
                CoordinationConstants.WSCOOR_ELEMENT_COORDINATION_CONTEXT);

        if (soapHeaderElement != null) {
          final CoordinationContextType cc =
              CoordinationContextHelper.deserialise(soapHeaderElement);
          final String coordinationType = cc.getCoordinationType();
          if (AtomicTransactionConstants.WSAT_PROTOCOL.equals(coordinationType)) {
            clearMustUnderstand(soapHeader, soapHeaderElement);
            TxContext txContext = new TxContextImple(cc);
            if (installSubordinateTx) {
              txContext = SubordinateImporter.importContext(cc);
            }
            TransactionManagerFactory.transactionManager().resume(txContext);
          } else if (BusinessActivityConstants.WSBA_PROTOCOL_ATOMIC_OUTCOME.equals(
              coordinationType)) {
            // interposition is not yet implemented for business activities
            clearMustUnderstand(soapHeader, soapHeaderElement);
            TxContext txContext = new com.arjuna.mwlabs.wst11.ba.context.TxContextImple(cc);
            if (installSubordinateTx) {
              txContext = com.arjuna.mwlabs.wst11.ba.SubordinateImporter.importContext(cc);
            }
            BusinessActivityManagerFactory.businessActivityManager().resume(txContext);
          } else {
            wstxLogger.i18NLogger.warn_mw_wst11_service_JaxHC11P_2(
                "com.arjuna.mw.wst11.service.JaxBaseHeaderContextProcessor.handleRequest(MessageContext context)",
                coordinationType);
          }
        }
      } catch (final Throwable th) {
        wstxLogger.i18NLogger.warn_mw_wst11_service_JaxHC11P_1(
            "com.arjuna.mw.wst11.service.JaxBaseHeaderContextProcessor.handleRequest(MessageContext context)",
            th);
      }
    }
    return true;
  }
  /** Suspend the current transaction. */
  protected void suspendTransaction() {
    try {
      /*
       * There should either be an Atomic Transaction *or* a Business Activity
       * associated with the thread.
       */
      final TransactionManager transactionManager = TransactionManagerFactory.transactionManager();
      final BusinessActivityManager businessActivityManager =
          BusinessActivityManagerFactory.businessActivityManager();

      if (transactionManager != null) {
        transactionManager.suspend();
      }

      if (businessActivityManager != null) {
        businessActivityManager.suspend();
      }
    } catch (final Throwable th) {
      wstxLogger.i18NLogger.warn_mw_wst11_service_JaxHC11P_1(
          "com.arjuna.mw.wst11.service.JaxBaseHeaderContextProcessor.suspendTransaction()", th);
    }
  }