docs: @Override
      public void directInitialization(FailureScope failureScope) throws RecoveryFailedException {
          if (tc.isEntryEnabled())
              Tr.entry(tc, "directInitialization", new Object[] { failureScope, this });
  
          // Use configuration to determine if recovery is local (for z/OS).
          final FailureScope currentFailureScope = Configuration.localFailureScope(); /* @LI1578-22A */
  
          // Synchronize to ensure consistency with the registerService
          // method. The remainder of the method is not synchronized on this in order that two independant
          // recovery processes may be driven concurrently on two different threads.
          synchronized (_registeredRecoveryAgents) {
              // Ensure that further RecoveryAgent registrations are prohibited.
              _registrationAllowed = false;
          }
  
          if (currentFailureScope.equals(failureScope)) /* @LI1578-22C */
          {
              Tr.info(tc, "CWRLS0010_PERFORM_LOCAL_RECOVERY", failureScope.serverName());
          } else {
              Tr.info(tc, "CWRLS0011_PERFORM_PEER_RECOVERY", failureScope.serverName());
          }
  
          // Extract the 'values' collection from the _registeredRecoveryAgents map and create an iterator
          // from it. This iterator will return ArrayList objects each containing a set of RecoveryAgent
          // objects. Each ArrayList corrisponds to a different sequence priority value.
          final Collection registeredRecoveryAgentsValues = _registeredRecoveryAgents.values();
  
          Iterator registeredRecoveryAgentsValuesIterator = registeredRecoveryAgentsValues.iterator();
          while (registeredRecoveryAgentsValuesIterator.hasNext()) {
              // Extract the next ArrayList and create an iterator from it. This iterator will return RecoveryAgent
              // objects that are registered at the same sequence priority value.
              final ArrayList registeredRecoveryAgentsArray = (java.util.ArrayList) registeredRecoveryAgentsValuesIterator.next();
              final Iterator registeredRecoveryAgentsArrayIterator = registeredRecoveryAgentsArray.iterator();
  
              while (registeredRecoveryAgentsArrayIterator.hasNext()) {
                  // Extract the next RecoveryAgent object
                  final RecoveryAgent recoveryAgent = (RecoveryAgent) registeredRecoveryAgentsArrayIterator.next();
                  recoveryAgent.prepareForRecovery(failureScope);
  
                  // Prepare the maps for the recovery event.
                  addInitializationRecord(recoveryAgent, failureScope);
                  addRecoveryRecord(recoveryAgent, failureScope);
              }
          }
  
          // This is the opportunity to kick off any Network Parition Detection logic that we deem necessary. Right
          // now we are relying on the Hardware quorum support within the HA framework itself if NP's are tro be
          // handled.
  
          if (Configuration.HAEnabled()) {
              // Join the "dynamic cluster" in order that IOR references can be associated with the
              // resulting identity. Only do this in an HA-enabled environment.
              Configuration.getRecoveryLogComponent().joinCluster(failureScope);
          }
  
          // If callbacks are registered, drive then now.
          if (_registeredCallbacks != null) {
              driveCallBacks(CALLBACK_RECOVERYSTARTED, failureScope);
          }
  
          // Re-set the iterator.
          registeredRecoveryAgentsValuesIterator = registeredRecoveryAgentsValues.iterator();
  
          while (registeredRecoveryAgentsValuesIterator.hasNext()) {
              // Extract the next ArrayList and create an iterator from it. This iterator will return RecoveryAgent
              // objects that are registered at the same sequence priority value.
              final ArrayList registeredRecoveryAgentsArray = (java.util.ArrayList) registeredRecoveryAgentsValuesIterator.next();
              final Iterator registeredRecoveryAgentsArrayIterator = registeredRecoveryAgentsArray.iterator();
  
              while (registeredRecoveryAgentsArrayIterator.hasNext()) {
                  // Extract the next RecoveryAgent object
                  final RecoveryAgent recoveryAgent = (RecoveryAgent) registeredRecoveryAgentsArrayIterator.next();
  
                  // Direct the RecoveryAgent instance to process this failure scope.
                  try {
                      // Notify the listeners we're about to make the call
                      _eventListeners.clientRecoveryInitiated(failureScope, recoveryAgent.clientIdentifier()); /* @MD19638A */
  
                      recoveryAgent.initiateRecovery(failureScope);
                  } catch (RecoveryFailedException exc) {
                      FFDCFilter.processException(exc, "com.ibm.ws.recoverylog.spi.RecoveryDirectorImpl.directInitialization", "410", this);
                      if (tc.isEntryEnabled())
                          Tr.exit(tc, "directInitialization", exc);
                      throw exc;
                  }
  
                  // Wait for 'serialRecoveryComplete' to be called. This callback may be issued from another thread.
                  synchronized (_outstandingInitializationRecords) {
                      while (initializationOutstanding(recoveryAgent, failureScope)) {
                          try {
                              _outstandingInitializationRecords.wait();
                          } catch (InterruptedException exc) {
                              // This exception is recieved if another thread interrupts this thread by calling this threads
                              // Thread.interrupt method. The RecoveryDirectorImpl class does not use this mechanism for
                              // breaking out of the wait call - it uses notifyAll to wake up all waiting threads. This
                              // exception should never be generated. If for some reason it is called then ignore it and
                              //start to wait again.
                              FFDCFilter.processException(exc, "com.ibm.ws.recoverylog.spi.RecoveryDirectorImpl.directInitialization", "432", this);
                          }
                      }
                  }
              }
          }
  
          if (currentFailureScope.equals(failureScope)) /* @LI1578-22C */
          {
              Tr.info(tc, "CWRLS0012_DIRECT_LOCAL_RECOVERY", failureScope.serverName());
          } else {
              Tr.info(tc, "CWRLS0013_DIRECT_PEER_RECOVERY", failureScope.serverName());
          }
  
          if (tc.isEntryEnabled())
              Tr.exit(tc, "directInitialization");
      }