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

Jean-Noël Rouvignac
19.36.2016 8aa869c283305c3011c1e92f002574426a6d3900
uninstaller: code cleanup
2 files modified
533 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java 203 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java 330 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
@@ -124,21 +124,11 @@
    UninstallUserData userData = new UninstallUserData();
    try
    {
      boolean isInteractive;
      boolean isQuiet;
      boolean isVerbose;
      boolean isCanceled = false;
      /* Step 1: analyze the arguments. */
      boolean isInteractive = args.isInteractive();
      isInteractive = args.isInteractive();
      isQuiet = args.isQuiet();
      isVerbose = args.isVerbose();
      userData.setQuiet(isQuiet);
      userData.setVerbose(isVerbose);
      userData.setQuiet(args.isQuiet());
      userData.setVerbose(args.isVerbose());
      userData.setForceOnError(args.isForceOnError());
      userData.setTrustManager(args.getTrustManager());
@@ -159,8 +149,7 @@
       */
      Set<String> outsideDbs;
      Set<String> outsideLogs;
      Configuration config =
        Installation.getLocal().getCurrentConfiguration();
      Configuration config = Installation.getLocal().getCurrentConfiguration();
      try {
        outsideDbs = config.getOutsideDbs();
      } catch (IOException ioe) {
@@ -184,6 +173,7 @@
        args.removeLogFiles() ||
        args.removeServerLibraries();
      boolean isCanceled = false;
      if (somethingSpecifiedToDelete)
      {
        userData.setRemoveBackups(args.removeAll() || args.removeBackupFiles());
@@ -291,16 +281,13 @@
  /**
   * Commodity method used to ask the user to confirm the deletion of certain
   * parts of the server.  It updates the provided UserData object
   * accordingly.  Returns <CODE>true</CODE> if the user cancels and <CODE>
   * false</CODE> otherwise.
   * parts of the server.  It updates the provided UserData object accordingly.
   * @param userData the UserData object to be updated.
   * @param outsideDbs the set of relative paths of databases located outside
   * the installation path of the server.
   * @param outsideLogs the set of relative paths of log files located outside
   * the installation path of the server.
   * @return <CODE>true</CODE> if the user cancels and <CODE>false</CODE>
   * otherwise.
   * @return {@code true} if the user cancels, {@code false} otherwise.
   */
  private boolean askWhatToDelete(UninstallUserData userData,
      Set<String> outsideDbs, Set<String> outsideLogs) throws UserDataException
@@ -485,14 +472,14 @@
  }
  /**
   * Commodity method used to ask the user (when necessary) if the server must
   * be stopped or not. It also prompts (if required) for authentication.
   * Asks the user (when necessary) if the server must be stopped or not.
   * It also prompts (if required) for authentication.
   *
   * @param userData
   *          the UserData object to be updated with the authentication of the
   *          user.
   * @return <CODE>true</CODE> if the user wants to continue with uninstall and
   *         <CODE>false</CODE> otherwise.
   * @return {@code true} if the user wants to continue with uninstall,
   *         {@code false} otherwise.
   * @throws UserDataException
   *           if there is a problem with the data provided by the user (in the
   *           particular case where we are on non-interactive uninstall and
@@ -501,8 +488,7 @@
   *           If there is an error processing data in non-interactive mode and
   *           an error must be thrown (not in force on error mode).
   */
  private boolean checkServerState(UninstallUserData userData)
  throws UserDataException, ClientException
  private boolean checkServerState(UninstallUserData userData) throws UserDataException, ClientException
  {
    boolean cancelled = false;
    boolean interactive = parser.isInteractive();
@@ -521,8 +507,7 @@
    logger.info(LocalizableMessage.raw("interactive: "+interactive));
    logger.info(LocalizableMessage.raw("forceOnError: "+forceOnError));
    logger.info(LocalizableMessage.raw("conf.isADS(): "+conf.isADS()));
    logger.info(LocalizableMessage.raw("conf.isReplicationServer(): "+
        conf.isReplicationServer()));
    logger.info(LocalizableMessage.raw("conf.isReplicationServer(): "+conf.isReplicationServer()));
    logger.info(LocalizableMessage.raw("conf.isServerRunning(): "+conf.isServerRunning()));
    if (conf.isADS() && conf.isReplicationServer())
    {
@@ -698,8 +683,8 @@
  /**
   *  Ask for confirmation to stop server.
   *  @return <CODE>true</CODE> if the user wants to continue and stop the
   *  server.  <CODE>false</CODE> otherwise.
   *  @return {@code true} if the user wants to continue and stop the server,
   *          {@code false} otherwise.
   *  @throws ClientException if the user reached the confirmation limit.
   */
  private boolean confirmToStopServer() throws ClientException
@@ -709,32 +694,30 @@
  /**
   *  Ask for confirmation to delete files.
   *  @return <CODE>true</CODE> if the user wants to continue and delete the
   *  files.  <CODE>false</CODE> otherwise.
   *  @return {@code true} if the user wants to continue and delete the files,
   *          {@code false} otherwise.
   *  @throws ClientException if the user reached the confirmation limit.
   */
  private boolean confirmDeleteFiles() throws ClientException
  {
    return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_DELETE_FILES.get(), true,
        logger);
    return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_DELETE_FILES.get(), true, logger);
  }
  /**
   *  Ask for confirmation to update configuration on remote servers.
   *  @return <CODE>true</CODE> if the user wants to continue and stop the
   *  server.  <CODE>false</CODE> otherwise.
   *  @return {@code true} if the user wants to continue and stop the server.
   *          {@code false} otherwise.
   *  @throws ClientException if the user reached the confirmation limit.
   */
  private boolean confirmToUpdateRemote() throws ClientException
  {
    return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE.get(), true,
        logger);
    return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE.get(), true, logger);
  }
  /**
   *  Ask for confirmation to update configuration on remote servers.
   *  @return <CODE>true</CODE> if the user wants to continue and stop the
   *  server.  <CODE>false</CODE> otherwise.
   *  @return {@code true} if the user wants to continue and stop the server,
   *          {@code false} otherwise.
   *  @throws ClientException if the user reached the confirmation limit.
   */
  private boolean confirmToUpdateRemoteAndStart() throws ClientException
@@ -745,8 +728,8 @@
  /**
   *  Ask for confirmation to provide again authentication.
   *  @return <CODE>true</CODE> if the user wants to provide authentication
   *  again.  <CODE>false</CODE> otherwise.
   *  @return {@code true} if the user wants to provide authentication again,
   *          {@code false} otherwise.
   *  @throws ClientException if the user reached the confirmation limit.
   */
  private boolean promptToProvideAuthenticationAgain() throws ClientException
@@ -760,8 +743,8 @@
   * data is provided and validated, we assume that the user wants to update the
   * remote servers.
   *
   * @return <CODE>true</CODE> if the user wants to continue and update the
   *         remote servers. <CODE>false</CODE> otherwise.
   * @return {@code true} if the user wants to continue and update the
   *         remote servers, {@code false} otherwise.
   * @throws UserDataException
   *           if there is a problem with the information provided by the user.
   * @throws ClientException
@@ -909,17 +892,15 @@
  private String askForReferencedHostName(String defaultHostName)
  {
    String s = defaultHostName;
    try
    {
      s = readInput(INFO_UNINSTALL_CLI_REFERENCED_HOSTNAME_PROMPT.get(),
          defaultHostName);
      return readInput(INFO_UNINSTALL_CLI_REFERENCED_HOSTNAME_PROMPT.get(), defaultHostName);
    }
    catch (ClientException ce)
    {
      logger.warn(LocalizableMessage.raw("Error reading input: %s", ce), ce);
      return defaultHostName;
    }
    return s;
  }
  private boolean startServer(boolean suppressOutput)
@@ -994,8 +975,7 @@
        // no-op
      }
    };
    application.setProgressMessageFormatter(
        new PlainTextProgressMessageFormatter());
    application.setProgressMessageFormatter(new PlainTextProgressMessageFormatter());
    if (!suppressOutput)
    {
      application.addProgressUpdateListener(
@@ -1007,8 +987,7 @@
            }
          });
    }
    ServerController controller = new ServerController(application,
        Installation.getLocal());
    ServerController controller = new ServerController(application, Installation.getLocal());
    try
    {
      if (suppressOutput)
@@ -1043,15 +1022,12 @@
  /**
   * Updates the contents of the UninstallUserData while trying to connect to
   * the remote servers. It returns <CODE>true</CODE> if we could connect to the
   * remote servers and all the presented certificates were accepted and
   * <CODE>false</CODE> otherwise. continue if
   * the remote servers.
   *
   * @param userData
   *          the user data to be updated.
   * @return <CODE>true</CODE> if we could connect to the remote servers and all
   *         the presented certificates were accepted and <CODE>false</CODE>
   *         otherwise.
   * @return {@code true} if we could connect to the remote servers and all the
   *         presented certificates were accepted, {@code false} otherwise.
   * @throws UserDataException
   *           if were are not in interactive mode and not in force on error
   *           mode and the operation must be stopped.
@@ -1076,8 +1052,8 @@
    try
    {
      info.setTrustManager(userData.getTrustManager());
      info.setConnectTimeout(getConnectTimeout());
      info.setConnectionPolicy(ConnectionProtocolPolicy.USE_ADMIN);
      info.setConnectTimeout(getConnectTimeout());
      conn = new ConnectionWrapper(
          info.getAdminConnectorHostPort(), connectionType,
          getAdministratorDN(userData.getAdminUID()), userData.getAdminPwd(),
@@ -1179,8 +1155,8 @@
   * Method that interacts with the user depending on what errors where
   * encountered in the TopologyCache object.  This method assumes that the
   * TopologyCache has been reloaded.
   * Returns <CODE>true</CODE> if the user accepts all the problems encountered
   * and <CODE>false</CODE> otherwise.
   * @return {@code true} if the user accepts all the problems encountered,
   *         {@code false} otherwise.
   * @param userData the user data.
   * @throws UserDataException if there is an error with the information
   * provided by the user when we are in non-interactive mode.
@@ -1191,13 +1167,16 @@
  private boolean handleTopologyCache(TopologyCache cache,
      UninstallUserData userData) throws UserDataException, ClientException
  {
    boolean returnValue;
    boolean stopProcessing = false;
    boolean reloadTopologyCache = false;
    boolean result = handleTopologyCache0(cache, userData);
    logger.info(LocalizableMessage.raw("Return value: "+result));
    return result;
  }
  private boolean handleTopologyCache0(TopologyCache cache,
      UninstallUserData userData) throws UserDataException, ClientException
  {
    logger.info(LocalizableMessage.raw("Handle topology cache."));
    Set<TopologyCacheException> exceptions = new HashSet<>();
    /* Analyze if we had any exception while loading servers.  For the moment
     * only throw the exception found if the user did not provide the
     * Administrator DN and this caused a problem authenticating in one server
@@ -1205,6 +1184,7 @@
     */
    Set<ServerDescriptor> servers = cache.getServers();
    userData.setRemoteServers(servers);
    Set<TopologyCacheException> exceptions = new HashSet<>();
    for (ServerDescriptor server : servers)
    {
      TopologyCacheException e = server.getLastException();
@@ -1213,8 +1193,11 @@
        exceptions.add(e);
      }
    }
    Set<LocalizableMessage> exceptionMsgs = new LinkedHashSet<>();
    /* Check the exceptions and see if we throw them or not. */
    Set<LocalizableMessage> exceptionMsgs = new LinkedHashSet<>();
    boolean stopProcessing = false;
    boolean reloadTopologyCache = false;
    for (TopologyCacheException e : exceptions)
    {
      logger.info(LocalizableMessage.raw("Analyzing exception: "+e, e));
@@ -1259,6 +1242,7 @@
        exceptionMsgs.add(Utils.getMessage(e));
      }
    }
    if (isInteractive())
    {
      if (!stopProcessing && !exceptionMsgs.isEmpty())
@@ -1266,10 +1250,9 @@
        println();
        try
        {
          returnValue = askConfirmation(
            ERR_UNINSTALL_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.get(
                Utils.getMessageFromCollection(exceptionMsgs,
                  Constants.LINE_SEPARATOR)), true, logger);
          LocalizableMessage errorMsg = Utils.getMessageFromCollection(exceptionMsgs, Constants.LINE_SEPARATOR);
          return askConfirmation(
              ERR_UNINSTALL_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.get(errorMsg), true, logger);
        }
        catch (ClientException ce)
        {
@@ -1278,45 +1261,40 @@
      }
      else if (reloadTopologyCache)
      {
       returnValue = updateUserUninstallDataWithRemoteServers(userData);
        return updateUserUninstallDataWithRemoteServers(userData);
      }
      else
      {
        returnValue = !stopProcessing;
        return !stopProcessing;
      }
    }
    else
    {
      logger.info(LocalizableMessage.raw("exceptionMsgs: "+exceptionMsgs));
      if (!exceptionMsgs.isEmpty())
      if (exceptionMsgs.isEmpty())
      {
        if (parser.isForceOnError())
        {
          LocalizableMessage msg = Utils.getMessageFromCollection(exceptionMsgs,
              Constants.LINE_SEPARATOR);
          println();
          printErrorMessage(msg);
          returnValue = false;
        }
        else
        {
          LocalizableMessage msg =
            ERR_UNINSTALL_ERROR_UPDATING_REMOTE_NO_FORCE.get(
              "--" + parser.getSecureArgsList().getAdminUidArg().getLongIdentifier(),
              "--" + OPTION_LONG_BINDPWD,
              "--" + OPTION_LONG_BINDPWD_FILE,
              "--" + parser.forceOnErrorArg.getLongIdentifier(),
              Utils.getMessageFromCollection(exceptionMsgs, Constants.LINE_SEPARATOR));
          throw new ClientException(ReturnCode.APPLICATION_ERROR, msg);
        }
        return true;
      }
      LocalizableMessage errorMsg = Utils.getMessageFromCollection(exceptionMsgs, Constants.LINE_SEPARATOR);
      if (parser.isForceOnError())
      {
        println();
        printErrorMessage(errorMsg);
        return false;
      }
      else
      {
        returnValue = true;
        LocalizableMessage msg =
          ERR_UNINSTALL_ERROR_UPDATING_REMOTE_NO_FORCE.get(
            "--" + parser.getSecureArgsList().getAdminUidArg().getLongIdentifier(),
            "--" + OPTION_LONG_BINDPWD,
            "--" + OPTION_LONG_BINDPWD_FILE,
            "--" + parser.forceOnErrorArg.getLongIdentifier(),
                errorMsg);
        throw new ClientException(ReturnCode.APPLICATION_ERROR, msg);
      }
    }
    logger.info(LocalizableMessage.raw("Return value: "+returnValue));
    return returnValue;
  }
  @Override
@@ -1356,25 +1334,25 @@
   * @param ci the LDAPConnectionConsoleInteraction object to be used to update
   * the user data object.
   */
   private void updateTrustManager(UninstallUserData userData,
       LDAPConnectionConsoleInteraction ci)
  private void updateTrustManager(UninstallUserData userData, LDAPConnectionConsoleInteraction ci)
   {
     ApplicationTrustManager trust = null;
     TrustManager t = ci.getTrustManager();
     if (t != null)
     {
       if (t instanceof ApplicationTrustManager)
       {
         trust = (ApplicationTrustManager)t;
       }
       else
       {
         trust = new ApplicationTrustManager(ci.getKeyStore());
       }
     }
     userData.setTrustManager(trust);
    userData.setTrustManager(getTrustManager(ci));
   }
  private ApplicationTrustManager getTrustManager(LDAPConnectionConsoleInteraction ci)
  {
    TrustManager t = ci.getTrustManager();
    if (t instanceof ApplicationTrustManager)
    {
      return (ApplicationTrustManager) t;
    }
    else if (t != null)
    {
      return new ApplicationTrustManager(ci.getKeyStore());
    }
    return null;
  }
   /** Forces the initialization of the trust manager in the LDAPConnectionInteraction object. */
   private void forceTrustManagerInitialization()
   {
@@ -1412,8 +1390,7 @@
     }
     catch (ArgumentException ae)
     {
       throw new IllegalStateException("Argument parser is not parsed: "+ae,
           ae);
       throw new IllegalStateException("Argument parser is not parsed: " + ae, ae);
     }
   }
}
opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java
@@ -172,28 +172,28 @@
  @Override
  public WizardStep getNextWizardStep(WizardStep step) {
    Step nextStep = null;
    if (step != null && step.equals(Step.CONFIRM_UNINSTALL)) {
      nextStep = Step.PROGRESS;
    if (Step.CONFIRM_UNINSTALL.equals(step))
    {
      return Step.PROGRESS;
    }
    else if (Step.PROGRESS.equals(step))
    {
      nextStep = Step.FINISHED;
      return Step.FINISHED;
    }
    return nextStep;
    return null;
  }
  @Override
  public WizardStep getPreviousWizardStep(WizardStep step) {
    Step prevStep = null;
    if (step != null && step.equals(Step.PROGRESS)) {
      prevStep = Step.CONFIRM_UNINSTALL;
    if (Step.PROGRESS.equals(step))
    {
      return Step.CONFIRM_UNINSTALL;
    }
    else if (Step.FINISHED.equals(step))
    {
      prevStep = Step.PROGRESS;
      return Step.PROGRESS;
    }
    return prevStep;
    return null;
  }
  @Override
@@ -396,22 +396,20 @@
        }
        @Override
        public void backgroundTaskCompleted(UninstallData returnValue,
                                            Throwable throwable) {
        public void backgroundTaskCompleted(UninstallData returnValue, Throwable t) {
          qs.getDialog().workerFinished();
          if (throwable != null) {
            if (throwable instanceof UserDataException)
          if (t != null) {
            LocalizableMessage msg;
            if (t instanceof UserDataException)
            {
              qs.displayError(LocalizableMessage.raw(throwable.getLocalizedMessage()),
                    INFO_ERROR_TITLE.get());
              msg = LocalizableMessage.raw(t.getLocalizedMessage());
            }
            else
            {
              logger.warn(LocalizableMessage.raw("Error processing task: "+throwable,
                  throwable));
              qs.displayError(LocalizableMessage.raw(throwable.toString()),
                      INFO_ERROR_TITLE.get());
              logger.warn(LocalizableMessage.raw("Error processing task: " + t, t));
              msg = LocalizableMessage.raw(t.toString());
            }
            qs.displayError(msg, INFO_ERROR_TITLE.get());
          } else {
            conf = returnValue;
            if (conf.isADS() && conf.isReplicationServer())
@@ -540,10 +538,10 @@
  /**
   * Returns the ApplicationException that might occur during installation or
   * <CODE>null</CODE> if no exception occurred.
   * {@code null} if no exception occurred.
   *
   * @return the ApplicationException that might occur during installation or
   *         <CODE>null</CODE> if no exception occurred.
   *         {@code null} if no exception occurred.
   */
  @Override
  public ApplicationException getRunError() {
@@ -1087,13 +1085,11 @@
    }
    File[] rootFiles = null;
    if (installFiles == null)
    {
      rootFiles = new File(instancePath).listFiles();
    }
    else
    if (instanceFiles == null)
    else if (instanceFiles == null)
    {
      rootFiles = installFiles;
    }
@@ -1113,24 +1109,7 @@
      for (File f : rootFiles) {
        if (filter.accept(f)) {
          Installation installation = getInstallation();
          int relativeRatio;
          if (equalsOrDescendant(f, installation.getLibrariesDirectory())) {
            relativeRatio = 10;
          } else if (equalsOrDescendant(f, installation.getBinariesDirectory())) {
            relativeRatio = 5;
          } else if (equalsOrDescendant(f, installation.getConfigurationDirectory())) {
            relativeRatio = 5;
          } else if (equalsOrDescendant(f, installation.getBackupDirectory())) {
            relativeRatio = 20;
          } else if (equalsOrDescendant(f, installation.getLdifDirectory())) {
            relativeRatio = 20;
          } else if (equalsOrDescendant(f, installation.getDatabasesDirectory())) {
            relativeRatio = 50;
          } else if (equalsOrDescendant(f, installation.getLogsDirectory())) {
            relativeRatio = 30;
          } else {
            relativeRatio = 2;
          }
          int relativeRatio = getRelativeRatio(f, installation);
          cumulatedRatio.add(totalRatio);
          totalRatio += relativeRatio;
        } else {
@@ -1153,6 +1132,27 @@
    }
  }
  private int getRelativeRatio(File f, Installation installation)
  {
    if (equalsOrDescendant(f, installation.getLibrariesDirectory())) {
      return 10;
    } else if (equalsOrDescendant(f, installation.getBinariesDirectory())) {
      return 5;
    } else if (equalsOrDescendant(f, installation.getConfigurationDirectory())) {
      return 5;
    } else if (equalsOrDescendant(f, installation.getBackupDirectory())) {
      return 20;
    } else if (equalsOrDescendant(f, installation.getLdifDirectory())) {
      return 20;
    } else if (equalsOrDescendant(f, installation.getDatabasesDirectory())) {
      return 50;
    } else if (equalsOrDescendant(f, installation.getLogsDirectory())) {
      return 30;
    } else {
      return 2;
    }
  }
  /**
   * Deletes everything below the specified file.
   *
@@ -1184,13 +1184,7 @@
    }
    if (cfile.exists()) {
      if (cfile.isFile()) {
        if (filter != null) {
          if (filter.accept(cfile)) {
            delete(cfile);
          }
        } else {
          delete(cfile);
        }
        maybeDeleteFile(filter, cfile);
      } else {
        File[] children = cfile.listFiles();
        if (children != null) {
@@ -1199,13 +1193,7 @@
            deleteRecursively(element, filter);
          }
        }
        if (filter != null) {
          if (filter.accept(cfile)) {
            delete(cfile);
          }
        } else {
          delete(cfile);
        }
        maybeDeleteFile(filter, cfile);
      }
    } else {
      // Just tell that the file/directory does not exist.
@@ -1214,6 +1202,17 @@
    }
  }
  private void maybeDeleteFile(FileFilter filter, File cfile) throws ApplicationException
  {
    if (filter != null) {
      if (filter.accept(cfile)) {
        delete(cfile);
      }
    } else {
      delete(cfile);
    }
  }
  /**
   * Deletes the specified file.
   *
@@ -1221,24 +1220,22 @@
   * @throws ApplicationException if something goes wrong.
   */
  private void delete(File file) throws ApplicationException {
    boolean isFile = file.isFile();
    final boolean isFile = file.isFile();
    final String absolutePath = file.getAbsolutePath();
    if (isVerbose())
    {
      if (isFile) {
        notifyListeners(getFormattedWithPoints(
            INFO_PROGRESS_DELETING_FILE.get(file.getAbsolutePath())));
      } else {
        notifyListeners(getFormattedWithPoints(
            INFO_PROGRESS_DELETING_DIRECTORY.get(file.getAbsolutePath())));
      }
      LocalizableMessage msg = isFile
          ? INFO_PROGRESS_DELETING_FILE.get(absolutePath)
          : INFO_PROGRESS_DELETING_DIRECTORY.get(absolutePath);
      notifyListeners(getFormattedWithPoints(msg));
    }
    boolean delete = false;
    /*
     * Sometimes the server keeps some locks on the files.
     * This is dependent on the OS so there is no much we can do here.
     */
    boolean delete = false;
    int nTries = 5;
    for (int i = 0; i < nTries && !delete; i++) {
      delete = file.delete();
@@ -1252,12 +1249,9 @@
    }
    if (!delete) {
      LocalizableMessage errMsg;
      if (isFile) {
        errMsg = INFO_ERROR_DELETING_FILE.get(file.getAbsolutePath());
      } else {
        errMsg = INFO_ERROR_DELETING_DIRECTORY.get(file.getAbsolutePath());
      }
      LocalizableMessage errMsg = isFile
          ? INFO_ERROR_DELETING_FILE.get(absolutePath)
          : INFO_ERROR_DELETING_DIRECTORY.get(absolutePath);
      throw new ApplicationException(
          ReturnCode.FILE_SYSTEM_ACCESS_ERROR,
          errMsg, null);
@@ -1370,18 +1364,14 @@
   * @throws ApplicationException if something goes wrong.
   */
  private void disableWindowsService() throws ApplicationException {
    notifyListeners(getFormattedWithPoints(
            INFO_PROGRESS_DISABLING_WINDOWS_SERVICE.get()));
    notifyListeners(getFormattedWithPoints(INFO_PROGRESS_DISABLING_WINDOWS_SERVICE.get()));
    int code = disableService(System.out, System.err);
    LocalizableMessage errorMessage = INFO_ERROR_DISABLING_WINDOWS_SERVICE.get(
            getInstallationPath());
    switch (code) {
      case SERVICE_DISABLE_SUCCESS:
      case SERVICE_ALREADY_DISABLED:
        break;
      default:
        LocalizableMessage errorMessage = INFO_ERROR_DISABLING_WINDOWS_SERVICE.get(getInstallationPath());
        throw new ApplicationException(ReturnCode.WINDOWS_SERVICE_ERROR, errorMessage, null);
    }
    notifyListeners(getLineBreak());
@@ -1394,8 +1384,7 @@
  /**
   * Tries to start the server and launches a progress dialog.  This method
   * assumes that is being called from the event thread.
   * @return <CODE>true</CODE> if the server could be started and <CODE>
   * false</CODE> otherwise.
   * @return {@code true} if the server could be started, {@code false} otherwise.
   * @param frame the JFrame to be used as parent of the progress dialog.
   */
  private boolean startServer(JFrame frame)
@@ -1480,38 +1469,27 @@
        public TopologyCache processBackgroundTask() throws Throwable
        {
          logger.info(LocalizableMessage.raw("Loading Topology Cache in askForAuthentication"));
          ADSContext adsContext = new ADSContext(conn);
          TopologyCache cache = new TopologyCache(adsContext,
          TopologyCache cache = new TopologyCache(new ADSContext(conn),
              getTrustManager(), getConnectTimeout());
          cache.getFilter().setSearchMonitoringInformation(false);
          cache.reloadTopology();
          return cache;
        }
        @Override
        public void backgroundTaskCompleted(TopologyCache returnValue,
            Throwable throwable) {
        public void backgroundTaskCompleted(TopologyCache returnedCache, Throwable t) {
          qs.getDialog().workerFinished();
          if (throwable != null)
          if (t != null)
          {
            logger.warn(LocalizableMessage.raw("Throwable: "+throwable, throwable));
            if (throwable instanceof TopologyCacheException)
            {
              qs.displayError(
                      getMessage((TopologyCacheException) throwable),
                      INFO_ERROR_TITLE.get());
            }
            else
            {
              qs.displayError(
                  getThrowableMsg(INFO_BUG_MSG.get(), throwable),
                  INFO_ERROR_TITLE.get());
            }
            logger.warn(LocalizableMessage.raw("Throwable: "+t, t));
            LocalizableMessage msg = t instanceof TopologyCacheException
                ? getMessage((TopologyCacheException) t)
                : getThrowableMsg(INFO_BUG_MSG.get(), t);
            qs.displayError(msg, INFO_ERROR_TITLE.get());
            logger.info(LocalizableMessage.raw("Error was displayed"));
          }
          else
          {
            TopologyCache cache = returnValue;
            handleTopologyCache(qs, cache);
            handleTopologyCache(qs, returnedCache);
          }
        }
      };
@@ -1651,8 +1629,7 @@
  private void handleCertificateException(final QuickSetup qs,
      UserDataCertificateException ce, final TopologyCache cache)
  {
    CertificateDialog dlg =
      new CertificateDialog(qs.getDialog().getFrame(), ce);
    CertificateDialog dlg = new CertificateDialog(qs.getDialog().getFrame(), ce);
    dlg.pack();
    dlg.setVisible(true);
    if (dlg.getUserAnswer() != CertificateDialog.ReturnType.NOT_ACCEPTED)
@@ -1665,8 +1642,7 @@
      {
        logger.info(LocalizableMessage.raw("Accepting certificate presented by host "+host));
        getTrustManager().acceptCertificate(chain, authType, host);
        BackgroundTask<TopologyCache> worker =
          new BackgroundTask<TopologyCache>()
        BackgroundTask<TopologyCache> worker = new BackgroundTask<TopologyCache>()
        {
          @Override
          public TopologyCache processBackgroundTask() throws Throwable
@@ -1677,22 +1653,14 @@
            return cache;
          }
          @Override
          public void backgroundTaskCompleted(TopologyCache returnValue,
              Throwable throwable) {
          public void backgroundTaskCompleted(TopologyCache returnValue, Throwable t) {
            qs.getDialog().workerFinished();
            if (throwable != null)
            if (t != null)
            {
              if (throwable instanceof TopologyCacheException)
              {
                qs.displayError(getMessage((TopologyCacheException)throwable),
                    INFO_ERROR_TITLE.get());
              }
              else
              {
                qs.displayError(
                    getThrowableMsg(INFO_BUG_MSG.get(), throwable),
                    INFO_ERROR_TITLE.get());
              }
              LocalizableMessage msg = t instanceof TopologyCacheException
                  ? getMessage((TopologyCacheException) t)
                  : getThrowableMsg(INFO_BUG_MSG.get(), t);
              qs.displayError(msg, INFO_ERROR_TITLE.get());
            }
            else
            {
@@ -1780,7 +1748,7 @@
   * This method updates the replication in the remote server represented by
   * a given ServerProperty object.
   * It also tries to delete the server registration entry from the remote ADS
   * servers if the serverADSProperties object passed is not null.
   * servers if the serverADSProperties object passed is not {@code null}.
   * @param server the ServerDescriptor object representing the server where
   * we want to remove references to the server that we are trying to uninstall.
   * @param serverADSProperties the Map with the ADS properties of the server
@@ -2018,85 +1986,83 @@
   * Tells whether this ServerDescriptor object represents the server that we
   * are trying to uninstall or not.
   * @param server the ServerDescriptor object to analyze.
   * @return <CODE>true</CODE> if the ServerDescriptor object represents the
   * server that we are trying to uninstall and <CODE>false</CODE> otherwise.
   * @return {@code true} if the ServerDescriptor object represents the
   * server that we are trying to uninstall, {@code false} otherwise.
   */
  private boolean isServerToUninstall(ServerDescriptor server)
  {
    boolean isServerToUninstall = false;
    String path = (String)server.getAdsProperties().get(
        ADSContext.ServerProperty.INSTANCE_PATH);
    if (path == null)
    Boolean sameInstanceInstallPaths = isSameInstanceInstallPaths(server);
    return sameInstanceInstallPaths != null
        ? sameInstanceInstallPaths
        : isSamePort(server) && isSameHostName(server);
  }
  private Boolean isSameInstanceInstallPaths(ServerDescriptor server)
  {
    final String path = (String) server.getAdsProperties().get(ADSContext.ServerProperty.INSTANCE_PATH);
    return path != null
        ? new File(path).equals(Installation.getLocal().getRootDirectory())
        : null;
  }
  private boolean isSamePort(ServerDescriptor server)
  {
    try
    {
      // Compare the port of the URL we used.
      try
      final UninstallUserData uData = getUninstallUserData();
      final int port = uData.getLocalServerHostPort().getPort();
      final boolean isSecure = uData.isLocalServerSecure();
      final ServerDescriptor.ServerProperty property =
          isSecure ? ServerDescriptor.ServerProperty.ADMIN_PORT : ServerDescriptor.ServerProperty.LDAP_PORT;
      final List<?> ports = (List<?>) server.getServerProperties().get(property);
      if (ports != null)
      {
        UninstallUserData uData = getUninstallUserData();
        HostPort usedHostPort = uData.getLocalServerHostPort();
        boolean isSecure = uData.isLocalServerSecure();
        int port = usedHostPort.getPort();
        ServerDescriptor.ServerProperty property = isSecure
            ? ServerDescriptor.ServerProperty.ADMIN_PORT
            : ServerDescriptor.ServerProperty.LDAP_PORT;
        ArrayList<?> ports = (ArrayList<?>) server.getServerProperties().get(property);
        if (ports != null)
        {
          isServerToUninstall = ports.contains(port);
        }
        else
        {
          // This occurs if the instance could not be loaded.
          ADSContext.ServerProperty adsProperty = isSecure
              ? ADSContext.ServerProperty.ADMIN_PORT
              : ADSContext.ServerProperty.LDAP_PORT;
          String v = (String)server.getAdsProperties().get(adsProperty);
          if (v != null)
          {
            isServerToUninstall = v.equals(String.valueOf(port));
          }
        }
        return ports.contains(port);
      }
      catch (Throwable t)
      {
        logger.warn(LocalizableMessage.raw("Failing checking the port: "+t, t));
      }
      // This occurs if the instance could not be loaded.
      final ADSContext.ServerProperty adsProperty =
          isSecure ? ADSContext.ServerProperty.ADMIN_PORT : ADSContext.ServerProperty.LDAP_PORT;
      final String v = (String) server.getAdsProperties().get(adsProperty);
      return v != null ? v.equals(String.valueOf(port)) : false;
    }
    else
    catch (Throwable t)
    {
      File f = new File(path);
      isServerToUninstall =
        f.equals(Installation.getLocal().getRootDirectory());
      logger.warn(LocalizableMessage.raw("Failing checking the port: " + t, t));
      return false;
    }
  }
  private boolean isSameHostName(ServerDescriptor server)
  {
    // TODO: the host name comparison made here does not necessarily work in
    // all environments...
    final String hostName = server.getHostName();
    if (getUninstallUserData().getReferencedHostName().equals(hostName))
    {
      return true;
    }
    if (isServerToUninstall)
    try
    {
      // TODO: the host name comparison made here does not necessarily work in
      // all environments...
      String hostName = server.getHostName();
      boolean hostNameEquals =
        getUninstallUserData().getReferencedHostName().equals(hostName);
      try
      final InetAddress localAddress = InetAddress.getLocalHost();
      final InetAddress[] addresses = InetAddress.getAllByName(hostName);
      for (InetAddress address : addresses)
      {
        InetAddress localAddress = InetAddress.getLocalHost();
        InetAddress[] addresses = InetAddress.getAllByName(hostName);
        for (int i=0; i<addresses.length && !hostNameEquals; i++)
        if (localAddress.equals(address))
        {
          hostNameEquals = localAddress.equals(addresses[i]);
        }
        if (!hostNameEquals)
        {
          hostNameEquals =
            localAddress.getHostName().equalsIgnoreCase(hostName) ||
            localAddress.getCanonicalHostName().equalsIgnoreCase(hostName);
          return true;
        }
      }
      catch (Throwable t)
      {
        logger.warn(LocalizableMessage.raw("Failing checking host names: "+t, t));
      }
      isServerToUninstall = hostNameEquals;
      return localAddress.getHostName().equalsIgnoreCase(hostName)
          || localAddress.getCanonicalHostName().equalsIgnoreCase(hostName);
    }
    return isServerToUninstall;
    catch (Throwable t)
    {
      logger.warn(LocalizableMessage.raw("Failing checking host names: " + t, t));
      return false;
    }
  }
  /**