docs: @Override
      public synchronized void process() throws InjectionException {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "process: " + this);
  
          // -------------------------------------------------------------------
          // Determine if it's valid to process the instance or not.
          // -------------------------------------------------------------------
          if (isAlreadyProcessed) {
              if (ivProcessFailure != null) {
                  if (isTraceOn && tc.isEntryEnabled())
                      Tr.exit(tc, "rethrowing " + ivProcessFailure);
                  throw new InjectionException(ivProcessFailure.getMessage(), ivProcessFailure);
              }
  
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "No-opping the .process() method because this ReferenceContext " +
                              "instance has already been processed.");
              return;
          }
  
          if (ivProviders.isEmpty()) {
              throw new IllegalStateException("Unable to perform reference processing.  " +
                                              "The list of input components was empty.");
          }
  
          boolean complete = false;
  
          try {
              processImpl();
              complete = true;
          } catch (InjectionException ex) {
              ivProcessFailure = ex;
              complete = true;
  
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "process: " + ex);
              throw ex;
          } finally {
              if (complete) {
                  // Ensure that we only attempt processing once.  This will avoid redundant
                  // work, and will also ensure ComponentNameSpaceConfigurationProvider is
                  // only called once.
                  isAlreadyProcessed = true; // F743-17630CodRv
  
                  // Remove input objects from memory as they are no longer needed.
                  // Keep output data structures around, since they need to be retrieved
                  // by the various containers at unknown point in the future.
                  ivProviders.clear();
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "process");
      }