docs: private void addClassLevelInterceptors() throws EJBConfigurationException
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
          {
              Tr.entry(tc, "addClassLevelInterceptors for EJB name: " + ivEjbName);
          }
  
          // Provided that metadata-complete is false, process annotation first
          // since the interceptor classes from annotation are the first ones
          // that need to be called.
          if (!ivMetadataComplete)
          {
              Interceptors cli = ivEjbClass.getAnnotation(Interceptors.class);
              if (cli != null)
              {
                  if (isTraceOn && tc.isDebugEnabled())
                  {
                      Tr.debug(tc, "processing @Interceptor annotation for EJB name");
                  }
  
                  // Get list of interceptor names and classes.
                  List<String> names = addLoadedInterceptorClasses(cli.value()); // d630717
  
                  // Add to interceptor class name list.
                  ivClassInterceptorNames.addAll(names);
                  if (isTraceOn && tc.isDebugEnabled()) // d453477
                  {
                      Tr.debug(tc, names + " were annotated with @Interceptor annotation at class level");
                  }
              }
          }
  
          // Now augment this list by processing the class level InterceptorBinding from
          // WCCM for this EJB (if one exists).
          if (ivClassInterceptorBinding != null)
          {
              // Get list of class interceptor names from interceptor-binding for EJBname.
              Collection<String> classInterceptorNames = ivClassInterceptorBinding.ivInterceptorClassNames; // d453477
              List<String> interceptorOrder = ivClassInterceptorBinding.ivInterceptorOrder; // d453477
              if (!classInterceptorNames.isEmpty()) // d453477
              {
                  if (isTraceOn && tc.isDebugEnabled()) // d453477
                  {
                      Tr.debug(tc, "updating class level list with InterceptorBinding list: "
                                   + classInterceptorNames);
                  }
  
                  // Update interceptor class name to Class object map and verify every
                  // interceptor class can be loaded and there are does not duplicate a
                  // name provided by annotation since xml is suppose to augment the
                  // annotation set of interceptor class names.
                  updateNamesToClassMap(classInterceptorNames);
  
                  // Add all of the names to the interceptor class name list.
                  ivClassInterceptorNames.addAll(classInterceptorNames);
              }
              else if (!interceptorOrder.isEmpty()) // d453477
              {
                  if (isTraceOn && tc.isDebugEnabled()) // d453477
                  {
                      Tr.debug(tc, "updating class level list with InterceptorBinding order list: "
                                   + interceptorOrder);
                  }
  
                  // interceptor-order and interceptor-classes are mutually exclusive
                  // in xml schema.  So only 1 will occur, not both. Get the total
                  // set of ordered class names.
                  HashSet<String> set = new HashSet<String>(interceptorOrder);
  
                  // Remove the default interceptor class names from the set so
                  // that only the names that remain are class level interceptors.
                  set.removeAll(ivDefaultInterceptorNames); // d456352
  
                  // Remove the class level interceptor names that came from annotation
                  // from the set so that only the class level interceptor names that came
                  // from xml remain in the set.
                  set.removeAll(ivClassInterceptorNames);
  
                  // Now add the names from xml to the list of class level interceptor names
                  // if there are any names remaining in the set.
                  if (set.isEmpty() == false)
                  {
                      // First update interceptor class name to Class object map and
                      // verify the interceptor class can be loaded.
                      updateNamesToClassMap(set);
  
                      // Now add the names from xml to the list of interceptor class names.
                      ivClassInterceptorNames.addAll(set);
                  }
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled())
          {
              Tr.exit(tc, "addClassLevelInterceptors returning: " + ivClassInterceptorNames
                          + " for EJB name: " + ivEjbName);
          }
      }