docs: private void initializeInterceptorMD(BeanMetaData bmd, final Map<Method, ArrayList<EJBMethodInfoImpl>> methodInfoMap) // d430356
                      throws EJBConfigurationException {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
  
          if (isTraceOn && tc.isEntryEnabled()) {
              Tr.entry(tc, "initializeInterceptorMD for " + bmd.j2eeName);
          }
  
          InterceptorMetaData imd = null; // d439634
  
          // Is this a EJB 3 module or later?
          if (bmd.ivModuleVersion >= BeanMetaData.J2EE_EJB_VERSION_3_0) {
              // d367572.9 start
              // Get the module metadata for the EJB 3 module.
              EJBModuleMetaDataImpl mmd = bmd._moduleMetaData;
  
              // Have we processed the interceptors and interceptor-binding stanzas
              // in ejb-jar.xml yet?  If not, process them now. We only one to do this
              // once per module rather than for every EJB that is in the module.
              // The assumption here is only 1 thread is starting a single module.
              // Other threads may be starting other modules, but not the one this
              // thread is starting.  In other words, all beans in this module are
              // processed by the thread that is starting the module. Therefore, we
              // do not need to synchronize on the EJBModuleMetaDataImpl object.
              if (mmd.ivReadWCCMInterceptors) {
                  // No, we have not, so get WCCM EJBJar object, which represents
                  // the ejb-jar.xml file if there was one in the module.
                  EJBJar ejbJar = bmd.wccm.ejbjar;
  
                  // Is there a ejb-jar.xml file for this module (there may not be one for EJB 3 modules)?
                  if (ejbJar != null) {
                      // Yes, there is a DD, so get the interceptors from it.
                      Interceptors interceptors = ejbJar.getInterceptors(); // d438904
                      if (interceptors != null) {
                          // There is an <interceptors> stanza, so determine how many interceptor
                          // classes are defined in it so that we know the maximum number of entries
                          // to create in the IdentityHashMap.
                          List<Interceptor> interceptorsList = interceptors.getInterceptorList(); // d438904
                          int expectedMaxSize = (interceptorsList != null) ? interceptorsList.size() : 0; // d438904
  
                          // Is there atleast 1 interceptor class?
                          if (expectedMaxSize > 0) {
                              // Yes, there is alteast 1 interceptor class. Create the IdentityHashMap
                              // to hold metadata about the interceptor methods in each of these classes.
                              mmd.ivInterceptorsMap = new IdentityHashMap<Class<?>, EnumMap<InterceptorMethodKind, List<Method>>>(expectedMaxSize); // d438904
  
                              // process the interceptors stanza that is in ejb-jar.xml for the module so that
                              // Map of interceptors is populated with meta data needed.
                              mmd.ivInterceptorMap = InterceptorMetaDataHelper.populateInterceptorsMap(bmd.classLoader, interceptors, mmd.ivInterceptorsMap, bmd.j2eeName); // d450431 // d468919
                          }
                      }
  
                      // Now get assembly descriptor from the DD and process the interceptor bindings.
                      AssemblyDescriptor ad = ejbJar.getAssemblyDescriptor();
                      if (ad != null) {
                          List<InterceptorBinding> bindingList = ad.getInterceptorBinding();
                          if (bindingList != null) {
                              int listSize = bindingList.size(); // d438904
                              if (listSize > 0) {
                                  int initialCapacity = (int) (listSize * 1.5); // d438904
                                  mmd.ivInterceptorBindingMap = new HashMap<String, List<EJBInterceptorBinding>>(initialCapacity); // d438904
                                  InterceptorMetaDataHelper.populateInterceptorBindingMap(bindingList, mmd.ivInterceptorBindingMap);
                              }
                          }
                      }
                  }
  
                  // Indicate we have read the interceptor meta data for this module so that we do
                  // read it again the next time an EJB from this module is initialized.
                  mmd.ivReadWCCMInterceptors = false;
              }
              // d367572.9 end
  
              // Use factory to create InterceptorMetaData for this EJB.
              // Note, a null reference is returned if this EJB does not require any
              // EJB 3 interceptor method to ever be invoked.
              if (!bmd.isEntityBean()) {
                  // Not a CMP, or BMP, so attempt to create InterceptorMetaData for this EJB.
                  imd = InterceptorMetaDataFactory.createInterceptorMetaData(this, bmd, methodInfoMap); // d430356
              }
          }
  
          // Assign InterceptorMetaData or null if there is no interceptor meta data for this EJB.
          bmd.ivInterceptorMetaData = imd;
  
          // Now set CallbackKind dependent on whether there are interceptors or
          // not and the type of EJB if there are no interceptor methods to invoke.
          if (imd != null) {
              // A InteceptorMetaData object was created, so use CallbackKind of
              // InvocationContext to indicate interceptors do need to be called.
              bmd.ivCallbackKind = CallbackKind.InvocationContext;
          } else if (bmd.isSessionBean()) {
              // No interceptors and bean is a SessionBean. Does it implement the
              // javax.ejb.SessionBean interface?
              if ((SessionBean.class).isAssignableFrom(bmd.enterpriseBeanClass)) {
                  // Yes it does, so set CallbackKind to SessionBean.
                  bmd.ivCallbackKind = CallbackKind.SessionBean;
  
                  // d453778 get Method object for ejbCreate method if one is implemented
                  // by the statless session bean.
                  try {
                      Method m = bmd.enterpriseBeanClass.getMethod("ejbCreate", new Class[] {});
                      bmd.ivEjbCreateMethod = m;
                  } catch (Throwable t) {
                      //FFDCFilter.processException( t, CLASS_NAME + ".initializeInterceptorMD", "5920", this );
                      // Ignore since method does not exist.
                  }
              } else {
                  // Set CallbackKind to None to indicate no interceptor or
                  // javax.ejb.SessionBean callback methods ever need to be called.
                  bmd.ivCallbackKind = CallbackKind.None;
              }
          } else if (bmd.isMessageDrivenBean()) {
              // No interceptors and bean is a MDB. Does it implement the
              // javax.ejb.MessageDrivenBean interface?
              if ((MessageDrivenBean.class).isAssignableFrom(bmd.enterpriseBeanClass)) {
                  // Yes it does, so set CallbackKind to MessageDrivenBean.
                  bmd.ivCallbackKind = CallbackKind.MessageDrivenBean;
  
                  // d453778 get Method object for ejbCreate method if one is implemented
                  // by the MDB class.
                  try {
                      Method m = bmd.enterpriseBeanClass.getMethod("ejbCreate", new Class[] {});
                      bmd.ivEjbCreateMethod = m;
                  } catch (Throwable t) {
                      //FFDCFilter.processException( t, CLASS_NAME + ".initializeInterceptorMD", "5949", this );
                      // Ignore since method does not exist in MDB class.
                  }
              } else {
                  // Set CallbackKind to None to indicate no interceptor or
                  // javax.ejb.MessageDrivenBean callback methods ever need to be called.
                  bmd.ivCallbackKind = CallbackKind.None;
              }
          } else {
              // No interceptors and not a SessionBean or MDB.  Must be a EntityBean. So set
              // the CallbackKind to None since EntityBean do not have EJB 3 interceptors.
              bmd.ivCallbackKind = CallbackKind.None;
          }
  
          if (isTraceOn && tc.isEntryEnabled()) {
              Tr.exit(tc, "initializeInterceptorMD set CallbackKind to: " + bmd.ivCallbackKind
                          + " for " + bmd.j2eeName,
                      new Object[] { bmd.ivInterceptorMetaData }); // F743-17630
          }
  
      }