docs: static public InterceptorMetaData createInterceptorMetaData
                      (EJBMDOrchestrator ejbMDOrchestrator
                       , BeanMetaData bmd
                       , final Map<Method, ArrayList<EJBMethodInfoImpl>> methodInfoMap) // d430356
                      throws EJBConfigurationException
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
          {
              Tr.entry(tc, "createInterceptorMetaData");
          }
  
          // Pre-condition ensures this method is only called for EJB 3 module and
          // for EJBs that are not a CMP or BMP.
          EJBModuleMetaDataImpl mmd = (EJBModuleMetaDataImpl) bmd.getModuleMetaData();
  
          // Create a factory instance to use for creating InterceptorMetaData.
          InterceptorMetaDataFactory factory = new InterceptorMetaDataFactory(mmd, bmd);
  
          // Initialize the ivEJBMethodInfoMap with an entry for each
          // business method of this EJB.
          factory.ivEJBMethodInfoMap = methodInfoMap; // d430356
  
          // Validate and initialize for processing any InterceptorBinding
          // objects from WCCM.
          if (factory.ivInterceptorBinding != null) // d367572.9
          {
              factory.validateInterceptorBindings();
          }
  
          // Determine whether default interceptors need to be excluded
          // for this EJB.
          factory.setExcludeDefaultInterceptors();
  
          // Add the list of default interceptors to the interceptor name to
          // class object map (ivInterceptorNameToClassMap).
          factory.addDefaultInterceptors();
  
          // Add the list of class-level interceptors to the interceptor name to
          // class object map (ivInterceptorNameToClassMap).
          factory.addClassLevelInterceptors();
  
          // Determine the ordering of interceptors to be used at class-level for this EJB.
          // This list is the default list to use for all business methods of this
          // EJB if no method-level annotation or interceptor binding exists for
          // the method.
          factory.ivClassInterceptorOrder = factory.orderClassLevelInterceptors();
  
          // If the module is CDI enabled, then add the interceptor provided by
          // the JCDI service to the class object map (ivInterceptorNameToClassMap).
          factory.addJCDIInterceptors(); // F743-15628
  
          // Process interceptor methods on the bean class.  This must be called
          // prior to calling getInterceptorProxies below (directly or indirectly
          // via updateEJBMethodInfoInterceptorProxies).
          factory.processBeanInterceptors(); // d630717
  
          // Process all business methods of the EJB and update any EJBMethodInfo
          // object for any business method that requires one or more around-invoke
          // or around-timeout interceptor methods to be invoked.
          factory.updateEJBMethodInfoInterceptorProxies(); // d386227
  
          // d630717 - Process all lifecycle interceptor classes of the EJB.  The
          // first call will populate ivInterceptorProxyMaps, and the subsequent
          // calls will simply concatenate the lists.
          InterceptorProxy[] postConstructProxies = factory.getInterceptorProxies(InterceptorMethodKind.POST_CONSTRUCT, factory.ivClassInterceptorOrder);
          InterceptorProxy[] preDestroyProxies = factory.getInterceptorProxies(InterceptorMethodKind.PRE_DESTROY, factory.ivClassInterceptorOrder);
          InterceptorProxy[] prePassivateProxies = factory.getInterceptorProxies(InterceptorMethodKind.PRE_PASSIVATE, factory.ivClassInterceptorOrder);
          InterceptorProxy[] postActivateProxies = factory.getInterceptorProxies(InterceptorMethodKind.POST_ACTIVATE, factory.ivClassInterceptorOrder);
          InterceptorProxy[] aroundConstructProxies = factory.getInterceptorProxies(InterceptorMethodKind.AROUND_CONSTRUCT, factory.ivClassInterceptorOrder);
  
          // d630717 - Finally, if the bean has interceptor methods or if
          // getInterceptorProxies added an interceptor class, then construct
          // InterceptorMetaData to return.
          InterceptorMetaData imd = null;
          if (!factory.ivBeanInterceptorProxyMap.isEmpty() || !factory.ivInterceptorClasses.isEmpty())
          {
              Class<?>[] classes = factory.ivInterceptorClasses.toArray(new Class<?>[0]);
  
              // Get the managed object factories for each interceptor class.  F87720
              ManagedObjectFactory<?>[] managedObjectFactories = null;
              for (int i = 0; i < classes.length; i++)
              {
                  ManagedObjectFactory<?> managedObjectFactory = ejbMDOrchestrator.getInterceptorManagedObjectFactory(bmd, classes[i]);
                  if (managedObjectFactory != null)
                  {
                      if (managedObjectFactories == null)
                      {
                          managedObjectFactories = new ManagedObjectFactory[classes.length];
                      }
                      managedObjectFactories[i] = managedObjectFactory;
                  }
              }
  
              imd = new InterceptorMetaData(classes
                              , managedObjectFactories
                              , aroundConstructProxies
                              , postConstructProxies
                              , postActivateProxies
                              , prePassivateProxies
                              , preDestroyProxies
                              , factory.ivBeanLifecycleMethods // F743-1751
              );
          }
  
          if (isTraceOn && tc.isEntryEnabled())
          {
              Tr.exit(tc, "createInterceptorMetaData returning: " + imd);
          }
          return imd;
      }