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

kenneth_suter
17.03.2007 ca07d757efc25246e050c37e0d0b479072c51f56
This commit cleans up the output for both the CLI and Web Start versions of the upgrader so that it conforms to Brian's proposal to limit messages to the progress text area and CLI output.  There is some new plumbing that affects but should not change other applications.

- StandardOutputSuppressor is introduced to help manage suppressing output to the command line which is necessary for server operations like starting the server which output text to standard out. This does not affect the output from showing up in the application log nor any OperationOutput returned from an operation.

- InProcessServerController suppresses server standard output for all operations.

- ServerController has input parameters for controlling whether or not standard output is suppressed since the installer and uninstaller output is still in the old style. Someday we can remove these when the output from those applications is made less verbose.

- Added a getFormattedError() similar to getFormattedDone() for creating an end-of-current-step marker when the current step does not go well.

1 files added
9 files modified
581 ■■■■ changed files
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties 10 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java 5 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java 54 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java 15 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java 122 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java 243 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java 2 ●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/StandardOutputSuppressor.java 108 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
@@ -172,12 +172,11 @@
   to a newer version.  Use of this tool assumes that you have already downloaded an \
   OpenDS install package (.zip) file.  You can also upgrade your server using \
   the Java Web Start version of this tool by visiting the OpenDS web site at opends.org.\n\n\
   Usage:  {0} {options} where {options} \
   include:\n\n\
   Usage:  {0} {options}\n        where {options} include:\n\
     -V, --version\n    Display Directory Server version information.\n\
     -f, --file\n  Specifies an existing OpenDS package (.zip) \
   file to which the\n  current build will be upgraded using the command line \
   \n  version of this tool\n
     -f, --file\n    Specifies an existing OpenDS package (.zip) \
   file to which the\n    current build will be upgraded using the command line \
   \n    version of this tool\n-?, -H , --help\n    Display this usage information.\n
upgrade-launcher-launching-gui=Launching graphical upgrade...
upgrade-launcher-launching-cli=Launching command line upgrade...
upgrade-launcher-gui-launched-failed=\n\nThe graphical upgrade launch \
@@ -848,6 +847,7 @@
progress-downloading=Downloading
progress-done=Done.
progress-points=.....
progress-error=Error.
progress-extracting=Extracting {0}
progress-configuring=Configuring Directory Server
progress-updating-certificates=Configuring Certificates
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
@@ -487,10 +487,9 @@
  protected void startServerWithoutConnectionHandlers()
  throws ApplicationException {
    try {
      ServerController control = new ServerController(this);
      ServerController control = new ServerController(getInstallation());
      if (getInstallation().getStatus().isServerRunning()) {
        control.stopServer();
        notifyListeners(formatter.getLineBreak());
        control.stopServer(true);
      }
      new InProcessServerController(getInstallation()).startServer(true);
    } catch (IOException e) {
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -152,11 +152,15 @@
    VERIFYING("summary-upgrade-verifying", 80),
    RECORDING_HISTORY("summary-upgrade-history", 85),
    STARTING_SERVER("summary-starting", 90),
    CLEANUP("summary-upgrade-cleanup", 90),
    STOPPING_SERVER("summary-stopping", 90),
    ABORT("summary-upgrade-abort", 95),
    RECORDING_HISTORY("summary-upgrade-history", 97),
    CLEANUP("summary-upgrade-cleanup", 99),
    ABORT("summary-upgrade-abort", 99),
    FINISHED_WITH_ERRORS("summary-upgrade-finished-with-errors", 100),
@@ -736,6 +740,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "extraction finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error extracting build file", e);
        throw e;
      }
@@ -750,6 +756,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "initialization finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error initializing upgrader", e);
        throw e;
      }
@@ -766,6 +774,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "check for schema customizations finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error calculating schema customizations", e);
        throw e;
      }
@@ -782,6 +792,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "check for config customizations finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO,
                "Error calculating config customizations", e);
        throw e;
@@ -797,6 +809,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "database backup finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error backing up databases", e);
        throw e;
      }
@@ -811,6 +825,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "filesystem backup finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error backing up files", e);
        throw e;
      }
@@ -826,6 +842,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "componnet upgrade finished");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO,
                "Error upgrading components", e);
        throw e;
@@ -865,6 +883,8 @@
                    formatter.getLineBreak());
            LOG.log(Level.INFO, "custom schema application finished");
          } catch (ApplicationException e) {
            notifyListeners(formatter.getFormattedError() +
                    formatter.getLineBreak());
            LOG.log(Level.INFO,
                    "Error applying schema customizations", e);
            throw e;
@@ -883,6 +903,8 @@
                    formatter.getLineBreak());
            LOG.log(Level.INFO, "custom config application finished");
          } catch (ApplicationException e) {
            notifyListeners(formatter.getFormattedError() +
                    formatter.getLineBreak());
            LOG.log(Level.INFO,
                    "Error applying configuration customizations", e);
            throw e;
@@ -924,6 +946,8 @@
                formatter.getLineBreak());
        LOG.log(Level.INFO, "upgrade verification complete");
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        LOG.log(Level.INFO, "Error verifying upgrade", e);
        throw e;
      }
@@ -933,24 +957,32 @@
      // verified at this point to in the unlikely event of an error,
      // we call this a warning instead of an error.
      try {
        ServerController control = getServerController();
        ServerController control = new ServerController(getInstallation());
        boolean serverRunning = getInstallation().getStatus().isServerRunning();
        boolean userRequestsStart = getUserData().getStartServer();
        if (userRequestsStart && !serverRunning) {
          try {
            LOG.log(Level.INFO, "starting server");
            control.startServer();
            notifyListeners(formatter.getLineBreak());
            setCurrentProgressStep(UpgradeProgressStep.STARTING_SERVER);
            control.startServer(true);
            notifyListeners(formatter.getFormattedDone() +
                    formatter.getLineBreak());
          } catch (ApplicationException e) {
            notifyListeners(formatter.getFormattedError() +
                    formatter.getLineBreak());
            LOG.log(Level.INFO, "error starting server");
            this.runWarning = e;
          }
        } else if (!userRequestsStart && serverRunning) {
          try {
            LOG.log(Level.INFO, "stopping server");
            control.stopServer();
            notifyListeners(formatter.getLineBreak());
            setCurrentProgressStep(UpgradeProgressStep.STOPPING_SERVER);
            control.stopServer(true);
            notifyListeners(formatter.getFormattedDone() +
                    formatter.getLineBreak());
          } catch (ApplicationException e) {
            notifyListeners(formatter.getFormattedError() +
                    formatter.getLineBreak());
            LOG.log(Level.INFO, "error stopping server");
            this.runWarning = e;
          }
@@ -1013,6 +1045,8 @@
                Utils.getPath(getInstallation().getHistoryLogFile()) +
                " for upgrade history" + formatter.getLineBreak());
      } catch (ApplicationException e) {
        notifyListeners(formatter.getFormattedError() +
                formatter.getLineBreak());
        System.err.print("Error cleaning up after upgrade: " +
                e.getLocalizedMessage());
      }
@@ -1158,8 +1192,8 @@
        // Restart the server after putting the files
        // back like we found them.
        getServerController().stopServer();
        getServerController().startServer();
        getServerController().stopServer(true);
        getServerController().startServer(true);
      } catch (IOException e) {
        LOG.log(Level.INFO, "Error getting backup directory", e);
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java
@@ -42,6 +42,7 @@
public class HtmlProgressMessageFormatter implements ProgressMessageFormatter
{
  private String doneHtml;
  private String errorHtml;
  /**
   * The line break in HTML.
@@ -210,6 +211,20 @@
  }
  /**
   * Returns the HTML representation of the 'Error' text string.
   * @return the HTML representation of the 'Error' text string.
   */
  public String getFormattedError() {
    if (errorHtml == null)
    {
      String html = getHtml(getMsg("progress-error"));
      errorHtml = UIFactory.applyFontToHtml(html,
          UIFactory.PROGRESS_ERROR_FONT);
    }
    return errorHtml;
  }
  /**
   * Returns the HTML representation of the argument text to which we add
   * points.  For instance if we pass as argument 'Configuring Server' the
   * return value will be 'Configuring Server <B>.....</B>'.
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java
@@ -146,9 +146,14 @@
   */
  public void stopServer() {
    LOG.log(Level.INFO, "Shutting down in process server");
    org.opends.server.core.DirectoryServer.shutDown(
            ServerController.class.getName(),
            "quicksetup requests shutdown");
    StandardOutputSuppressor.suppress();
    try {
      org.opends.server.core.DirectoryServer.shutDown(
              ServerController.class.getName(),
              "quicksetup requests shutdown");
    } finally {
      StandardOutputSuppressor.unsuppress();
    }
  }
  /**
@@ -167,69 +172,78 @@
  public OperationOutput startServer()
          throws
          org.opends.server.types.InitializationException,
          org.opends.server.config.ConfigException
  {
          org.opends.server.config.ConfigException {
    OperationOutput output = new OperationOutput();
    // Bootstrap and start the Directory Server.
    LOG.log(Level.FINER, "Bootstrapping directory server");
    org.opends.server.core.DirectoryServer directoryServer =
            org.opends.server.core.DirectoryServer.getInstance();
    directoryServer.bootstrapServer();
    String configClass = "org.opends.server.extensions.ConfigFileHandler";
    String configPath = Utils.getPath(
            installation.getCurrentConfigurationFile());
    directoryServer.initializeConfiguration(configClass, configPath);
    StandardOutputSuppressor.suppress();
    try {
      DebugLogPublisher startupDebugPublisher =
              TextDebugLogPublisher.getStartupTextDebugPublisher(
                      new ServerControllerTextWriter(output) {
                        void storeRecord(String record, OperationOutput output)
                        {
                          output.addDebugMessage(record);
                        }
                      });
      DebugLogger.removeAllDebugLogPublishers();
      DebugLogger.addDebugLogPublisher(DN.NULL_DN,
              startupDebugPublisher);
      try {
      ErrorLogPublisher startupErrorPublisher =
              TextErrorLogPublisher.getStartupTextErrorPublisher(
                      new ServerControllerTextWriter(output) {
                        void storeRecord(String record, OperationOutput output)
                        {
                          output.addErrorMessage(record);
                        }
                      });
        DebugLogPublisher startupDebugPublisher =
                TextDebugLogPublisher.getStartupTextDebugPublisher(
                        new ServerControllerTextWriter(output) {
                          void storeRecord(String record,
                                           OperationOutput output) {
                            LOG.log(Level.INFO, "server start (debug log): " +
                                    record);
                            output.addDebugMessage(record);
                          }
                        });
        DebugLogger.addDebugLogPublisher(DN.NULL_DN,
                startupDebugPublisher);
      ErrorLogger.removeAllErrorLogPublishers();
      ErrorLogger.addErrorLogPublisher(DN.NULL_DN,
              startupErrorPublisher);
        ErrorLogPublisher startupErrorPublisher =
                TextErrorLogPublisher.getStartupTextErrorPublisher(
                        new ServerControllerTextWriter(output) {
                          void storeRecord(String record,
                                           OperationOutput output) {
                            LOG.log(Level.INFO, "server start (error log): " +
                                    record);
                            output.addErrorMessage(record);
                          }
                        });
        ErrorLogger.addErrorLogPublisher(DN.NULL_DN,
                startupErrorPublisher);
        AccessLogPublisher startupAccessPublisher =
                TextAccessLogPublisher.getStartupTextAccessPublisher(
                        new ServerControllerTextWriter(output) {
                          void storeRecord(String record,
                                           OperationOutput output) {
                            LOG.log(Level.INFO, "server start (access log): " +
                                    record);
                            output.addAccessMessage(record);
                          }
                        });
        AccessLogger.addAccessLogPublisher(DN.NULL_DN,
                startupAccessPublisher);
      AccessLogPublisher startupAccessPublisher =
              TextAccessLogPublisher.getStartupTextAccessPublisher(
                      new ServerControllerTextWriter(output) {
                        void storeRecord(String record, OperationOutput output)
                        {
                          output.addAccessMessage(record);
                        }
                      });
      } catch (Exception e) {
        LOG.log(Level.INFO, "Error installing test log publishers: " +
                e.toString());
      }
      AccessLogger.removeAllAccessLogPublishers();
      AccessLogger.addAccessLogPublisher(DN.NULL_DN,
              startupAccessPublisher);
      org.opends.server.core.DirectoryServer directoryServer =
              org.opends.server.core.DirectoryServer.getInstance();
    } catch (Exception e) {
      LOG.log(Level.INFO, "Error installing test log publishers: " +
              e.toString());
      // Bootstrap and start the Directory Server.
      LOG.log(Level.FINER, "Bootstrapping directory server");
      directoryServer.bootstrapServer();
      LOG.log(Level.FINER, "Initializing configuration");
      String configClass = "org.opends.server.extensions.ConfigFileHandler";
      String configPath = Utils.getPath(
              installation.getCurrentConfigurationFile());
      directoryServer.initializeConfiguration(configClass, configPath);
      LOG.log(Level.FINER, "Invoking start server");
      directoryServer.startServer();
    } finally {
      StandardOutputSuppressor.unsuppress();
    }
    LOG.log(Level.FINER, "Invoking start server");
    directoryServer.startServer();
    return output;
  }
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java
@@ -38,6 +38,7 @@
implements ProgressMessageFormatter
{
  private String doneText;
  private String errorText;
  /**
   * The line break in plain text.
@@ -167,6 +168,19 @@
  }
  /**
   * Returns the plain text representation of the 'Error' text string.
   * @return the plain text representation of the 'Error' text string.
   */
  public String getFormattedError()
  {
    if (errorText == null)
    {
      errorText = getMsg("progress-error");
    }
    return errorText;
  }
  /**
   * Returns the plain text representation of the argument text to which we add
   * points.  For instance if we pass as argument 'Configuring Server' the
   * return value will be 'Configuring Server .....'.
@@ -263,7 +277,7 @@
   * have something of type:
   * key=value
   *
   * @see ResourceProvider.getMsg(String key)
   * @see ResourceProvider#getMsg(String key)
   * @param key the key in the properties file.
   * @return the value associated to the key in the properties file.
   * properties file.
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java
@@ -112,6 +112,12 @@
  public String getFormattedDone();
  /**
   * Returns the formatted representation of the 'Error' text string.
   * @return the formatted representation of the 'Error' text string.
   */
  public String getFormattedError();
  /**
   * Returns the formatted representation of the argument text to which we add
   * points.  For instance if we pass as argument 'Configuring Server' the
   * return value will be 'Configuring Server .....'.
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
@@ -60,7 +60,7 @@
   * @param application to use for notifications
   */
  public ServerController(Application application) {
    this(application, application.getInstallation());
    wqthis(application, application.getInstallation());
  }
  /**
@@ -92,128 +92,166 @@
   * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
   */
  public void stopServer() throws ApplicationException {
    if (application != null) {
      application.notifyListeners(
              application.getFormattedProgress(
                      application.getMsg("progress-stopping")) +
                      application.getLineBreak());
    }
    LOG.log(Level.INFO, "stopping server");
    stopServer(false);
  }
    ArrayList<String> argList = new ArrayList<String>();
    argList.add(Utils.getPath(installation.getServerStopCommandFile()));
    String[] args = new String[argList.size()];
    argList.toArray(args);
    ProcessBuilder pb = new ProcessBuilder(args);
    Map<String, String> env = pb.environment();
    env.put("JAVA_HOME", System.getProperty("java.home"));
    /* Remove JAVA_BIN to be sure that we use the JVM running the uninstaller
     * JVM to stop the server.
     */
    env.remove("JAVA_BIN");
  /**
   * This methods stops the server.
   *
   * @param suppressOutput boolean indicating that ouput to standard output
   *                       streams from the server should be suppressed.
   * @throws org.opends.quicksetup.ApplicationException
   *          if something goes wrong.
   */
  public void stopServer(boolean suppressOutput) throws ApplicationException {
    if (suppressOutput && !StandardOutputSuppressor.isSuppressed()) {
      StandardOutputSuppressor.suppress();
    }
    try {
      Process process = pb.start();
      if (application != null) {
        application.notifyListeners(
                application.getFormattedProgress(
                        application.getMsg("progress-stopping")) +
                        application.getLineBreak());
      }
      LOG.log(Level.INFO, "stopping server");
      BufferedReader err =
              new BufferedReader(
                      new InputStreamReader(process.getErrorStream()));
      BufferedReader out =
              new BufferedReader(
                      new InputStreamReader(process.getInputStream()));
      ArrayList<String> argList = new ArrayList<String>();
      argList.add(Utils.getPath(installation.getServerStopCommandFile()));
      String[] args = new String[argList.size()];
      argList.toArray(args);
      ProcessBuilder pb = new ProcessBuilder(args);
      Map<String, String> env = pb.environment();
      env.put("JAVA_HOME", System.getProperty("java.home"));
      /* Remove JAVA_BIN to be sure that we use the JVM running the uninstaller
      * JVM to stop the server.
      */
      env.remove("JAVA_BIN");
      /* Create these objects to resend the stop process output to the details
       * area.
       */
      new StopReader(err, true);
      new StopReader(out, false);
      try {
        Process process = pb.start();
      int returnValue = process.waitFor();
        BufferedReader err =
                new BufferedReader(
                        new InputStreamReader(process.getErrorStream()));
        BufferedReader out =
                new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
      int clientSideError =
              org.opends.server.protocols.ldap.
                      LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR;
      if ((returnValue == clientSideError) || (returnValue == 0)) {
        if (Utils.isWindows()) {
          /*
           * Sometimes the server keeps some locks on the files.
           * TODO: remove this code once stop-ds returns properly when server
           * is stopped.
           */
          int nTries = 10;
          boolean stopped = false;
        /* Create these objects to resend the stop process output to the details
        * area.
        */
        new StopReader(err, true);
        new StopReader(out, false);
          for (int i = 0; i < nTries && !stopped; i++) {
            stopped = !CurrentInstallStatus.isServerRunning(
                    installation.getLocksDirectory());
            if (!stopped) {
              if (application != null) {
                String msg =
                        application.getFormattedLog(
                                application.getMsg(
                                        "progress-server-waiting-to-stop")) +
                                application.getLineBreak();
                application.notifyListeners(msg);
              }
              LOG.log(Level.FINE, "waiting for server to stop");
              try {
                Thread.sleep(5000);
              }
              catch (Exception ex) {
        int returnValue = process.waitFor();
        int clientSideError =
                org.opends.server.protocols.ldap.
                        LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR;
        if ((returnValue == clientSideError) || (returnValue == 0)) {
          if (Utils.isWindows()) {
            /*
            * Sometimes the server keeps some locks on the files.
            * TODO: remove this code once stop-ds returns properly when server
            * is stopped.
            */
            int nTries = 10;
            boolean stopped = false;
            for (int i = 0; i < nTries && !stopped; i++) {
              stopped = !CurrentInstallStatus.isServerRunning(
                      installation.getLocksDirectory());
              if (!stopped) {
                if (application != null) {
                  String msg =
                          application.getFormattedLog(
                                  application.getMsg(
                                          "progress-server-waiting-to-stop")) +
                                  application.getLineBreak();
                  application.notifyListeners(msg);
                }
                LOG.log(Level.FINE, "waiting for server to stop");
                try {
                  Thread.sleep(5000);
                }
                catch (Exception ex) {
                }
              }
            }
          }
          if (!stopped) {
            returnValue = -1;
            if (!stopped) {
              returnValue = -1;
            }
          }
        }
      }
      if (returnValue == clientSideError) {
        if (application != null) {
          String msg = application.getLineBreak() +
                  application.getFormattedLog(
                          application.getMsg(
                                  "progress-server-already-stopped")) +
                  application.getLineBreak();
          application.notifyListeners(msg);
        if (returnValue == clientSideError) {
          if (application != null) {
            String msg = application.getLineBreak() +
                    application.getFormattedLog(
                            application.getMsg(
                                    "progress-server-already-stopped")) +
                    application.getLineBreak();
            application.notifyListeners(msg);
          }
          LOG.log(Level.INFO, "server already stopped");
        } else if (returnValue != 0) {
          /*
          * The return code is not the one expected, assume the server could
          * not be stopped.
          */
          throw new ApplicationException(ApplicationException.Type.STOP_ERROR,
                  ResourceProvider.getInstance().getMsg(
                          "error-stopping-server-code",
                          String.valueOf(returnValue)),
                  null);
        } else {
          if (application != null) {
            String msg = application.getFormattedLog(
                    application.getMsg("progress-server-stopped"));
            application.notifyListeners(msg);
          }
          LOG.log(Level.INFO, "server stopped");
        }
        LOG.log(Level.INFO, "server already stopped");
      } else if (returnValue != 0) {
        /*
         * The return code is not the one expected, assume the server could
         * not be stopped.
         */
      } catch (Exception e) {
        throw new ApplicationException(ApplicationException.Type.STOP_ERROR,
                ResourceProvider.getInstance().getMsg(
                        "error-stopping-server-code",
                        String.valueOf(returnValue)),
                null);
      } else {
        if (application != null) {
          String msg = application.getFormattedLog(
                  application.getMsg("progress-server-stopped"));
          application.notifyListeners(msg);
        }
        LOG.log(Level.INFO, "server stopped");
                getThrowableMsg("error-stopping-server", e), e);
      }
    } catch (Exception e) {
      throw new ApplicationException(ApplicationException.Type.STOP_ERROR,
              getThrowableMsg("error-stopping-server", e), e);
    } finally {
      if (suppressOutput && StandardOutputSuppressor.isSuppressed()) {
        StandardOutputSuppressor.unsuppress();
      }
    }
  }
  /**
   * This methods starts the server.
   *
   * @return OperationOutput object containing output from the start server
   * command invocation.
   * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
   */
  public OperationOutput startServer() throws ApplicationException {
    return startServer(true);
    return startServer(true, false);
  }
  /**
   * This methods starts the server.
   * @param suppressOutput boolean indicating that ouput to standard output
   * streams from the server should be suppressed.
   * @return OperationOutput object containing output from the start server
   * command invocation.
   * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
   */
  public OperationOutput startServer(boolean suppressOutput)
          throws ApplicationException
  {
    return startServer(true, suppressOutput);
  }
  /**
@@ -222,12 +260,20 @@
   * connect to the server after starting to verify that it is listening.
   * @return OperationOutput object containing output from the start server
   * command invocation.
   * @return boolean indicating that ouput to standard output streams
   * from the server should be suppressed.
   * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
   */
  private OperationOutput startServer(boolean verify)
  private OperationOutput startServer(boolean verify, boolean suppressOuput)
          throws ApplicationException
  {
    OperationOutput output = new OperationOutput();
    if (suppressOuput && !StandardOutputSuppressor.isSuppressed()) {
      StandardOutputSuppressor.suppress();
    }
    try {
    if (application != null) {
      application.notifyListeners(
              application.getFormattedProgress(
@@ -394,6 +440,11 @@
              getThrowableMsg("error-starting-server", ioe),
              ioe);
    }
  } finally {
      if (suppressOuput && StandardOutputSuppressor.isSuppressed()) {
        StandardOutputSuppressor.unsuppress();
      }
  }
    return output;
  }
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java
@@ -76,7 +76,7 @@
    try {
      control = new InProcessServerController(installation);
      if (installation.getStatus().isServerRunning()) {
        new ServerController(installation).stopServer();
        new ServerController(installation).stopServer(true);
      }
      OperationOutput op = control.startServer(true);
      errors = op.getErrorMessages(UNHEALTHY_SERVER_LOG_REGEX);
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/StandardOutputSuppressor.java
New file
@@ -0,0 +1,108 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2007 Sun Microsystems, Inc.
 */
package org.opends.quicksetup.util;
import java.io.OutputStream;
import java.io.IOException;
import java.io.PrintStream;
/**
 * Tool for suppressing and unsuppressing output to standard
 * output streams.
 */
public class StandardOutputSuppressor {
  static private Token token = null;
  /**
   * Object to return to this class for
   * unsupressing output.
   */
  static private class Token {
    PrintStream out;
    PrintStream err;
  }
  /**
   * Suppresses output to the standard output
   * streams.
   */
  static synchronized public void suppress() {
    if (token == null) {
      token = new Token();
      token.out = System.out;
      token.err = System.err;
      System.out.flush();
      System.err.flush();
      System.setOut(new PrintStream(new NullOutputStream()));
      System.setErr(new PrintStream(new NullOutputStream()));
    } else {
      throw new IllegalStateException("Standard streams currently suppressed");
    }
  }
  /**
   * Unsupresses the standard output streams.  Following a call to this
   * method System.out and System.err will point to the descriptor prior
   * to calling <code>suppress()</code>.
   */
  static synchronized public void unsuppress() {
    if (token != null) {
      System.setOut(token.out);
      System.setErr(token.err);
      token = null;
    } else {
      throw new IllegalStateException(
              "Standard streams not currently suppressed");
    }
  }
  /**
   * Checks whether or not this class has suppressed standard out streams.
   * @return boolean where true indicates output is suppressed
   */
  static public boolean isSuppressed() {
    return token != null;
  }
  /**
   * PrintWriter for suppressing stream.
   */
  static private class NullOutputStream extends OutputStream {
    /**
     * {@inheritDoc}
     */
    public void write(int b) throws IOException {
      // do nothing;
    }
  }
}