From 92ce4633648268f705f2d0b439425bcf8d5ec40f Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Mon, 14 May 2007 15:21:19 +0000
Subject: [PATCH] This commit does the following:

---
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java              |   50 ++--
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java       |  107 +++++++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java            |    9 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/OperationOutput.java           |   94 +++++++-
 opendj-sdk/opends/build.xml                                                                |   17 +
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java |  225 ++++++++++++++++++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java              |    3 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java          |  108 +-------
 8 files changed, 484 insertions(+), 129 deletions(-)

diff --git a/opendj-sdk/opends/build.xml b/opendj-sdk/opends/build.xml
index 7507f64..7d8ce6e 100644
--- a/opendj-sdk/opends/build.xml
+++ b/opendj-sdk/opends/build.xml
@@ -530,7 +530,24 @@
       <include name="**/org/opends/server/util/CertificateManager.java"/>
       <include name="**/org/opends/server/util/DynamicConstants.java"/>
       <include name="**/org/opends/server/types/OperatingSystem.java"/>
+      <include name="**/org/opends/server/loggers/debug/TextDebugLogPublisher.java"/>
+      <include name="**/org/opends/server/loggers/debug/DebugLogger.java"/>
+      <include name="**/org/opends/server/loggers/TextErrorLogPublisher.java"/>
+      <include name="**/org/opends/server/loggers/TextWriter.java"/>
+      <include name="**/org/opends/server/loggers/ErrorLogger.java"/>
+      <include name="**/org/opends/server/loggers/TextAccessLogPublisher.java"/>
+      <include name="**/org/opends/server/loggers/AccessLogger.java"/>
+      <include name="**/org/opends/server/types/DN.java"/>
+      <include name="**/org/opends/server/api/DebugLogPublisher.java"/>
+      <include name="**/org/opends/server/api/ErrorLogPublisher.java"/>
+      <include name="**/org/opends/server/api/AccessLogPublisher.java"/>
       <compilerarg value="-Xlint:all" />
+      <classpath>
+        <fileset dir="${lib.dir}">
+          <include name="*.jar" />
+        </fileset>
+        <pathelement path="${classes.dir}"/>
+      </classpath>
     </javac>
     <javac srcdir="${quicksetup.src.dir}" destdir="${quicksetup.classes.dir}"
          debug="on" debuglevel="${build.debuglevel}" source="1.5"
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
index 7946edc..0869d69 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -49,6 +49,7 @@
 import org.opends.admin.ads.SuffixDescriptor;
 import org.opends.quicksetup.ui.*;
 import org.opends.quicksetup.util.Utils;
+import org.opends.quicksetup.util.InProcessServerController;
 import org.opends.quicksetup.*;
 import org.opends.server.util.CertificateManager;
 import org.opends.quicksetup.installer.ui.DataOptionsPanel;
@@ -1204,7 +1205,7 @@
       }
       if (startedServer)
       {
-        getServerController().stopServerInProcess();
+        new InProcessServerController(getInstallation()).stopServer();
       }
     }
   }
@@ -1966,7 +1967,7 @@
    * panel and update the UserInstallData object according to that content.
    *
    * @throws
-   *           UserInstallDataException if the data provided by the user is not
+   *           UserDataException if the data provided by the user is not
    *           valid.
    *
    */
@@ -2038,7 +2039,7 @@
    * panel and update the UserInstallData object according to that content.
    *
    * @throws
-   *           UserInstallDataException if the data provided by the user is not
+   *           UserDataException if the data provided by the user is not
    *           valid.
    *
    */
@@ -2099,7 +2100,7 @@
    * Validate the data provided by the user in the new suffix data options panel
    * and update the UserInstallData object according to that content.
    *
-   * @throws UserInstallDataException if the data provided by the user is not
+   * @throws UserDataException if the data provided by the user is not
    *           valid.
    *
    */
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
index 6050545..0bf42ce 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
@@ -29,6 +29,7 @@
 
 import org.opends.quicksetup.*;
 import org.opends.quicksetup.util.ServerController;
+import org.opends.quicksetup.util.InProcessServerController;
 import org.opends.quicksetup.webstart.WebStartDownloader;
 
 import javax.swing.*;
@@ -490,7 +491,7 @@
       if (getInstallation().getStatus().isServerRunning()) {
         control.stopServer();
       }
-      control.startServerInProcess(true);
+      new InProcessServerController(getInstallation()).startServer(true);
     } catch (IOException e) {
       String msg = "Failed to determine server state: " +
       e.getLocalizedMessage();
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index 75c1576..dd70c12 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -31,11 +31,7 @@
 import org.opends.quicksetup.upgrader.ui.WelcomePanel;
 import org.opends.quicksetup.upgrader.ui.ChooseVersionPanel;
 import org.opends.quicksetup.upgrader.ui.UpgraderReviewPanel;
-import org.opends.quicksetup.util.Utils;
-import org.opends.quicksetup.util.FileManager;
-import org.opends.quicksetup.util.ServerController;
-import org.opends.quicksetup.util.ZipExtractor;
-import org.opends.quicksetup.util.OperationOutput;
+import org.opends.quicksetup.util.*;
 import org.opends.quicksetup.ui.*;
 
 import java.awt.event.WindowEvent;
@@ -51,6 +47,7 @@
 
 import static org.opends.quicksetup.Installation.*;
 
+
 import javax.swing.*;
 
 /**
@@ -209,7 +206,6 @@
   static private final String SYS_PROP_NO_ABORT =
           "org.opends.upgrader.Upgrader.NoAbort";
 
-
   // Root files that will be ignored during backup
   static private final String[] ROOT_FILES_TO_IGNORE_DURING_BACKUP = {
           CHANGELOG_PATH_RELATIVE, // changelogDb
@@ -950,7 +946,7 @@
 
         try {
           LOG.log(Level.INFO, "stopping server");
-          getServerController().stopServerInProcess();
+          new InProcessServerController(getInstallation()).stopServer();
           LOG.log(Level.INFO, "server stopped");
         } catch (Throwable t) {
           LOG.log(Level.INFO, "Error stopping server", t);
@@ -1134,27 +1130,27 @@
    */
   private void checkServerHealth() throws ApplicationException {
     Installation installation = getInstallation();
-    ServerController control = new ServerController(installation);
+    ServerHealthChecker healthChecker = new ServerHealthChecker(installation);
     try {
-      if (installation.getStatus().isServerRunning()) {
-        control.stopServer();
-      }
-      OperationOutput op = control.startServer();
-      List<String> errors = op.getErrors();
-      if (errors != null) {
+      healthChecker.checkServer();
+      List<String> problems = healthChecker.getProblemMessages();
+      if (problems != null && problems.size() > 0) {
         throw new ApplicationException(
                 ApplicationException.Type.APPLICATION,
-                "The server currently starts with errors which must" +
-                        "be resolved before an upgrade can occur: " +
-                        Utils.listToString(errors, " "),
+                "The server currently starts with errors which must " +
+                        "be resolved before an upgrade can occur: \n\n" +
+                        Utils.listToString(problems, "\n\n"),
                 null);
       }
-      control.stopServer();
     } catch (Exception e) {
-      throw new ApplicationException(ApplicationException.Type.APPLICATION,
-              "Server health check failed.  Please resolve the following " +
-                      "before running the upgrade " +
-                      "tool: " + e.getLocalizedMessage(), e);
+      if (e instanceof ApplicationException) {
+        throw (ApplicationException)e;
+      } else {
+        throw new ApplicationException(ApplicationException.Type.APPLICATION,
+                "Server health check failed.  Please resolve the following " +
+                        "before running the upgrade " +
+                        "tool: " + e.getLocalizedMessage(), e);
+      }
     }
   }
 
@@ -1224,13 +1220,15 @@
   }
 
   private void verifyUpgrade() throws ApplicationException {
-    ServerController sc = new ServerController(getInstallation());
-    OperationOutput op = sc.startServer();
-    if (op.getErrors() != null) {
+    Installation installation = getInstallation();
+    ServerHealthChecker healthChecker = new ServerHealthChecker(installation);
+    healthChecker.checkServer();
+    List<String> errors = healthChecker.getProblemMessages();
+    if (errors != null && errors.size() > 0) {
       throw new ApplicationException(ApplicationException.Type.APPLICATION,
               "Upgraded server failed verification test by signaling " +
                       "errors during startup: " +
-                      Utils.listToString(op.getErrors(), " "), null);
+                      Utils.listToString(errors, " "), null);
     }
   }
 
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java
new file mode 100644
index 0000000..3c64fd3
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/InProcessServerController.java
@@ -0,0 +1,225 @@
+/*
+ * 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 org.opends.quicksetup.*;
+import org.opends.server.loggers.debug.TextDebugLogPublisher;
+import org.opends.server.loggers.debug.DebugLogger;
+import org.opends.server.loggers.TextErrorLogPublisher;
+import org.opends.server.loggers.TextWriter;
+import org.opends.server.loggers.ErrorLogger;
+import org.opends.server.loggers.TextAccessLogPublisher;
+import org.opends.server.loggers.AccessLogger;
+import org.opends.server.types.DN;
+import org.opends.server.api.DebugLogPublisher;
+import org.opends.server.api.ErrorLogPublisher;
+import org.opends.server.api.AccessLogPublisher;
+
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+/**
+ * Class used to manipulate an OpenDS server in the same JVM process as
+ * the client class.
+ */
+public class InProcessServerController {
+
+  static private final Logger LOG =
+          Logger.getLogger(InProcessServerController.class.getName());
+
+  private Installation installation;
+
+  /**
+   * Creates a new instance that will operate on <code>application</code>'s
+   * installation.
+   * @param installation representing the server instance to control
+   */
+  public InProcessServerController(Installation installation) {
+    this.installation = installation;
+  }
+
+  /**
+   * Starts the directory server within this process.
+   * @param disableConnectionHandlers boolean that when true starts the
+   * the server mode that is otherwise up and running but will not accept any
+   * connections from external clients (i.e., does not create or initialize the
+   * connection handlers). This could be useful, for example, in an upgrade mode
+   * where it might be helpful to start the server but don't want it to appear
+   * externally as if the server is online without connection handlers
+   * listening.
+   * @return OperationOutput object containing output from the start server
+   * command invocation.
+   * @throws org.opends.server.config.ConfigException
+   *         If there is a problem with the Directory Server
+   *         configuration that prevents a critical component
+   *         from being instantiated.
+   *
+   * @throws org.opends.server.types.InitializationException
+   *         If some other problem occurs while
+   *         attempting to initialize and start the
+   *         Directory Server.
+   */
+  public OperationOutput startServer(boolean disableConnectionHandlers)
+          throws
+          org.opends.server.types.InitializationException,
+          org.opends.server.config.ConfigException {
+    LOG.log(Level.INFO, "Starting in process server with connection handlers " +
+            (disableConnectionHandlers ? "disabled" : "enabled"));
+    System.setProperty(
+            "org.opends.server.DisableConnectionHandlers",
+            disableConnectionHandlers ? "true" : null);
+    return startServer();
+  }
+
+  /**
+   * Stops a server that had been running 'in process'.
+   */
+  public void stopServer() {
+    LOG.log(Level.INFO, "Shutting down in process server");
+    org.opends.server.core.DirectoryServer.shutDown(
+            ServerController.class.getName(),
+            "quicksetup requests shutdown");
+  }
+
+  /**
+   * Starts the OpenDS server in this process.
+   * @return OperationOutput with the results of the operation.
+   * @throws org.opends.server.config.ConfigException
+   *  If there is a problem with the Directory Server
+   *  configuration that prevents a critical component
+   *  from being instantiated.
+   *
+   * @throws org.opends.server.types.InitializationException
+   *  If some other problem occurs while
+   *  attempting to initialize and start the
+   *  Directory Server.
+   */
+  public OperationOutput startServer()
+          throws
+          org.opends.server.types.InitializationException,
+          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);
+
+    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);
+
+      ErrorLogPublisher startupErrorPublisher =
+              TextErrorLogPublisher.getStartupTextErrorPublisher(
+                      new ServerControllerTextWriter(output) {
+                        void storeRecord(String record, OperationOutput output)
+                        {
+                          output.addErrorMessage(record);
+                        }
+                      });
+
+      ErrorLogger.removeAllErrorLogPublishers();
+      ErrorLogger.addErrorLogPublisher(DN.NULL_DN,
+              startupErrorPublisher);
+
+      AccessLogPublisher startupAccessPublisher =
+              TextAccessLogPublisher.getStartupTextAccessPublisher(
+                      new ServerControllerTextWriter(output) {
+                        void storeRecord(String record, OperationOutput output)
+                        {
+                          output.addAccessMessage(record);
+                        }
+                      });
+
+      AccessLogger.removeAllAccessLogPublishers();
+      AccessLogger.addAccessLogPublisher(DN.NULL_DN,
+              startupAccessPublisher);
+
+    } catch (Exception e) {
+      LOG.log(Level.INFO, "Error installing test log publishers: " +
+              e.toString());
+    }
+
+    LOG.log(Level.FINER, "Invoking start server");
+    directoryServer.startServer();
+
+    return output;
+  }
+
+  /**
+   * Pushes messages published by the server loggers into OperationOutput.
+   */
+  private abstract class ServerControllerTextWriter implements TextWriter {
+
+    private int bytesWritten = 0;
+    private OperationOutput output = null;
+
+    abstract void storeRecord(String record, OperationOutput output);
+
+    ServerControllerTextWriter(OperationOutput output) {
+      this.output = output;
+    }
+
+    public void writeRecord(String record) {
+      if (record != null) {
+        bytesWritten += bytesWritten;
+        storeRecord(record, output);
+      }
+    }
+
+    public void flush() {
+      // do nothing;
+    }
+
+    public void shutdown() {
+      // do nothing;
+    }
+
+    public long getBytesWritten() {
+      return bytesWritten;
+    }
+  }
+
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/OperationOutput.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/OperationOutput.java
index 65c7d3e..8daec2d 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/OperationOutput.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/OperationOutput.java
@@ -28,6 +28,8 @@
 package org.opends.quicksetup.util;
 
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
 
 /**
  * Contains information about an operation invoked by this class.
@@ -36,15 +38,52 @@
 
   private Exception exception = null;
 
-  private List<String> errors = null;
+  private List<String> errorMessages = new ArrayList<String>();
+  private List<String> debugMessages = new ArrayList<String>();
+  private List<String> accessMessages = new ArrayList<String>();
 
   /**
-   * Gets a list of string representing error messages obtained
-   * by invoking the operation.  Null if there were no errors.
-   * @return List of Strings representing errors
+   * Gets a list of strings representing error messages obtained
+   * by invoking the operation that match <code>regex</code>.
+   * @param regex String used to find particular error messages
+   * @return List of Strings representing errorMessages that contain
+   * the provided <code>regex</code> string.
    */
-  public List<String> getErrors() {
-    return errors;
+  public List<String> getErrorMessages(String regex) {
+    List<String> errorMessagesSubset = new ArrayList<String>();
+    for (String msg : errorMessages) {
+      if (msg.matches(regex)) {
+        errorMessagesSubset.add(msg);
+      }
+    }
+    return Collections.unmodifiableList(errorMessagesSubset);
+  }
+
+  /**
+   * Gets a list of strings representing error messages obtained
+   * by invoking the operation.
+   * @return List of Strings representing errorMessages
+   */
+  public List<String> getErrorMessages() {
+    return Collections.unmodifiableList(errorMessages);
+  }
+
+  /**
+   * Gets a list of strings representing error messages obtained
+   * by invoking the operation.
+   * @return List of Strings representing errorMessages
+   */
+  public List<String> getDebugMessages() {
+    return Collections.unmodifiableList(debugMessages);
+  }
+
+  /**
+   * Gets a list of strings representing error messages obtained
+   * by invoking the operation.
+   * @return List of Strings representing errorMessages
+   */
+  public List<String> getAccessMessages() {
+    return Collections.unmodifiableList(accessMessages);
   }
 
   /**
@@ -66,11 +105,44 @@
   }
 
   /**
-   * Sets the list of error messages that occurred during execution.
-   * Can be null to indicate no errors were encountered.
-   * @param errors List of Strings representing error messages
+   * Adds an error message.
+   * @param errorMessage an error message
    */
-  void setErrors(List<String> errors) {
-    this.errors = errors;
+  void addErrorMessage(String errorMessage) {
+    this.errorMessages.add(errorMessage);
   }
+
+  /**
+   * Adds an access message.
+   * @param accessMessage an error message
+   */
+  void addAccessMessage(String accessMessage) {
+    this.accessMessages.add(accessMessage);
+  }
+
+  /**
+   * Adds an error message.
+   * @param debugMessage an error message
+   */
+  void addDebugMessage(String debugMessage) {
+    this.debugMessages.add(debugMessage);
+  }
+
+
+  /**
+   * Sets the list of error messages that occurred during execution.
+   * @param accessMessages List of Strings representing error messages
+   */
+  void setAccessMessages(List<String> accessMessages) {
+    this.accessMessages = accessMessages;
+  }
+
+  /**
+   * Sets the list of error messages that occurred during execution.
+   * @param debugMessages List of Strings representing error messages
+   */
+  void setDebugMessages(List<String> debugMessages) {
+    this.debugMessages = debugMessages;
+  }
+
 }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
index b6e4ab1..6b4689f 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
@@ -206,45 +206,6 @@
   }
 
   /**
-   * Starts the directory server within this process.
-   * @param disableConnectionHandlers boolean that when true starts the
-   * the server mode that is otherwise up and running but will not accept any
-   * connections from external clients (i.e., does not create or initialize the
-   * connection handlers). This could be useful, for example, in an upgrade mode
-   * where it might be helpful to start the server but don't want it to appear
-   * externally as if the server is online without connection handlers
-   * listening.
-   *
-   * @throws org.opends.server.config.ConfigException
-   *         If there is a problem with the Directory Server
-   *         configuration that prevents a critical component
-   *         from being instantiated.
-   *
-   * @throws org.opends.server.types.InitializationException
-   *         If some other problem occurs while
-   *         attempting to initialize and start the
-   *         Directory Server.
-   */
-  public void startServerInProcess(boolean disableConnectionHandlers)
-          throws
-          org.opends.server.types.InitializationException,
-          org.opends.server.config.ConfigException {
-    System.setProperty(
-            "org.opends.server.DisableConnectionHandlers",
-            disableConnectionHandlers ? "true" : null);
-    startServerInProcess();
-  }
-
-  /**
-   * Stops a server that had been running 'in process'.
-   */
-  public void stopServerInProcess() {
-    org.opends.server.core.DirectoryServer.shutDown(
-            ServerController.class.getName(),
-            "quicksetup requests shutdown");
-  }
-
-  /**
    * This methods starts the server.
    * @return OperationOutput object containing output from the start server
    * command invocation.
@@ -317,15 +278,25 @@
         }
       }
 
-      // Collect any errors found in the output
-      List<String> errors = errReader.getErrors();
-      if (outputReader.getErrors() != null) {
-        if (errors == null) {
-          errors = new ArrayList<String>();
+      // Collect any messages found in the output
+      List<String> errors = errReader.getMessages();
+      if (errors != null) {
+        for(String error : errors) {
+          output.addErrorMessage(error);
         }
-        errors.addAll(outputReader.getErrors());
       }
-      output.setErrors(errors);
+      List<String> messages = outputReader.getMessages();
+      if (messages != null) {
+        for (String msg : messages) {
+
+          // NOTE:  this may not be the best place to drop these.
+          // However upon startup the server seems to log all messages,
+          // regardless of whether or not they signal an error condition,
+          // to its error log.
+
+          output.addErrorMessage(msg);
+        }
+      }
 
       // Check if something wrong occurred reading the starting of the server
       ApplicationException ex = errReader.getException();
@@ -426,36 +397,6 @@
   }
 
   /**
-   * Starts the OpenDS server in this process.
-   *
-   * @throws org.opends.server.config.ConfigException
-   *  If there is a problem with the Directory Server
-   *  configuration that prevents a critical component
-   *  from being instantiated.
-   *
-   * @throws org.opends.server.types.InitializationException
-   *  If some other problem occurs while
-   *  attempting to initialize and start the
-   *  Directory Server.
-   */
-  public void startServerInProcess()
-          throws
-          org.opends.server.types.InitializationException,
-          org.opends.server.config.ConfigException
-  {
-    // Bootstrap and start the 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);
-    directoryServer.startServer();
-  }
-
-  /**
    * This class is used to read the standard error and standard output of the
    * Stop process.
    * <p/>
@@ -536,7 +477,7 @@
   {
     private ApplicationException ex;
 
-    private List<String> errors;
+    private List<String> messages = new ArrayList<String>();
 
     private boolean isFinished;
 
@@ -590,14 +531,7 @@
                 isFinished = true;
               }
 
-              // Collect lines that would seem to indicate all is
-              // not well with the server
-              if (line.indexOf("severity=SEVERE_ERROR") != -1) {
-                if (errors == null) {
-                  errors = new ArrayList<String>();
-                }
-                errors.add(line);
-              }
+              messages.add(line);
 
               line = reader.readLine();
             }
@@ -625,8 +559,8 @@
       return ex;
     }
 
-    public List<String> getErrors() {
-      return errors;
+    public List<String> getMessages() {
+      return messages;
     }
 
     /**
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java
new file mode 100644
index 0000000..082b66a
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerHealthChecker.java
@@ -0,0 +1,107 @@
+/*
+ * 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 org.opends.quicksetup.Installation;
+import org.opends.quicksetup.ApplicationException;
+import org.opends.server.util.ServerConstants;
+
+import java.util.List;
+
+/**
+ * Checks a server health by starting a server and looking through its
+ * log messages for signs that things may not be well.
+ */
+public class ServerHealthChecker {
+
+  private Installation installation = null;
+
+  private List<String> errors = null;
+
+  /**
+   * Regular expression used to determine whether or not a server
+   * is healthy enough for upgrade by looking through its startup
+   * logs.
+   */
+  static private final String UNHEALTHY_SERVER_LOG_REGEX =
+    new StringBuilder()
+    .append(".*(")
+    .append(ServerConstants.ERROR_SEVERITY_FATAL)
+    .append("|")
+    .append(ServerConstants.ERROR_SEVERITY_SEVERE_ERROR)
+    .append(")+.*").toString();
+
+
+  /**
+   * Creates an instance.
+   * @param installation of the server to check
+   */
+  public ServerHealthChecker(Installation installation) {
+    this.installation = installation;
+  }
+
+  /**
+   * Diagnoses the server's health by stopping (if necessary) and starting
+   * the server in process and analyzing the resulting log messages.
+   * Following the call to this method the server is left in a stopped state.
+   * @throws ApplicationException if things go wrong
+   */
+  public void checkServer() throws ApplicationException {
+    InProcessServerController control =
+            new InProcessServerController(installation);
+    try {
+      if (installation.getStatus().isServerRunning()) {
+        new ServerController(installation).stopServer();
+      }
+      OperationOutput op = control.startServer(true);
+      errors = op.getErrorMessages(UNHEALTHY_SERVER_LOG_REGEX);
+    } catch (Exception e) {
+      if (e instanceof ApplicationException) {
+        throw (ApplicationException)e;
+      } else {
+        throw new ApplicationException(ApplicationException.Type.APPLICATION,
+                "Server health check failed.  Please resolve the following " +
+                        "before running the upgrade " +
+                        "tool: " + e.getLocalizedMessage(), e);
+      }
+    } finally {
+      control.stopServer();
+    }
+  }
+
+  /**
+   * Gets a list of Strings representing error messages that resulted
+   * from calling <code>checkServer</code>; null if <code>checkServer</code>
+   * has not been called.
+   * @return List of strings containing error messages
+   */
+  public List<String> getProblemMessages() {
+    return errors;
+  }
+
+}

--
Gitblit v1.10.0