mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
28.37.2016 ea9450b6eede5663464dbdc1e2bdc1ccc7011509
opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/EnableReplicationUserData.java
@@ -205,15 +205,13 @@
    }
  }
  private EnableReplicationServerData server1 = new EnableReplicationServerData();
  private EnableReplicationServerData server2 = new EnableReplicationServerData();
  private final EnableReplicationServerData server1 = new EnableReplicationServerData();
  private final EnableReplicationServerData server2 = new EnableReplicationServerData();
  private boolean replicateSchema = true;
  /**
   * Returns <CODE>true</CODE> if the user asked to replicate schema and <CODE>
   * false</CODE> otherwise.
   * @return <CODE>true</CODE> if the user asked to replicate schema and <CODE>
   * false</CODE> otherwise.
   * Returns whether the user asked to replicate schema.
   * @return {@code true} if the user asked to replicate schema, {@code false} otherwise.
   */
  public boolean replicateSchema()
  {
opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -278,11 +278,9 @@
     * @param baseDNs user specified baseDNs
     * @param source the source server
     * @param dest the destination server
     * @param interactive if user has to input information
     * @return whether we should stop
     * @return whether we should continue
     */
    boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source, ConnectionWrapper dest,
        boolean interactive);
    boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source, ConnectionWrapper dest);
    /**
     * Confirm with the user whether the current task should continue.
@@ -291,7 +289,7 @@
     * @param connSource connection to the source server
     * @param connDestination connection to the destination server
     * @param defaultValue default yes or no
     * @return whether the current task should be interrupted
     * @return whether the current task should continue
     */
    boolean confirmOperation(SourceDestinationServerUserData uData, ConnectionWrapper connSource,
        ConnectionWrapper connDestination, final boolean defaultValue);
@@ -350,11 +348,9 @@
   *                           program.
   * @param initializeServer   Indicates whether to initialize the server.
   * @param  outStream         The output stream to use for standard output, or
   *                           <CODE>null</CODE> if standard output is not
   *                           needed.
   *                           {@code null} if standard output is not needed.
   * @param  errStream         The output stream to use for standard error, or
   *                           <CODE>null</CODE> if standard error is not
   *                           needed.
   *                           {@code null} if standard error is not needed.
   * @return The error code.
   */
  public static int mainCLI(String[] args, boolean initializeServer,
@@ -1100,12 +1096,10 @@
  private ConnectionWrapper createConnectionInteracting(LDAPConnectionConsoleInteraction ci,
      boolean promptForCertificate) throws ClientException
  {
    // Interact with the user though the console to get
    // LDAP connection information
    final String hostName = getHostNameForLdapUrl(ci.getHostName());
    final int portNumber = ci.getPortNumber();
    final HostPort hostPort = new HostPort(hostName, portNumber);
    // Interact with the user though the console to get LDAP connection information
    final HostPort hostPort = getHostPort(ci);
    final String hostName = hostPort.getHost();
    final int portNumber = hostPort.getPort();
    if (ci.useSSL())
    {
      while (true)
@@ -1207,13 +1201,21 @@
  private ConnectionWrapper newConnectionWrapper(
      LDAPConnectionConsoleInteraction ci, Type connType, int connectTimeout) throws NamingException
  {
    String hostName = getHostNameForLdapUrl(ci.getHostName());
    int portNumber = ci.getPortNumber();
    HostPort hostPort = new HostPort(hostName, portNumber);
    return new ConnectionWrapper(hostPort, connType, ci.getBindDN(), ci.getBindPassword(),
    return new ConnectionWrapper(getHostPort(ci), connType, ci.getBindDN(), ci.getBindPassword(),
        connectTimeout, ci.getTrustManager(), ci.getKeyManager());
  }
  private HostPort getHostPort(LDAPConnectionConsoleInteraction ci)
  {
    final String hostName = getHostNameForLdapUrl(ci.getHostName());
    return new HostPort(hostName, ci.getPortNumber());
  }
  private HostPort getHostPort2(LDAPConnectionConsoleInteraction ci)
  {
    return new HostPort(ci.getHostName(), ci.getPortNumber());
  }
  private String getAuthType(TrustManager trustManager)
  {
    if (trustManager instanceof ApplicationTrustManager)
@@ -1278,8 +1280,7 @@
        resetChangeNumberOperations = new OperationBetweenSourceAndDestinationServers()
    {
      @Override
      public boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source,
          ConnectionWrapper dest, boolean interactive)
      public boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source, ConnectionWrapper dest)
      {
        TopologyCacheFilter filter = new TopologyCacheFilter();
        filter.setSearchMonitoringInformation(false);
@@ -1289,20 +1290,20 @@
          String cn = getNewestChangeNumber(source);
          if (cn.isEmpty())
          {
            return true;
            return false;
          }
          argParser.setResetChangeNumber(
              ask(logger, INFO_RESET_CHANGE_NUMBER_TO.get(uData.getSource(), uData.getDestination()), cn));
        }
        return false;
        return true;
      }
      @Override
      public boolean confirmOperation(SourceDestinationServerUserData uData, ConnectionWrapper connSource,
          ConnectionWrapper connDestination, boolean defaultValue)
      {
        return !askConfirmation(INFO_RESET_CHANGE_NUMBER_CONFIRM_RESET.get(uData.getDestinationHostPort()),
            defaultValue);
        LocalizableMessage promptMsg = INFO_RESET_CHANGE_NUMBER_CONFIRM_RESET.get(uData.getDestinationHostPort());
        return askConfirmation(promptMsg, defaultValue);
      }
    };
@@ -1829,18 +1830,17 @@
        initializeReplicationOperations = new OperationBetweenSourceAndDestinationServers()
    {
      @Override
      public boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source,
          ConnectionWrapper dest, boolean interactive)
      public boolean continueAfterUserInput(Collection<DN> baseDNs, ConnectionWrapper source, ConnectionWrapper dest)
      {
        checkSuffixesForInitializeReplication(baseDNs, source, dest, interactive);
        return baseDNs.isEmpty();
        checkSuffixesForInitializeReplication(baseDNs, source, dest, true);
        return !baseDNs.isEmpty();
      }
      @Override
      public boolean confirmOperation(SourceDestinationServerUserData uData, ConnectionWrapper connSource,
          ConnectionWrapper connDestination, boolean defaultValue)
      {
        return !askConfirmation(getInitializeReplicationPrompt(uData, connSource, connDestination), defaultValue);
        return askConfirmation(getInitializeReplicationPrompt(uData, connSource, connDestination), defaultValue);
      }
    };
    return promptIfRequired(uData, initializeReplicationOperations) ? initializeReplication(uData) : USER_CANCELLED;
@@ -1852,20 +1852,19 @@
   * information is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user canceled the operation.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user canceled the operation.
   */
  private boolean promptIfRequired(PurgeHistoricalUserData uData)
  {
    ConnectionWrapper conn = null;
    ConnectionWrapper conn = getConnection(uData);
    if (conn == null)
    {
      return false;
    }
    try
    {
      conn = getConnection(uData);
      if (conn == null)
      {
        return false;
      }
      /* Prompt for maximum duration */
      int maximumDuration = argParser.getMaximumDuration();
      if (!argParser.maximumDurationArg.isPresent())
@@ -1920,37 +1919,28 @@
  private ConnectionWrapper getConnection(PurgeHistoricalUserData uData)
  {
    boolean firstTry = true;
    Boolean serverRunning = null;
    boolean serverRunning = Utilities.isServerRunning(Installation.getLocal().getInstanceDirectory());
    boolean firstTry = true;
    while (true)
    {
      boolean promptForConnection = firstTry && argParser.connectionArgumentsPresent();
      if (!promptForConnection)
      if (!promptForConnection && !serverRunning)
      {
        if (serverRunning == null)
        try
        {
          serverRunning = Utilities.isServerRunning(Installation.getLocal().getInstanceDirectory());
          println();
          promptForConnection = !askConfirmation(INFO_REPLICATION_PURGE_HISTORICAL_LOCAL_PROMPT.get(), true, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
        }
        if (!serverRunning)
        if (!promptForConnection)
        {
          try
          {
            println();
            promptForConnection = !askConfirmation(
                INFO_REPLICATION_PURGE_HISTORICAL_LOCAL_PROMPT.get(), true, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
          }
          if (!promptForConnection)
          {
            uData.setOnline(false);
            return null;
          }
          uData.setOnline(false);
          return null;
        }
      }
@@ -1962,7 +1952,7 @@
        if (conn != null)
        {
          uData.setOnline(true);
          uData.setHostPort(new HostPort(sourceServerCI.getHostName(), sourceServerCI.getPortNumber()));
          uData.setHostPort(getHostPort2(sourceServerCI));
          uData.setAdminUid(sourceServerCI.getAdministratorUID());
          uData.setAdminPwd(sourceServerCI.getBindPassword());
        }
@@ -2005,87 +1995,466 @@
   * is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @throws ReplicationCliException if a critical error occurs reading the
   * ADS.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   * @throws ReplicationCliException if a critical error occurs reading the ADS.
   */
  private boolean promptIfRequired(EnableReplicationUserData uData)
  throws ReplicationCliException
  private boolean promptIfRequired(EnableReplicationUserData uData) throws ReplicationCliException
  {
    boolean cancelled = false;
    boolean administratorDefined = false;
    sourceServerCI.setUseAdminOrBindDn(true);
    String adminPwd = argParser.getBindPasswordAdmin();
    String adminUid = argParser.getAdministratorUID();
    /* Try to connect to the first server. */
    String host1 = getValue(argParser.server1.hostNameArg);
    int port1 = getValue(argParser.server1.portArg);
    String bindDn1 = getValue(argParser.server1.bindDnArg);
    String pwd1 = argParser.server1.getBindPassword();
    String pwd = null;
    Map<String, String> pwdFile = null;
    if (argParser.server1.bindPasswordArg.isPresent())
    {
      pwd = argParser.server1.bindPasswordArg.getValue();
    }
    else if (argParser.server1.bindPasswordFileArg.isPresent())
    {
      pwdFile = argParser.server1.bindPasswordFileArg.getNameToValueMap();
    }
    else if (bindDn1 == null)
    {
      pwd = adminPwd;
      if (argParser.getSecureArgsList().getBindPasswordFileArg().isPresent())
      {
        pwdFile = argParser.getSecureArgsList().getBindPasswordFileArg().
          getNameToValueMap();
      }
    }
    /*
     * Use a copy of the argument properties since the map might be cleared
     * in initializeGlobalArguments.
     */
    sourceServerCI.initializeGlobalArguments(host1, port1, adminUid, bindDn1, pwd,
        pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
    ConnectionWrapper conn1 = null;
    ConnectionWrapper conn2 = null;
    try
    {
      String adminPwd = argParser.getBindPasswordAdmin();
      String adminUid = argParser.getAdministratorUID();
    while (conn1 == null && !cancelled)
      /* Try to connect to the first server. */
      initializeGlobalArguments(sourceServerCI, argParser.server1, adminPwd, adminUid);
      conn1 = initializeFirstConnection(INFO_REPLICATION_ENABLE_HOST1_CONNECTION_PARAMETERS.get());
      if (conn1 == null)
      {
        return false;
      }
      if (sourceServerCI.getProvidedAdminUID() != null)
      {
        adminUid = sourceServerCI.getProvidedAdminUID();
        if (sourceServerCI.getProvidedBindDN() == null)
        {
          // If the explicit bind DN is not null, the password corresponds
          // to that bind DN. We are in the case where the user provides
          // bind DN on first server and admin UID globally.
          adminPwd = sourceServerCI.getBindPassword();
        }
      }
      String host1 = sourceServerCI.getHostName();
      int port1 = sourceServerCI.getPortNumber();
      setConnectionDetails(uData.getServer1(), sourceServerCI);
      boolean administratorDefined = false;
      int replicationPort1 = -1;
      boolean secureReplication1 = argParser.server1.secureReplicationArg.isPresent();
      boolean configureReplicationServer1 = argParser.server1.configureReplicationServer();
      boolean configureReplicationDomain1 = argParser.server1.configureReplicationDomain();
      {
        int repPort1 = getReplicationPort(conn1);
        boolean replicationServer1Configured = repPort1 > 0;
        if (replicationServer1Configured && !configureReplicationServer1)
        {
          final LocalizableMessage msg =
              INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(conn1.getHostPort(), repPort1);
          if (!askConfirmation(msg, false))
          {
            return false;
          }
        }
        // Try to get the replication port for server 1 only if it is required.
        if (configureReplicationServer1
            && !replicationServer1Configured
            && argParser.advancedArg.isPresent()
            && configureReplicationDomain1)
        {
          // Only ask if the replication domain will be configured (if not
          // the replication server MUST be configured).
          try
          {
            configureReplicationServer1 =
                askConfirmation(INFO_REPLICATION_ENABLE_REPLICATION_SERVER1_PROMPT.get(), true, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            return false;
          }
        }
        if (configureReplicationServer1 && !replicationServer1Configured)
        {
          boolean tryWithDefault = argParser.getReplicationPort1() != -1;
          while (replicationPort1 == -1)
          {
            if (tryWithDefault)
            {
              replicationPort1 = argParser.getReplicationPort1();
              tryWithDefault = false;
            }
            else
            {
              replicationPort1 =
                  askPort(INFO_REPLICATION_ENABLE_REPLICATIONPORT1_PROMPT.get(), getDefaultValue(
                      argParser.server1.replicationPortArg), logger);
              println();
            }
            if (!argParser.skipReplicationPortCheck() && isLocalHost(host1))
            {
              if (!SetupUtils.canUseAsPort(replicationPort1))
              {
                errPrintln();
                errPrintln(getCannotBindToPortError(replicationPort1));
                errPrintln();
                replicationPort1 = -1;
              }
            }
            else if (replicationPort1 == port1)
            {
              // This is something that we must do in any case... this test is
              // already included when we call SetupUtils.canUseAsPort
              errPrintln();
              errPrintln(ERR_REPLICATION_PORT_AND_REPLICATION_PORT_EQUAL.get(host1, replicationPort1));
              errPrintln();
              replicationPort1 = -1;
            }
          }
          if (!secureReplication1)
          {
            try
            {
              secureReplication1 =
                  askConfirmation(INFO_REPLICATION_ENABLE_SECURE1_PROMPT.get(replicationPort1), false, logger);
            }
            catch (ClientException ce)
            {
              errPrintln(ce.getMessageObject());
              return false;
            }
            println();
          }
        }
        if (configureReplicationDomain1 && configureReplicationServer1 && argParser.advancedArg.isPresent())
        {
          // Only necessary to ask if the replication server will be configured
          try
          {
            configureReplicationDomain1 =
                askConfirmation(INFO_REPLICATION_ENABLE_REPLICATION_DOMAIN1_PROMPT.get(), true, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            return false;
          }
        }
        // If the server contains an ADS. Try to load it and only load it: if
        // there are issues with the ADS they will be encountered in the
        // enableReplication(EnableReplicationUserData) method. Here we have
        // to load the ADS to ask the user to accept the certificates and
        // eventually admin authentication data.
        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn1);
        if (!loadADSAndAcceptCertificates(sourceServerCI, aux, uData, true))
        {
          return false;
        }
        conn1 = aux.get();
        administratorDefined |= hasAdministrator(conn1);
        if (uData.getAdminPwd() != null)
        {
          adminPwd = uData.getAdminPwd();
        }
      }
      uData.getServer1().setReplicationPort(replicationPort1);
      uData.getServer1().setSecureReplication(secureReplication1);
      uData.getServer1().setConfigureReplicationServer(configureReplicationServer1);
      uData.getServer1().setConfigureReplicationDomain(configureReplicationDomain1);
      firstServerCommandBuilder = new CommandBuilder();
      if (mustPrintCommandBuilder())
      {
        firstServerCommandBuilder.append(sourceServerCI.getCommandBuilder());
      }
      /* Prompt for information on the second server. */
      LDAPConnectionConsoleInteraction destinationServerCI =
          new LDAPConnectionConsoleInteraction(this, argParser.getSecureArgsList());
      boolean doNotDisplayFirstError =
          initializeGlobalArguments(destinationServerCI, argParser.server2, adminPwd, adminUid);
      destinationServerCI.setUseAdminOrBindDn(true);
      conn2 = initializeConnection2(destinationServerCI, sourceServerCI, doNotDisplayFirstError);
      if (conn2 == null)
      {
        return false;
      }
      if (destinationServerCI.getProvidedAdminUID() != null)
      {
        adminUid = destinationServerCI.getProvidedAdminUID();
        if (destinationServerCI.getProvidedBindDN() == null)
        {
          // If the explicit bind DN is not null, the password corresponds
          // to that bind DN. We are in the case where the user provides
          // bind DN on first server and admin UID globally.
          adminPwd = destinationServerCI.getBindPassword();
        }
      }
      String host2 = destinationServerCI.getHostName();
      int port2 = destinationServerCI.getPortNumber();
      setConnectionDetails(uData.getServer2(), destinationServerCI);
      int replicationPort2 = -1;
      boolean secureReplication2 = argParser.server2.secureReplicationArg.isPresent();
      boolean configureReplicationServer2 = argParser.server2.configureReplicationServer();
      boolean configureReplicationDomain2 = argParser.server2.configureReplicationDomain();
      {
        int repPort2 = getReplicationPort(conn2);
        boolean replicationServer2Configured = repPort2 > 0;
        if (replicationServer2Configured && !configureReplicationServer2)
        {
          final LocalizableMessage prompt =
              INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(conn2.getHostPort(), repPort2);
          if (!askConfirmation(prompt, false))
          {
            return false;
          }
        }
        // Try to get the replication port for server 2 only if it is required.
        if (configureReplicationServer2 && !replicationServer2Configured)
        {
          // Only ask if the replication domain will be configured (if not the
          // replication server MUST be configured).
          if (argParser.advancedArg.isPresent() && configureReplicationDomain2)
          {
            try
            {
              configureReplicationServer2 =
                  askConfirmation(INFO_REPLICATION_ENABLE_REPLICATION_SERVER2_PROMPT.get(), true, logger);
            }
            catch (ClientException ce)
            {
              errPrintln(ce.getMessageObject());
              return false;
            }
          }
          if (configureReplicationServer2 && !replicationServer2Configured)
          {
            boolean tryWithDefault = argParser.getReplicationPort2() != -1;
            while (replicationPort2 == -1)
            {
              if (tryWithDefault)
              {
                replicationPort2 = argParser.getReplicationPort2();
                tryWithDefault = false;
              }
              else
              {
                replicationPort2 =
                    askPort(INFO_REPLICATION_ENABLE_REPLICATIONPORT2_PROMPT.get(), getDefaultValue(
                        argParser.server2.replicationPortArg), logger);
                println();
              }
              if (!argParser.skipReplicationPortCheck() && isLocalHost(host2))
              {
                if (!SetupUtils.canUseAsPort(replicationPort2))
                {
                  errPrintln();
                  errPrintln(getCannotBindToPortError(replicationPort2));
                  errPrintln();
                  replicationPort2 = -1;
                }
              }
              else if (replicationPort2 == port2)
              {
                // This is something that we must do in any case... this test is
                // already included when we call SetupUtils.canUseAsPort
                errPrintln();
                errPrintln(ERR_REPLICATION_PORT_AND_REPLICATION_PORT_EQUAL.get(host2, replicationPort2));
                replicationPort2 = -1;
              }
              if (host1.equalsIgnoreCase(host2) && replicationPort1 > 0 && replicationPort1 == replicationPort2)
              {
                errPrintln();
                errPrintln(ERR_REPLICATION_SAME_REPLICATION_PORT.get(replicationPort2, host1));
                errPrintln();
                replicationPort2 = -1;
              }
            }
            if (!secureReplication2)
            {
              try
              {
                secureReplication2 =
                    askConfirmation(INFO_REPLICATION_ENABLE_SECURE2_PROMPT.get(replicationPort2), false, logger);
              }
              catch (ClientException ce)
              {
                errPrintln(ce.getMessageObject());
                return false;
              }
              println();
            }
          }
        }
        if (configureReplicationDomain2 && configureReplicationServer2 && argParser.advancedArg.isPresent())
        {
          // Only necessary to ask if the replication server will be configured
          try
          {
            configureReplicationDomain2 =
                askConfirmation(INFO_REPLICATION_ENABLE_REPLICATION_DOMAIN2_PROMPT.get(), true, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            return false;
          }
        }
        // If the server contains an ADS. Try to load it and only load it: if
        // there are issues with the ADS they will be encountered in the
        // enableReplication(EnableReplicationUserData) method. Here we have
        // to load the ADS to ask the user to accept the certificates.
        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn2);
        if (!loadADSAndAcceptCertificates(destinationServerCI, aux, uData, false))
        {
          return false;
        }
        conn2 = aux.get();
        administratorDefined |= hasAdministrator(conn2);
      }
      uData.getServer2().setReplicationPort(replicationPort2);
      uData.getServer2().setSecureReplication(secureReplication2);
      uData.getServer2().setConfigureReplicationServer(configureReplicationServer2);
      uData.getServer2().setConfigureReplicationDomain(configureReplicationDomain2);
      // If the adminUid and adminPwd are not set in the EnableReplicationUserData
      // object, that means that there are no administrators and that they
      // must be created. The adminUId and adminPwd are updated inside
      // loadADSAndAcceptCertificates.
      boolean promptedForAdmin = false;
      // There is a case where we haven't had need for the administrator
      // credentials even if the administrators are defined: where all the servers
      // can be accessed with another user (for instance if all the server have
      // defined cn=directory manager and all the entries have the same password).
      if (uData.getAdminUid() == null && !administratorDefined)
      {
        if (adminUid == null)
        {
          println(INFO_REPLICATION_ENABLE_ADMINISTRATOR_MUST_BE_CREATED.get());
          promptedForAdmin = true;
          adminUid = askForAdministratorUID(getDefaultValue(argParser.getAdminUidArg()), logger);
          println();
        }
        uData.setAdminUid(adminUid);
      }
      if (uData.getAdminPwd() == null)
      {
        uData.setAdminPwd(adminPwd);
      }
      if (uData.getAdminPwd() == null && !administratorDefined)
      {
        adminPwd = null;
        int nPasswordPrompts = 0;
        while (adminPwd == null)
        {
          if (nPasswordPrompts > CONFIRMATION_MAX_TRIES)
          {
            errPrintln(ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(CONFIRMATION_MAX_TRIES));
            return false;
          }
          nPasswordPrompts++;
          if (!promptedForAdmin)
          {
            println();
            println(INFO_REPLICATION_ENABLE_ADMINISTRATOR_MUST_BE_CREATED.get());
            println();
          }
          while (adminPwd == null)
          {
            adminPwd = askForAdministratorPwd(logger);
            println();
          }
          String adminPwdConfirm = null;
          while (adminPwdConfirm == null)
          {
            try
            {
              adminPwdConfirm = String.valueOf(readPassword(INFO_ADMINISTRATOR_PWD_CONFIRM_PROMPT.get()));
            }
            catch (ClientException ex)
            {
              logger.warn(LocalizableMessage.raw("Error reading input: " + ex, ex));
            }
            println();
          }
          if (!adminPwd.equals(adminPwdConfirm))
          {
            println();
            errPrintln(ERR_ADMINISTRATOR_PWD_DO_NOT_MATCH.get());
            println();
            adminPwd = null;
          }
        }
        uData.setAdminPwd(adminPwd);
      }
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      checkSuffixesForEnableReplication(suffixes, conn1, conn2, true, uData);
      uData.setBaseDNs(suffixes);
      return !suffixes.isEmpty();
    }
    finally
    {
      close(conn1, conn2);
      uData.setReplicateSchema(!argParser.noSchemaReplication());
    }
  }
  private boolean initializeGlobalArguments(LDAPConnectionConsoleInteraction serverCI, ServerArgs serverArgs,
      String adminPwd, String adminUid)
  {
    boolean doNotDisplayFirstError = false;
    String host = getValue(serverArgs.hostNameArg);
    int port = getValue(serverArgs.portArg);
    String bindDn = getValue(serverArgs.bindDnArg);
    String pwd = null;
    LinkedHashMap<String, String> pwdFile = null;
    if (serverArgs.bindPasswordArg.isPresent())
    {
      pwd = serverArgs.bindPasswordArg.getValue();
    }
    else if (serverArgs.bindPasswordFileArg.isPresent())
    {
      pwdFile = new LinkedHashMap<>(serverArgs.bindPasswordFileArg.getNameToValueMap());
    }
    else if (bindDn == null)
    {
      doNotDisplayFirstError = true;
      pwd = adminPwd;
      pwdFile = getPwdFile();
    }
    serverCI.initializeGlobalArguments(host, port, adminUid, bindDn, pwd, pwdFile);
    return doNotDisplayFirstError;
  }
  private void setConnectionDetails(EnableReplicationServerData serverData, LDAPConnectionConsoleInteraction serverCI)
  {
    serverData.setHostPort(getHostPort2(serverCI));
    serverData.setBindDn(serverCI.getBindDN());
    serverData.setPwd(serverCI.getBindPassword());
  }
  private ConnectionWrapper initializeFirstConnection(LocalizableMessage headingMsg)
  {
    while (true)
    {
      try
      {
        sourceServerCI.setHeadingMessage(INFO_REPLICATION_ENABLE_HOST1_CONNECTION_PARAMETERS.get());
        sourceServerCI.setHeadingMessage(headingMsg);
        sourceServerCI.run();
        host1 = sourceServerCI.getHostName();
        port1 = sourceServerCI.getPortNumber();
        if (sourceServerCI.getProvidedAdminUID() != null)
        {
          adminUid = sourceServerCI.getProvidedAdminUID();
          if (sourceServerCI.getProvidedBindDN() == null)
          {
            // If the explicit bind DN is not null, the password corresponds
            // to that bind DN.  We are in the case where the user provides
            // bind DN on first server and admin UID globally.
            adminPwd = sourceServerCI.getBindPassword();
          }
        }
        bindDn1 = sourceServerCI.getBindDN();
        pwd1 = sourceServerCI.getBindPassword();
        conn1 = createConnectionInteracting(sourceServerCI);
        if (conn1 == null)
        {
          cancelled = true;
        }
        return createConnectionInteracting(sourceServerCI);
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception "+ce));
        logger.warn(LocalizableMessage.raw("Client exception " + ce));
        errPrintln();
        errPrintln(ce.getMessageObject());
        errPrintln();
@@ -2093,253 +2462,40 @@
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception "+ae));
        logger.warn(LocalizableMessage.raw("Argument exception " + ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        cancelled = true;
        return null;
      }
    }
  }
    if (!cancelled)
    {
      uData.getServer1().setHostPort(new HostPort(host1, port1));
      uData.getServer1().setBindDn(bindDn1);
      uData.getServer1().setPwd(pwd1);
    }
    int replicationPort1 = -1;
    boolean secureReplication1 = argParser.server1.secureReplicationArg.isPresent();
    boolean configureReplicationServer1 = argParser.server1.configureReplicationServer();
    boolean configureReplicationDomain1 = argParser.server1.configureReplicationDomain();
    if (conn1 != null)
    {
      int repPort1 = getReplicationPort(conn1);
      boolean replicationServer1Configured = repPort1 > 0;
      if (replicationServer1Configured && !configureReplicationServer1)
      {
        final LocalizableMessage msg =
            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(conn1.getHostPort(), repPort1);
        if (!askConfirmation(msg, false))
        {
          cancelled = true;
        }
      }
      // Try to get the replication port for server 1 only if it is required.
      if (!cancelled
          && configureReplicationServer1
          && !replicationServer1Configured
          && argParser.advancedArg.isPresent()
          && configureReplicationDomain1)
      {
        // Only ask if the replication domain will be configured (if not
        // the replication server MUST be configured).
        try
        {
          configureReplicationServer1 = askConfirmation(
              INFO_REPLICATION_ENABLE_REPLICATION_SERVER1_PROMPT.get(),
              true, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          cancelled = true;
        }
      }
      if (!cancelled
          && configureReplicationServer1
          && !replicationServer1Configured)
      {
        boolean tryWithDefault = argParser.getReplicationPort1() != -1;
        while (replicationPort1 == -1)
        {
          if (tryWithDefault)
          {
            replicationPort1 = argParser.getReplicationPort1();
            tryWithDefault = false;
          }
          else
          {
            replicationPort1 = askPort(
                INFO_REPLICATION_ENABLE_REPLICATIONPORT1_PROMPT.get(),
                getDefaultValue(argParser.server1.replicationPortArg), logger);
            println();
          }
          if (!argParser.skipReplicationPortCheck() && isLocalHost(host1))
          {
            if (!SetupUtils.canUseAsPort(replicationPort1))
            {
              errPrintln();
              errPrintln(getCannotBindToPortError(replicationPort1));
              errPrintln();
              replicationPort1 = -1;
            }
          }
          else if (replicationPort1 == port1)
          {
            // This is something that we must do in any case... this test is
            // already included when we call SetupUtils.canUseAsPort
            errPrintln();
            errPrintln(ERR_REPLICATION_PORT_AND_REPLICATION_PORT_EQUAL.get(host1, replicationPort1));
            errPrintln();
            replicationPort1 = -1;
          }
        }
        if (!secureReplication1)
        {
          try
          {
            secureReplication1 =
              askConfirmation(INFO_REPLICATION_ENABLE_SECURE1_PROMPT.get(replicationPort1),
                  false, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            cancelled = true;
          }
          println();
        }
      }
      if (!cancelled &&
          configureReplicationDomain1 &&
          configureReplicationServer1 &&
          argParser.advancedArg.isPresent())
      {
        // Only necessary to ask if the replication server will be configured
        try
        {
          configureReplicationDomain1 = askConfirmation(
              INFO_REPLICATION_ENABLE_REPLICATION_DOMAIN1_PROMPT.get(),
              true, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          cancelled = true;
        }
      }
      // If the server contains an ADS. Try to load it and only load it: if
      // there are issues with the ADS they will be encountered in the
      // enableReplication(EnableReplicationUserData) method.  Here we have
      // to load the ADS to ask the user to accept the certificates and
      // eventually admin authentication data.
      if (!cancelled)
      {
        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn1);
        cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, true);
        conn1 = aux.get();
      }
      if (!cancelled)
      {
        administratorDefined |= hasAdministrator(conn1);
        if (uData.getAdminPwd() != null)
        {
          adminPwd = uData.getAdminPwd();
        }
      }
    }
    uData.getServer1().setReplicationPort(replicationPort1);
    uData.getServer1().setSecureReplication(secureReplication1);
    uData.getServer1().setConfigureReplicationServer(configureReplicationServer1);
    uData.getServer1().setConfigureReplicationDomain(configureReplicationDomain1);
    firstServerCommandBuilder = new CommandBuilder();
    if (mustPrintCommandBuilder())
    {
      firstServerCommandBuilder.append(sourceServerCI.getCommandBuilder());
    }
    /* Prompt for information on the second server. */
    String host2 = null;
    int port2 = -1;
    String bindDn2 = null;
    String pwd2 = null;
    LDAPConnectionConsoleInteraction destinationServerCI = new LDAPConnectionConsoleInteraction(this,
        argParser.getSecureArgsList());
  private ConnectionWrapper initializeConnection2(LDAPConnectionConsoleInteraction destinationServerCI,
      LDAPConnectionConsoleInteraction sourceServerCI, boolean doNotDisplayFirstError)
  {
    destinationServerCI.resetHeadingDisplayed();
    boolean doNotDisplayFirstError = false;
    if (!cancelled)
    {
      host2 = getValue(argParser.server2.hostNameArg);
      port2 = getValue(argParser.server2.portArg);
      bindDn2 = getValue(argParser.server2.bindDnArg);
      pwd2 = argParser.server2.getBindPassword();
      pwdFile = null;
      pwd = null;
      if (argParser.server2.bindPasswordArg.isPresent())
      {
        pwd = argParser.server2.bindPasswordArg.getValue();
      }
      else if (argParser.server2.bindPasswordFileArg.isPresent())
      {
        pwdFile = argParser.server2.bindPasswordFileArg.getNameToValueMap();
      }
      else if (bindDn2 == null)
      {
        doNotDisplayFirstError = true;
        pwd = adminPwd;
        if (argParser.getSecureArgsList().getBindPasswordFileArg().isPresent())
        {
          pwdFile = argParser.getSecureArgsList().getBindPasswordFileArg().
            getNameToValueMap();
        }
      }
      /*
       * Use a copy of the argument properties since the map might be cleared
       * in initializeGlobalArguments.
       */
      destinationServerCI.initializeGlobalArguments(host2, port2, adminUid, bindDn2, pwd,
          pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
      destinationServerCI.setUseAdminOrBindDn(true);
    }
    ConnectionWrapper conn2 = null;
    while (conn2 == null && !cancelled)
    while (true)
    {
      try
      {
        destinationServerCI.setHeadingMessage(INFO_REPLICATION_ENABLE_HOST2_CONNECTION_PARAMETERS.get());
        destinationServerCI.run();
        host2 = destinationServerCI.getHostName();
        port2 = destinationServerCI.getPortNumber();
        if (destinationServerCI.getProvidedAdminUID() != null)
        {
          adminUid = destinationServerCI.getProvidedAdminUID();
          if (destinationServerCI.getProvidedBindDN() == null)
          {
            // If the explicit bind DN is not null, the password corresponds
            // to that bind DN.  We are in the case where the user provides
            // bind DN on first server and admin UID globally.
            adminPwd = destinationServerCI.getBindPassword();
          }
        }
        bindDn2 = destinationServerCI.getBindDN();
        pwd2 = destinationServerCI.getBindPassword();
        boolean error = false;
        if (host1.equalsIgnoreCase(host2) && port1 == port2)
        String host1 = sourceServerCI.getHostName();
        int port1 = sourceServerCI.getPortNumber();
        if (host1.equalsIgnoreCase(destinationServerCI.getHostName())
            && port1 == destinationServerCI.getPortNumber())
        {
          port2 = -1;
          errPrintln();
          errPrintln(ERR_REPLICATION_ENABLE_SAME_SERVER_PORT.get(host1, port1));
          errPrintln();
          error = true;
          return null;
        }
        if (!error)
        {
          conn2 = createConnectionInteracting(destinationServerCI, true);
          if (conn2 == null)
          {
            cancelled = true;
          }
        }
        return createConnectionInteracting(destinationServerCI, true);
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception "+ce));
        logger.warn(LocalizableMessage.raw("Client exception " + ce));
        if (!doNotDisplayFirstError)
        {
          errPrintln();
@@ -2351,259 +2507,21 @@
        {
          // Reset only the credential parameters.
          destinationServerCI.resetConnectionArguments();
          destinationServerCI.initializeGlobalArguments(host2, port2, null, null, null, null);
          destinationServerCI.initializeGlobalArguments(
              destinationServerCI.getHostName(), destinationServerCI.getPortNumber(), null, null, null, null);
        }
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception "+ae));
        logger.warn(LocalizableMessage.raw("Argument exception " + ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        cancelled = true;
        return null;
      }
      finally
      {
        doNotDisplayFirstError = false;
      }
    }
    if (!cancelled)
    {
      uData.getServer2().setHostPort(new HostPort(host2, port2));
      uData.getServer2().setBindDn(bindDn2);
      uData.getServer2().setPwd(pwd2);
    }
    int replicationPort2 = -1;
    boolean secureReplication2 = argParser.server2.secureReplicationArg.isPresent();
    boolean configureReplicationServer2 = argParser.server2.configureReplicationServer();
    boolean configureReplicationDomain2 = argParser.server2.configureReplicationDomain();
    if (conn2 != null)
    {
      int repPort2 = getReplicationPort(conn2);
      boolean replicationServer2Configured = repPort2 > 0;
      if (replicationServer2Configured && !configureReplicationServer2)
      {
        final LocalizableMessage prompt =
            INFO_REPLICATION_SERVER_CONFIGURED_WARNING_PROMPT.get(conn2.getHostPort(), repPort2);
        if (!askConfirmation(prompt, false))
        {
          cancelled = true;
        }
      }
      // Try to get the replication port for server 2 only if it is required.
      if (!cancelled
          && configureReplicationServer2
          && !replicationServer2Configured)
      {
        // Only ask if the replication domain will be configured (if not the
        // replication server MUST be configured).
        if (argParser.advancedArg.isPresent() &&
            configureReplicationDomain2)
        {
          try
          {
            configureReplicationServer2 = askConfirmation(
                INFO_REPLICATION_ENABLE_REPLICATION_SERVER2_PROMPT.get(),
                true, logger);
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            cancelled = true;
          }
        }
        if (!cancelled
            && configureReplicationServer2
            && !replicationServer2Configured)
        {
          boolean tryWithDefault = argParser.getReplicationPort2() != -1;
          while (replicationPort2 == -1)
          {
            if (tryWithDefault)
            {
              replicationPort2 = argParser.getReplicationPort2();
              tryWithDefault = false;
            }
            else
            {
              replicationPort2 = askPort(
                  INFO_REPLICATION_ENABLE_REPLICATIONPORT2_PROMPT.get(),
                  getDefaultValue(argParser.server2.replicationPortArg), logger);
              println();
            }
            if (!argParser.skipReplicationPortCheck() &&
                isLocalHost(host2))
            {
              if (!SetupUtils.canUseAsPort(replicationPort2))
              {
                errPrintln();
                errPrintln(getCannotBindToPortError(replicationPort2));
                errPrintln();
                replicationPort2 = -1;
              }
            }
            else if (replicationPort2 == port2)
            {
              // This is something that we must do in any case... this test is
              // already included when we call SetupUtils.canUseAsPort
              errPrintln();
              errPrintln(ERR_REPLICATION_PORT_AND_REPLICATION_PORT_EQUAL.get(host2, replicationPort2));
              replicationPort2 = -1;
            }
            if (host1.equalsIgnoreCase(host2)
                && replicationPort1 > 0
                && replicationPort1 == replicationPort2)
            {
              errPrintln();
              errPrintln(ERR_REPLICATION_SAME_REPLICATION_PORT.get(replicationPort2, host1));
              errPrintln();
              replicationPort2 = -1;
            }
          }
          if (!secureReplication2)
          {
            try
            {
              secureReplication2 =
                askConfirmation(INFO_REPLICATION_ENABLE_SECURE2_PROMPT.get(replicationPort2), false, logger);
            }
            catch (ClientException ce)
            {
              errPrintln(ce.getMessageObject());
              cancelled = true;
            }
            println();
          }
        }
      }
      if (!cancelled &&
          configureReplicationDomain2 &&
          configureReplicationServer2 &&
          argParser.advancedArg.isPresent())
      {
        // Only necessary to ask if the replication server will be configured
        try
        {
          configureReplicationDomain2 = askConfirmation(
              INFO_REPLICATION_ENABLE_REPLICATION_DOMAIN2_PROMPT.get(),
              true, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          cancelled = true;
        }
      }
      // If the server contains an ADS. Try to load it and only load it: if
      // there are issues with the ADS they will be encountered in the
      // enableReplication(EnableReplicationUserData) method.  Here we have
      // to load the ADS to ask the user to accept the certificates.
      if (!cancelled)
      {
        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn2);
        cancelled = !loadADSAndAcceptCertificates(destinationServerCI, aux, uData, false);
        conn2 = aux.get();
      }
      if (!cancelled)
      {
        administratorDefined |= hasAdministrator(conn2);
      }
    }
    uData.getServer2().setReplicationPort(replicationPort2);
    uData.getServer2().setSecureReplication(secureReplication2);
    uData.getServer2().setConfigureReplicationServer(configureReplicationServer2);
    uData.getServer2().setConfigureReplicationDomain(configureReplicationDomain2);
    // If the adminUid and adminPwd are not set in the EnableReplicationUserData
    // object, that means that there are no administrators and that they
    // must be created. The adminUId and adminPwd are updated inside
    // loadADSAndAcceptCertificates.
    boolean promptedForAdmin = false;
    // There is a case where we haven't had need for the administrator
    // credentials even if the administrators are defined: where all the servers
    // can be accessed with another user (for instance if all the server have
    // defined cn=directory manager and all the entries have the same password).
    if (!cancelled && uData.getAdminUid() == null && !administratorDefined)
    {
      if (adminUid == null)
      {
        println(INFO_REPLICATION_ENABLE_ADMINISTRATOR_MUST_BE_CREATED.get());
        promptedForAdmin = true;
        adminUid= askForAdministratorUID(
            getDefaultValue(argParser.getAdminUidArg()), logger);
        println();
      }
      uData.setAdminUid(adminUid);
    }
    if (uData.getAdminPwd() == null)
    {
      uData.setAdminPwd(adminPwd);
    }
    if (!cancelled && uData.getAdminPwd() == null && !administratorDefined)
    {
      adminPwd = null;
      int nPasswordPrompts = 0;
      while (adminPwd == null)
      {
        if (nPasswordPrompts > CONFIRMATION_MAX_TRIES)
        {
          errPrintln(ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(
              CONFIRMATION_MAX_TRIES));
          cancelled = true;
          break;
        }
        nPasswordPrompts ++;
        if (!promptedForAdmin)
        {
          println();
          println(INFO_REPLICATION_ENABLE_ADMINISTRATOR_MUST_BE_CREATED.get());
          println();
        }
        while (adminPwd == null)
        {
          adminPwd = askForAdministratorPwd(logger);
          println();
        }
        String adminPwdConfirm = null;
        while (adminPwdConfirm == null)
        {
          try
          {
            adminPwdConfirm = String.valueOf(readPassword(INFO_ADMINISTRATOR_PWD_CONFIRM_PROMPT.get()));
          }
          catch (ClientException ex)
          {
            logger.warn(LocalizableMessage.raw("Error reading input: " + ex, ex));
          }
          println();
        }
        if (!adminPwd.equals(adminPwdConfirm))
        {
          println();
          errPrintln(ERR_ADMINISTRATOR_PWD_DO_NOT_MATCH.get());
          println();
          adminPwd = null;
        }
      }
      uData.setAdminPwd(adminPwd);
    }
    if (!cancelled)
    {
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      checkSuffixesForEnableReplication(suffixes, conn1, conn2, true, uData);
      cancelled = suffixes.isEmpty();
      uData.setBaseDNs(suffixes);
    }
    close(conn1, conn2);
    uData.setReplicateSchema(!argParser.noSchemaReplication());
    return !cancelled;
  }
  /**
@@ -2612,166 +2530,131 @@
   * is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @throws ReplicationCliException if there is a critical error reading the
   * ADS.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   * @throws ReplicationCliException if there is a critical error reading the ADS.
   */
  private boolean promptIfRequired(DisableReplicationUserData uData) throws ReplicationCliException
  {
    boolean cancelled = false;
    String adminPwd = argParser.getBindPasswordAdmin();
    String adminUid = argParser.getAdministratorUID();
    String bindDn = argParser.getBindDNToDisable();
    // This is done because we want to ask explicitly for this
    String host = argParser.getHostNameToDisable();
    int port = argParser.getPortToDisable();
    /* Try to connect to the server. */
    ConnectionWrapper conn = null;
    while (conn == null && !cancelled)
    ConnectionWrapper conn = createConnection();
    if (conn == null)
    {
      try
      {
        sourceServerCI.setUseAdminOrBindDn(true);
        sourceServerCI.run();
        host = sourceServerCI.getHostName();
        port = sourceServerCI.getPortNumber();
        bindDn = sourceServerCI.getProvidedBindDN();
        adminUid = sourceServerCI.getProvidedAdminUID();
        adminPwd = sourceServerCI.getBindPassword();
        conn = createConnectionInteracting(sourceServerCI);
        if (conn == null)
        {
          cancelled = true;
        }
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception "+ce));
        errPrintln();
        errPrintln(ce.getMessageObject());
        errPrintln();
        sourceServerCI.resetConnectionArguments();
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception "+ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        cancelled = true;
      }
      return false;
    }
    if (!cancelled)
    try
    {
      uData.setHostPort(new HostPort(host, port));
      final String adminUid = sourceServerCI.getProvidedAdminUID();
      uData.setHostPort(getHostPort2(sourceServerCI));
      uData.setAdminUid(adminUid);
      uData.setBindDn(bindDn);
      uData.setAdminPwd(adminPwd);
    }
    if (conn != null && adminUid != null)
    {
      // If the server contains an ADS, try to load it and only load it: if
      // there are issues with the ADS they will be encountered in the
      // disableReplication(DisableReplicationUserData) method.  Here we have
      // to load the ADS to ask the user to accept the certificates and
      // eventually admin authentication data.
      AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn);
      cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false);
      conn = aux.get();
    }
      uData.setBindDn(sourceServerCI.getProvidedBindDN());
      uData.setAdminPwd(sourceServerCI.getBindPassword());
    boolean disableAll = argParser.disableAllArg.isPresent();
    boolean disableReplicationServer =
      argParser.disableReplicationServerArg.isPresent();
    if (disableAll ||
        (argParser.advancedArg.isPresent() &&
        argParser.getBaseDNs().isEmpty() &&
        !disableReplicationServer))
    {
      try
      if (adminUid != null)
      {
        disableAll = askConfirmation(INFO_REPLICATION_PROMPT_DISABLE_ALL.get(),
          disableAll, logger);
        // If the server contains an ADS, try to load it and only load it: if
        // there are issues with the ADS they will be encountered in the
        // disableReplication(DisableReplicationUserData) method. Here we have
        // to load the ADS to ask the user to accept the certificates and
        // eventually admin authentication data.
        AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn);
        if (!loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false))
        {
          return false;
        }
        conn = aux.get();
      }
      catch (ClientException ce)
      {
        errPrintln(ce.getMessageObject());
        cancelled = true;
      }
    }
    int repPort = getReplicationPort(conn);
    if (!disableAll
        && (argParser.advancedArg.isPresent() || disableReplicationServer)
        && repPort > 0)
    {
      try
      {
        disableReplicationServer = askConfirmation(
            INFO_REPLICATION_PROMPT_DISABLE_REPLICATION_SERVER.get(repPort),
            disableReplicationServer,
            logger);
      }
      catch (ClientException ce)
      {
        errPrintln(ce.getMessageObject());
        cancelled = true;
      }
    }
    if (disableReplicationServer && repPort < 0)
    {
      disableReplicationServer = false;
      final LocalizableMessage msg = INFO_REPLICATION_PROMPT_NO_REPLICATION_SERVER_TO_DISABLE.get(conn.getHostPort());
      try
      {
        cancelled = askConfirmation(msg, false, logger);
      }
      catch (ClientException ce)
      {
        errPrintln(ce.getMessageObject());
        cancelled = true;
      }
    }
    if (repPort > 0 && disableAll)
    {
      disableReplicationServer = true;
    }
    uData.setDisableAll(disableAll);
    uData.setDisableReplicationServer(disableReplicationServer);
    if (!cancelled && !disableAll)
    {
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      checkSuffixesForDisableReplication(suffixes, conn, true, !disableReplicationServer);
      cancelled = suffixes.isEmpty() && !disableReplicationServer;
      uData.setBaseDNs(suffixes);
      if (!uData.disableReplicationServer() && repPort > 0
          && disableAllBaseDns(conn, uData)
          && !argParser.advancedArg.isPresent())
      boolean disableAll = argParser.disableAllArg.isPresent();
      boolean disableReplicationServer = argParser.disableReplicationServerArg.isPresent();
      if (disableAll
          || (argParser.advancedArg.isPresent()
              && argParser.getBaseDNs().isEmpty()
              && !disableReplicationServer))
      {
        try
        {
          uData.setDisableReplicationServer(askConfirmation(
              INFO_REPLICATION_DISABLE_ALL_SUFFIXES_DISABLE_REPLICATION_SERVER.get(
                  conn.getHostPort(), repPort), true,
              logger));
          disableAll = askConfirmation(INFO_REPLICATION_PROMPT_DISABLE_ALL.get(), disableAll, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          cancelled = true;
          return false;
        }
      }
    }
    if (!cancelled)
    {
      int repPort = getReplicationPort(conn);
      if (!disableAll
          && repPort > 0
          && (argParser.advancedArg.isPresent() || disableReplicationServer))
      {
        try
        {
          LocalizableMessage prompt = INFO_REPLICATION_PROMPT_DISABLE_REPLICATION_SERVER.get(repPort);
          disableReplicationServer = askConfirmation(prompt, disableReplicationServer, logger);
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          return false;
        }
      }
      if (disableReplicationServer && repPort < 0)
      {
        disableReplicationServer = false;
        try
        {
          LocalizableMessage prompt = INFO_REPLICATION_PROMPT_NO_REPLICATION_SERVER_TO_DISABLE.get(conn.getHostPort());
          if (!askConfirmation(prompt, false, logger))
          {
            return false;
          }
        }
        catch (ClientException ce)
        {
          errPrintln(ce.getMessageObject());
          return false;
        }
      }
      if (repPort > 0 && disableAll)
      {
        disableReplicationServer = true;
      }
      uData.setDisableAll(disableAll);
      uData.setDisableReplicationServer(disableReplicationServer);
      if (!disableAll)
      {
        List<DN> suffixes = toDNs(argParser.getBaseDNs());
        checkSuffixesForDisableReplication(suffixes, conn, true, !disableReplicationServer);
        if (suffixes.isEmpty() && !disableReplicationServer)
        {
          return false;
        }
        uData.setBaseDNs(suffixes);
        if (!uData.disableReplicationServer()
            && repPort > 0
            && disableAllBaseDns(conn, uData)
            && !argParser.advancedArg.isPresent())
        {
          try
          {
            LocalizableMessage prompt =
                INFO_REPLICATION_DISABLE_ALL_SUFFIXES_DISABLE_REPLICATION_SERVER.get(conn.getHostPort(), repPort);
            uData.setDisableReplicationServer(askConfirmation(prompt, true, logger));
          }
          catch (ClientException ce)
          {
            errPrintln(ce.getMessageObject());
            return false;
          }
        }
      }
      // Ask for confirmation to disable if not already done.
      boolean disableADS = false;
      boolean disableSchema = false;
@@ -2786,6 +2669,8 @@
          disableSchema = true;
        }
      }
      boolean cancelled = false;
      if (disableADS)
      {
        println();
@@ -2809,11 +2694,39 @@
        }
        println();
      }
      return !cancelled;
    }
    finally
    {
      close(conn);
    }
  }
    close(conn);
    return !cancelled;
  private ConnectionWrapper createConnection()
  {
    while (true)
    {
      try
      {
        sourceServerCI.setUseAdminOrBindDn(true);
        sourceServerCI.run();
        return createConnectionInteracting(sourceServerCI);
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception " + ce));
        errPrintln();
        errPrintln(ce.getMessageObject());
        errPrintln();
        sourceServerCI.resetConnectionArguments();
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception " + ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        return null;
      }
    }
  }
  /**
@@ -2822,17 +2735,19 @@
   * information is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   */
  private boolean promptIfRequired(InitializeAllReplicationUserData uData)
  {
    try (ConnectionWrapper conn = getConnection(uData))
    ConnectionWrapper conn = getConnection(uData);
    if (conn == null)
    {
      if (conn == null)
      {
        return false;
      }
      return false;
    }
    try
    {
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      checkSuffixesForInitializeReplication(suffixes, conn, true);
@@ -2844,12 +2759,13 @@
      // Ask for confirmation to initialize.
      println();
      if (!askConfirmation(getPrompt(uData, conn), true))
      {
        return false;
      }
      final boolean cancelled = !askConfirmation(getPrompt(uData, conn), true);
      println();
      return true;
      return !cancelled;
    }
    finally
    {
      close(conn);
    }
  }
@@ -2882,22 +2798,27 @@
   * If some information is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   */
  private boolean promptIfRequiredForPreOrPost(MonoServerReplicationUserData uData)
  {
    try (ConnectionWrapper conn = getConnection(uData))
    ConnectionWrapper conn = getConnection(uData);
    if (conn == null)
    {
      if (conn == null)
      {
        return false;
      }
      return false;
    }
    try
    {
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      checkSuffixesForInitializeReplication(suffixes, conn, true);
      uData.setBaseDNs(suffixes);
      return !suffixes.isEmpty();
    }
    finally
    {
      close(conn);
    }
  }
  private ConnectionWrapper getConnection(MonoServerReplicationUserData uData)
@@ -2916,7 +2837,7 @@
        ConnectionWrapper conn = createConnectionInteracting(sourceServerCI);
        if (conn != null)
        {
          uData.setHostPort(new HostPort(sourceServerCI.getHostName(), sourceServerCI.getPortNumber()));
          uData.setHostPort(getHostPort2(sourceServerCI));
          uData.setAdminUid(sourceServerCI.getAdministratorUID());
          uData.setAdminPwd(sourceServerCI.getBindPassword());
          if (uData instanceof StatusReplicationUserData)
@@ -2949,40 +2870,34 @@
   * is missing, ask the user to provide valid data.
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   * @throws ReplicationCliException if a critical error occurs reading the ADS.
   */
  private boolean promptIfRequired(StatusReplicationUserData uData)
  throws ReplicationCliException
  private boolean promptIfRequired(StatusReplicationUserData uData) throws ReplicationCliException
  {
    ConnectionWrapper conn = null;
    ConnectionWrapper conn = getConnection(uData);
    if (conn == null)
    {
      return false;
    }
    try
    {
      conn = getConnection(uData);
      if (conn == null)
      {
        return false;
      }
      // If the server contains an ADS, try to load it and only load it: if
      // there are issues with the ADS they will be encountered in the
      // statusReplication(StatusReplicationUserData) method. Here we have
      // to load the ADS to ask the user to accept the certificates and
      // eventually admin authentication data.
      AtomicReference<ConnectionWrapper> aux = new AtomicReference<>(conn);
      boolean cancelled = !loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false);
      conn = aux.get();
      if (cancelled)
      if (!loadADSAndAcceptCertificates(sourceServerCI, aux, uData, false))
      {
        return false;
      }
      conn = aux.get();
      if (!cancelled)
      {
        uData.setBaseDNs(toDNs(argParser.getBaseDNs()));
      }
      return !cancelled;
      uData.setBaseDNs(toDNs(argParser.getBaseDNs()));
      return true;
    }
    finally
    {
@@ -2997,129 +2912,115 @@
   * We assume that if this method is called we are in interactive mode.
   * @param uData the object to be updated.
   * @param serversOperations Additional processing for the command
   * @return <CODE>true</CODE> if the object was successfully updated and
   * <CODE>false</CODE> if the user cancelled the operation.
   * @return {@code true} if the object was successfully updated and
   * {@code false} if the user cancelled the operation.
   */
  private boolean promptIfRequired(SourceDestinationServerUserData uData,
      OperationBetweenSourceAndDestinationServers serversOperations)
  {
    boolean cancelled = false;
    String adminPwd = argParser.getBindPasswordAdmin();
    String adminUid = argParser.getAdministratorUID();
    String hostSource = argParser.getHostNameSource();
    int portSource = argParser.getPortSource();
    Map<String, String> pwdFile = null;
    if (argParser.getSecureArgsList().getBindPasswordFileArg().isPresent())
    {
      pwdFile = argParser.getSecureArgsList().getBindPasswordFileArg().getNameToValueMap();
    }
    /*
     * Use a copy of the argument properties since the map might be cleared
     * in initializeGlobalArguments.
     */
    sourceServerCI.initializeGlobalArguments(hostSource, portSource, adminUid, null, adminPwd,
        pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
    // Try to connect to the source server
    ConnectionWrapper connSource = null;
    while (connSource == null && !cancelled)
    ConnectionWrapper connDestination = null;
    try
    {
      try
      // Prompt for source server credentials
      sourceServerCI.initializeGlobalArguments(argParser.getHostNameSource(), argParser.getPortSource(), adminUid, null,
          adminPwd, getPwdFile());
      // Try to connect to the source server
      connSource = initializeFirstConnection(INFO_INITIALIZE_SOURCE_CONNECTION_PARAMETERS.get());
      if (connSource == null)
      {
        sourceServerCI.setHeadingMessage(INFO_INITIALIZE_SOURCE_CONNECTION_PARAMETERS.get());
        sourceServerCI.run();
        hostSource = sourceServerCI.getHostName();
        portSource = sourceServerCI.getPortNumber();
        adminUid = sourceServerCI.getAdministratorUID();
        adminPwd = sourceServerCI.getBindPassword();
        return false;
      }
        connSource = createConnectionInteracting(sourceServerCI);
        if (connSource == null)
        {
          cancelled = true;
        }
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception "+ce));
        errPrintln();
        errPrintln(ce.getMessageObject());
        errPrintln();
        sourceServerCI.resetConnectionArguments();
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception "+ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        cancelled = true;
      }
    }
    if (!cancelled)
    {
      uData.setHostNameSource(hostSource);
      uData.setPortSource(portSource);
      adminUid = sourceServerCI.getAdministratorUID();
      adminPwd = sourceServerCI.getBindPassword();
      uData.setHostNameSource(sourceServerCI.getHostName());
      uData.setPortSource(sourceServerCI.getPortNumber());
      uData.setAdminUid(adminUid);
      uData.setAdminPwd(adminPwd);
    }
    firstServerCommandBuilder = new CommandBuilder();
    if (mustPrintCommandBuilder())
      firstServerCommandBuilder = new CommandBuilder();
      if (mustPrintCommandBuilder())
      {
        firstServerCommandBuilder.append(sourceServerCI.getCommandBuilder());
      }
      // Prompt for destination server credentials
      LDAPConnectionConsoleInteraction destinationServerCI =
          new LDAPConnectionConsoleInteraction(this, argParser.getSecureArgsList());
      destinationServerCI.initializeGlobalArguments(argParser.getHostNameDestination(), argParser.getPortDestination(),
          adminUid, null, adminPwd, getPwdFile());
      // Try to connect to the destination server.
      connDestination = initializeDestinationConnection(sourceServerCI, destinationServerCI);
      if (connDestination == null)
      {
        return false;
      }
      uData.setHostNameDestination(destinationServerCI.getHostName());
      uData.setPortDestination(destinationServerCI.getPortNumber());
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      uData.setBaseDNs(suffixes);
      if (!serversOperations.continueAfterUserInput(suffixes, connSource, connDestination))
      {
        return false;
      }
      println();
      final boolean confirmed = serversOperations.confirmOperation(uData, connSource, connDestination, true);
      println();
      return confirmed;
    }
    finally
    {
      firstServerCommandBuilder.append(sourceServerCI.getCommandBuilder());
      close(connSource, connDestination);
    }
  }
    /* Prompt for destination server credentials */
    String hostDestination = argParser.getHostNameDestination();
    int portDestination = argParser.getPortDestination();
  private LinkedHashMap<String, String> getPwdFile()
  {
    FileBasedArgument bindPasswordFileArg = argParser.getSecureArgsList().getBindPasswordFileArg();
    if (bindPasswordFileArg.isPresent())
    {
      // Use a copy of the argument properties since the map might be cleared in
      // {@link LDAPConnectionConsoleInteraction#initializeGlobalArguments()}
      return new LinkedHashMap<>(bindPasswordFileArg.getNameToValueMap());
    }
    return null;
  }
    /*
     * Use a copy of the argument properties since the map might be cleared
     * in initializeGlobalArguments.
     */
    LDAPConnectionConsoleInteraction destinationServerCI = new LDAPConnectionConsoleInteraction(this,
        argParser.getSecureArgsList());
    destinationServerCI.initializeGlobalArguments(hostDestination, portDestination, adminUid, null, adminPwd,
        pwdFile == null ? null : new LinkedHashMap<String, String>(pwdFile));
    /* Try to connect to the destination server. */
    ConnectionWrapper connDestination = null;
  private ConnectionWrapper initializeDestinationConnection(LDAPConnectionConsoleInteraction sourceServerCI,
      LDAPConnectionConsoleInteraction destinationServerCI)
  {
    destinationServerCI.resetHeadingDisplayed();
    while (connDestination == null && !cancelled)
    while (true)
    {
      try
      {
        destinationServerCI.setHeadingMessage(INFO_INITIALIZE_DESTINATION_CONNECTION_PARAMETERS.get());
        destinationServerCI.run();
        hostDestination = destinationServerCI.getHostName();
        portDestination = destinationServerCI.getPortNumber();
        boolean error = false;
        if (hostSource.equalsIgnoreCase(hostDestination)
            && portSource == portDestination)
        final String hostSource = sourceServerCI.getHostName();
        final int portSource = sourceServerCI.getPortNumber();
        if (hostSource.equalsIgnoreCase(destinationServerCI.getHostName())
            && portSource == destinationServerCI.getPortNumber())
        {
          portDestination = -1;
          errPrintln();
          errPrintln(ERR_SOURCE_DESTINATION_INITIALIZE_SAME_SERVER_PORT.get(hostSource, portSource));
          errPrintln();
          error = true;
          return null;
        }
        if (!error)
        {
          connDestination = createConnectionInteracting(destinationServerCI, true);
          if (connDestination == null)
          {
            cancelled = true;
          }
        }
        return createConnectionInteracting(destinationServerCI, true);
      }
      catch (ClientException ce)
      {
        logger.warn(LocalizableMessage.raw("Client exception "+ce));
        logger.warn(LocalizableMessage.raw("Client exception " + ce));
        errPrintln();
        errPrintln(ce.getMessageObject());
        errPrintln();
@@ -3127,31 +3028,11 @@
      }
      catch (ArgumentException ae)
      {
        logger.warn(LocalizableMessage.raw("Argument exception "+ae));
        logger.warn(LocalizableMessage.raw("Argument exception " + ae));
        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
        cancelled = true;
        return null;
      }
    }
    if (!cancelled)
    {
      uData.setHostNameDestination(hostDestination);
      uData.setPortDestination(portDestination);
      List<DN> suffixes = toDNs(argParser.getBaseDNs());
      cancelled = serversOperations.continueAfterUserInput(suffixes, connSource, connDestination, true);
      uData.setBaseDNs(suffixes);
      if (!cancelled)
      {
        println();
        cancelled = serversOperations.confirmOperation(uData, connSource, connDestination, true);
        println();
      }
    }
    close(connSource, connDestination);
    return !cancelled;
  }
  private LocalizableMessage getInitializeReplicationPrompt(SourceDestinationServerUserData uData,
@@ -3373,8 +3254,8 @@
   * enable replication subcommand or the source server in the initialize server
   * subcommand.
   * @throws ReplicationCliException if a critical error occurred.
   * @return <CODE>true</CODE> if everything went fine and the user accepted
   * all the certificates and confirmed everything.  Returns <CODE>false</CODE>
   * @return {@code true} if everything went fine and the user accepted
   * all the certificates and confirmed everything.  Returns {@code false}
   * if the user did not accept a certificate or any of the confirmation
   * messages.
   */
@@ -3574,8 +3455,7 @@
      ADSContext adsContext = new ADSContext(conn);
      if (adsContext.hasAdminData())
      {
        Set<?> administrators = adsContext.readAdministratorRegistry();
        return !administrators.isEmpty();
        return !adsContext.readAdministratorRegistry().isEmpty();
      }
    }
    catch (Throwable t)
@@ -3591,8 +3471,7 @@
   * ReplicationUserData defined in the server for which the connection is provided.
   * @param conn the connection
   * @param uData the user data
   * @return <CODE>true</CODE> if we could find an administrator and
   * <CODE>false</CODE> otherwise.
   * @return {@code true} if we could find an administrator, {@code false} otherwise.
   */
  private boolean hasAdministrator(ConnectionWrapper conn, ReplicationUserData uData)
  {
@@ -3711,9 +3590,9 @@
   * make reference to the other replication server.
   * @param rep1 the first replica.
   * @param rep2 the second replica.
   * @return <CODE>true</CODE> if we can assure that the two replicas are
   * @return {@code true} if we can assure that the two replicas are
   * replicated using the replication server and replication port information
   * and <CODE>false</CODE> otherwise.
   * and {@code false} otherwise.
   */
  private boolean areFullyReplicated(ReplicaDescriptor rep1,
      ReplicaDescriptor rep2)
@@ -3738,8 +3617,8 @@
   * have at least one common replication server referenced.
   * @param rep1 the first replica.
   * @param rep2 the second replica.
   * @return <CODE>true</CODE> if we can assure that the two replicas are
   * replicated and <CODE>false</CODE> otherwise.
   * @return {@code true} if we can assure that the two replicas are
   * replicated and {@code false} otherwise.
   */
  private boolean areReplicated(ReplicaDescriptor rep1, ReplicaDescriptor rep2)
  {
@@ -4454,7 +4333,7 @@
      ConnectionWrapper conn, boolean interactive, boolean displayErrors)
  {
    // whether the user must provide base DNs or not
    // (if it is <CODE>false</CODE> the user will be proposed the suffixes only once)
    // (if it is {@code false} the user will be proposed the suffixes only once)
    final boolean areSuffixRequired = displayErrors;
    TreeSet<DN> availableSuffixes = new TreeSet<>();
@@ -7613,8 +7492,8 @@
   * another set of replication servers.
   * @param s1 the first set of replication servers.
   * @param s2 the second set of replication servers.
   * @return <CODE>true</CODE> if the two sets represent the same replication
   * servers and <CODE>false</CODE> otherwise.
   * @return {@code true} if the two sets represent the same replication
   * servers and {@code false} otherwise.
   */
  private boolean areReplicationServersEqual(Set<String> s1, Set<String> s2)
  {
@@ -7808,8 +7687,7 @@
   * Method used to compare two server registries.
   * @param registry1 the first registry to compare.
   * @param registry2 the second registry to compare.
   * @return <CODE>true</CODE> if the registries are equal and
   * <CODE>false</CODE> otherwise.
   * @return {@code true} if the registries are equal and {@code false} otherwise.
   */
  private boolean areEqual(Set<Map<ServerProperty, Object>> registry1, Set<Map<ServerProperty, Object>> registry2)
  {
@@ -7872,8 +7750,8 @@
  /**
   * Tells whether we are trying to disable all the replicated suffixes.
   * @param uData the disable replication data provided by the user.
   * @return <CODE>true</CODE> if we want to disable all the replicated suffixes
   * and <CODE>false</CODE> otherwise.
   * @return {@code true} if we want to disable all the replicated suffixes
   * and {@code false} otherwise.
   */
  private boolean disableAllBaseDns(ConnectionWrapper conn, DisableReplicationUserData uData)
  {
@@ -7992,19 +7870,14 @@
      {
        // Write to the file.
        String file = argParser.equivalentCommandFileArgument.getValue();
        try
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, true)))
        {
          BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
          writer.write(SHELL_COMMENT_SEPARATOR+getCurrentOperationDateMessage());
          writer.write(SHELL_COMMENT_SEPARATOR + getCurrentOperationDateMessage());
          writer.newLine();
          writer.write(commandBuilder.toString());
          writer.newLine();
          writer.newLine();
          writer.flush();
          writer.close();
        }
        catch (IOException ioe)
        {
@@ -9013,8 +8886,8 @@
   *
   * @param adsCtx1 the ADSContext of the first registry.
   * @param adsCtx2 the ADSContext of the second registry.
   * @return <CODE>true</CODE> if the registry containing all the data is
   * the first registry and <CODE>false</CODE> otherwise.
   * @return {@code true} if the registry containing all the data is
   * the first registry and {@code false} otherwise.
   * @throws ReplicationCliException if there is a problem reading or updating
   * the registries.
   */
@@ -9306,12 +9179,12 @@
  }
  /**
   * Returns <CODE>true</CODE> if the provided baseDN is replicated in the
   * provided server, <CODE>false</CODE> otherwise.
   * Returns {@code true} if the provided baseDN is replicated in the
   * provided server, {@code false} otherwise.
   * @param server the server.
   * @param baseDN the base DN.
   * @return <CODE>true</CODE> if the provided baseDN is replicated in the
   * provided server, <CODE>false</CODE> otherwise.
   * @return {@code true} if the provided baseDN is replicated in the
   * provided server, {@code false} otherwise.
   */
  private boolean isBaseDNReplicated(ServerDescriptor server, DN baseDN)
  {
@@ -9319,13 +9192,13 @@
  }
  /**
   * Returns <CODE>true</CODE> if the provided baseDN is replicated between
   * both servers, <CODE>false</CODE> otherwise.
   * Returns {@code true} if the provided baseDN is replicated between
   * both servers, {@code false} otherwise.
   * @param server1 the first server.
   * @param server2 the second server.
   * @param baseDN the base DN.
   * @return <CODE>true</CODE> if the provided baseDN is replicated between
   * both servers, <CODE>false</CODE> otherwise.
   * @return {@code true} if the provided baseDN is replicated between
   * both servers, {@code false} otherwise.
   */
  private boolean isBaseDNReplicated(ServerDescriptor server1, ServerDescriptor server2, DN baseDN)
  {