docs: public UOWCookie preInvoke(EJBKey key, EJBMethodInfoImpl methodInfo)
                      throws CSIException
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled()) { // d173022.3
              Tr.entry(tc, "preInvoke");
          }
  
          // Control point on application thread for effecting       //LIDB1673.2.1.5
          // rollback in the case of timeout                         //LIDB1673.2.1.5//d171654
          // conditions for transaction associated with the thread   //LIDB1673.2.1.5
          // (i.e. the calling bean)                                 //LIDB1673.2.1.5
          completeTxTimeout(); //LIDB1673.2.1.5
  
          TranStrategy ts =
                          txStrategies[methodInfo.getTransactionAttribute().getValue()];
  
          // LIDB1181.23.5
          //-------------------------------------------------------------
          // Suspend any local transaction that exists on entry. It
          // will be resumed on postInvoke.  Suspended coordinator is
          // carried forward to postInvoke in TxCookieImpl.
          //-------------------------------------------------------------
  
          // LIDB2446: shareable ltc -- suspend as required in individual transtrategies
          // LocalTransactionCoordinator suspendedLocal = suspendLocalTx(); // 131880-6
  
          //--------------------------------------------------------------------
          // Invoke preInvoke on the configured transaction strategy (REQUIRED,
          // MANDATORY, etc).  This may suspend a Global Tran, start a Local or
          // Global tran, or throw a CSIException (for example if MANDATORY and
          // there is no Global Tran), etc...
          //--------------------------------------------------------------------
  
          TxCookieImpl txCookie = null;
          try
          {
              txCookie = ts.preInvoke(key, methodInfo);
          } catch (Throwable th)
          {
              FFDCFilter.processException(th, CLASS_NAME + ".preInvoke",
                                          "266", this);
              if (isTraceOn && tc.isEventEnabled()) {
                  Tr.event(tc, "Tran Strategy preInvoke failed", th);
              }
  
              //-----------------------------------------------------------------
              // If preInvoke failed, then postInvoke will not be called (as
              // there is no txCookie to return, so cleanup must be performed
              // here.  The only thing that needs to be done is to resume
              // a Local tran if it was suspended above.                  d123372
              //-----------------------------------------------------------------
  
              // LIDB2446: shareable ltc ... suspend will happen in transtrategy now
              // if (suspendedLocal != null)
              // {
              //    try
              //    {
              //       resumeLocalTx(suspendedLocal);
              //    }
              //    catch (Throwable ex)
              //    {
              //       FFDCFilter.processException(ex, CLASS_NAME + ".preInvoke",
              //                                   "280", this);
              //       if (isTraceOn && tc.isEventEnabled()) {
              //          Tr.event(tc, "Local tx resume failed", ex);
              //       }
              //    }
              // }
  
              if (th instanceof CSIException)
                  throw (CSIException) th;
              else
                  throw new CSIException("Tran Strategy preInvoke failed", th);
          }
  
          //d135218 - deleted check for suspend of both inbound local tx and
          //          inbound global tx.  By design, we should have a local tx
          //          or a global tx, but never both.
  
          // Store suspended local tx in cookie so we can resume it in postInvoke
          // LIDB2446: suspended ltc stored by individual transtrategies
          // if (suspendedLocal != null) {
          //    txCookie.suspendedLocalTx = suspendedLocal;
          // }
  
          txCookie.methodInfo = methodInfo;
  
          //------------------------------------------------------------------------
          // Now that the TranStrategy has finished, get the resulting
          // Tran Coordinator and cache it in the cookie.  Note that
          // the Coordinator may be null for BMT and EJB 1.0.              d139352-2
          //------------------------------------------------------------------------
          try
          {
              // The EJB Specification seems to imply that after setRollBackOnly()
              // has been called, the customer may elect to continue... even though
              // the tran must eventually rollback... so, do not throw an exception
              // here if the tran has been marked for rollback.               PQ99912
              txCookie.ivCoordinator = getCurrentTransactionalUOW(false); // d166414
          } catch (Throwable throwable)
          {
              FFDCFilter.processException(throwable, CLASS_NAME + ".preInvoke",
                                          "266", this);
              if (isTraceOn && tc.isEventEnabled()) {
                  Tr.event(tc, "getCurrentTransactionalUOW failed", throwable);
              }
  
              //---------------------------------------------------------------------
              // Java EE Compliance - If we are invoking a method on a bean using
              // bean managed transactions, then let the method invocation proceed
              // despite the fact that the associated transaction has rolled back.
              // This allows a client to cleanup UserTransaction state (by calling
              // ut.commit() or ut.rollback() on the already rolled back
              // transaction. The method will continue on in the Txn which has been
              // marked for rollback
              //------------------------------------------------------------------
              boolean ivFailPreinvoke = false;//d171654
  
              //d174358 remove getValue calls
              if ((throwable instanceof CSITransactionRolledbackException) &&
                  (methodInfo.getTransactionAttribute() ==
                  TransactionAttribute.TX_BEAN_MANAGED))
              {
                  if (isTraceOn && tc.isEventEnabled())
                      Tr.event(tc, "BMT - allowing method to proceed");
                  // 160238-------------->
                  // Ignore rolledback only state and get the tx
  
                  try
                  {
                      txCookie.ivCoordinator = getCurrentTransactionalUOW(false); // d166414
                  } catch (Throwable throwable1)
                  {
                      FFDCFilter.processException(throwable, CLASS_NAME + ".preInvoke",
                                                  "386", this);
  
                      if (isTraceOn && tc.isEventEnabled())
                          Tr.event(tc, "BMT - failed trying to get Tran BMT bean in invalid state");
                      ivFailPreinvoke = true;//d171654
  
                  }
                  // <--------------160238
  
                  if (isTraceOn && tc.isEntryEnabled()) // d173022.3
                      Tr.exit(tc, "preInvoke (RolledBack) using old stuff : " + txCookie);
                  if (ivFailPreinvoke == false)
                      return txCookie;//d171654
  
              }
  
              //---------------------------------------------------------------------
              // If getCurrentTransactionalUOW failed, then postInvoke will not be
              // called (as txCookie will not be returned), so cleanup must be
              // performed here.  Since TranStrategy.preInvoke did return a txCookie
              // above, all that needs to be done for cleanup is to call postInvoke
              // with that txCookie.
              //---------------------------------------------------------------------
  
              try
              {
                  postInvoke(key, txCookie, ExceptionType.UNCHECKED_EXCEPTION, methodInfo);
              } catch (Throwable th)
              {
                  FFDCFilter.processException(th, CLASS_NAME + ".preInvoke",
                                              "266", this);
                  if (isTraceOn && tc.isEventEnabled()) {
                      Tr.event(tc, "postInvoke failed : original exception re-thrown",
                               th);
                  }
              }
  
              if (throwable instanceof CSIException)
                  throw (CSIException) throwable;
              else
                  throw new CSIException("getCurrentTransactionalUOW failed", throwable);
          }
  
          if (isTraceOn && tc.isEntryEnabled()) { // d173022.3
              Tr.exit(tc, "preInvoke : " + txCookie);
          }
  
          return txCookie;
  
      }