docs: public static final void getAnnotationCMTransactions(TransactionAttribute[] tranAttrs,
                                                           int methodInterfaceType,
                                                           Method[] beanMethods,
                                                           BeanMetaData bmd)
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "getAnnotationCMTransactions");
  
          for (int i = 0; i < beanMethods.length; i++)
          {
              // Only get the value from annotations if it is not already set by WCCM
              if (tranAttrs[i] == null)
              {
                  javax.ejb.TransactionAttribute methTranAttr = null;
  
                  // Don't bother looking for annotations, if we're told there are none.
                  if (!bmd.metadataComplete) {
                      methTranAttr = beanMethods[i].getAnnotation(javax.ejb.TransactionAttribute.class);
  
                      if (methTranAttr == null &&
                          // EJB 3.2, section 4.3.14:
                          // "A stateful session bean's PostConstruct, PreDestroy,
                          // PrePassivate or PostActivate lifecycle callback
                          // interceptor method is invoked in the scope of a
                          // transaction determined by the transaction attribute
                          // specified in the lifecycle callback method's metadata
                          // annotations or deployment descriptor"
                          (bmd.type != InternalConstants.TYPE_STATEFUL_SESSION ||
                          methodInterfaceType != InternalConstants.METHOD_INTF_LIFECYCLE_INTERCEPTOR))
                      {
                          methTranAttr = beanMethods[i].getDeclaringClass().getAnnotation(javax.ejb.TransactionAttribute.class);
  
                          if (isTraceOn && tc.isDebugEnabled() &&
                              methTranAttr != null)
                              Tr.debug(tc, beanMethods[i].getName() + " from class " +
                                           beanMethods[i].getDeclaringClass().getName());
                      }
                  }
  
                  if (methTranAttr == null) {
                      // set the default value
                      if (methodInterfaceType == InternalConstants.METHOD_INTF_LIFECYCLE_INTERCEPTOR &&
                          bmd.type == InternalConstants.TYPE_STATEFUL_SESSION) {
                          // "By default a stateful session bean's PostConstruct,
                          // PreDestroy, PrePassivate and PostActivate methods are
                          // executed in an unspecified transactional context."
                          //
                          // WebSphere implements an unspecified transactional
                          // context as TX_NOT_SUPPORTED.
                          tranAttrs[i] = TransactionAttribute.TX_NOT_SUPPORTED;
                      } else {
                          tranAttrs[i] = TransactionAttribute.TX_REQUIRED;
                      }
  
                      if (isTraceOn && tc.isDebugEnabled())
                          Tr.debug(tc, beanMethods[i].getName() + " = REQUIRED (defaulted)");
                  } else {
                      // Switch the javax.ejb.TransactionAttribute to com.ibm.websphere.csi.TransactionAttribute
                      int tranType = methTranAttr.value().ordinal();
                      tranAttrs[i] = txAttrFromJEE15Map[tranType];
  
                      if (isTraceOn && tc.isDebugEnabled())
                          Tr.debug(tc, beanMethods[i].getName() + " = " + methTranAttr.value());
                  }
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled()) {
              Tr.exit(tc, "getAnnotationsCMTransactions", Arrays.toString(tranAttrs));
          }
  
      }