From 36ab978c97855c1e691b167bcd89dfb3be9525e5 Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Fri, 15 Jun 2007 21:55:02 +0000
Subject: [PATCH] - Add a few more unit tests for important classes.  This also includes some plumbing for getting the quicksetup tests' workspace server configured enough so that it is startable and stoppable  for testing.

---
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Status.java                                        |   39 +
 opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java                          |    9 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/util/ServerControllerTest.java |   81 ++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java                                 |   11 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/ConfigurationTest.java         |  103 +++++
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/InstallationTest.java          |    4 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java                                    |   82 +---
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Configuration.java                                 |  102 ++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java                       |    5 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/Utils.java                     |   77 +++
 opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java                       |    6 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java                          |  331 +-----------------
 opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java                                   |   10 
 opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java                              |    4 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ConfirmUninstallPanel.java                      |   24 +
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallCliHelper.java                |   56 +-
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/DirectoryManagerAuthenticationDialog.java       |   53 +-
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties                     |    2 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java                                  |   27 +
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java                             |    9 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java                         |    3 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/QuickSetupTestCase.java        |   12 
 22 files changed, 564 insertions(+), 486 deletions(-)

diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Configuration.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Configuration.java
index ceca3d5..e25f193 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Configuration.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Configuration.java
@@ -27,27 +27,37 @@
 
 package org.opends.quicksetup;
 
+import org.opends.quicksetup.util.Utils;
+
 import java.io.File;
 import java.io.FileReader;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.util.Set;
 import java.util.HashSet;
+import java.util.logging.Logger;
 
 /**
  * Represents the contents of an OpenDS configuration file.
  */
 public class Configuration {
 
-  private String contents = null;
+  static private final Logger LOG =
+          Logger.getLogger(Configuration.class.getName());
 
+  private String contents = null;
+  private Installation install = null;
   private File file = null;
 
   /**
    * Create a Configuration from a file.
+   * @param install of which this configuration is part
    * @param file config.ldif file
    */
-  public Configuration(File file) {
+  public Configuration(Installation install, File file) {
+    if (install == null) {
+      throw new NullPointerException("config file cannot be null");
+    }
     if (file == null) {
       throw new NullPointerException("config file cannot be null");
     } else if (
@@ -56,6 +66,7 @@
             !file.getName().startsWith("config.ldif")) {
       throw new IllegalArgumentException("file must be a config.ldif file");
     }
+    this.install = install;
     this.file = file;
   }
 
@@ -110,18 +121,18 @@
 
   private int getPort(String portAttr) throws IOException {
     int port = -1;
-
-    int index = getContents().indexOf("cn=ldap connection handler");
+    String contents = getContents();
+    int index = contents.indexOf("cn=ldap connection handler");
 
     if (index != -1) {
       String attrWithPoints = portAttr + ":";
-      int index1 = getContents().indexOf(attrWithPoints, index);
+      int index1 = contents.indexOf(attrWithPoints, index);
       if (index1 != -1) {
         int index2 =
-                getContents().indexOf(Constants.LINE_SEPARATOR, index1);
+                contents.indexOf(Constants.LINE_SEPARATOR, index1);
         if (index2 != -1) {
           String sPort =
-                  getContents().substring(attrWithPoints.length() +
+                  contents.substring(attrWithPoints.length() +
                           index1,
                           index2).trim();
           try {
@@ -160,12 +171,59 @@
   }
 
   /**
+   * Returns a Set of relative paths containing the log paths outside the
+   * installation.
+   * @return a Set of relative paths containing the log paths outside the
+   * installation.
+   * @throws IOException if there is trouble reading the config file
+   */
+  public Set<String> getOutsideLogs()
+          throws IOException
+  {
+    return getOutsidePaths(getLogPaths());
+  }
+
+  /**
+   * Returns a Set of relative paths containing the db paths outside the
+   * installation.
+   * @return a Set of relative paths containing the db paths outside the
+   * installation.
+   * @throws IOException if there is trouble reading the config file
+   */
+  public Set<String> getOutsideDbs()
+          throws IOException
+  {
+    return getOutsidePaths(getDatabasePaths());
+  }
+
+  private Set<String> getOutsidePaths(Set<String> paths) {
+    Set<String> outsidePaths = new HashSet<String>();
+    for (String path : paths) {
+      File fullDbPath;
+
+      // Assume that if the path starts with a file separator
+      // that it is an absolute path.  Otherwise its a relative
+      // path.
+      if (path.startsWith(File.separator)) {
+        fullDbPath = new File(path);
+      } else {
+        fullDbPath = new File(install.getRootDirectory(), path);
+      }
+
+      if (!Utils.isDescendant(fullDbPath, install.getRootDirectory())) {
+        outsidePaths.add(Utils.getPath(fullDbPath));
+      }
+    }
+    return outsidePaths;
+  }
+
+  /**
    * Provides the contents of the config.ldif file in a String.
    *
    * @return a String representing the contents of the config.ldif file.
    * @throws IOException if there was a problem reading the file
    */
-  private String getContents() throws IOException {
+  public String getContents() throws IOException {
     if (contents == null) {
       load();
     }
@@ -173,11 +231,24 @@
   }
 
   /**
+   * Returns the list of paths where the databases are installed as they appear
+   * in the configuration file.
+   *
+   * @return the list of paths where the databases are installed as they appear
+   * in the configuration file.
+   * @throws IOException if there is a problem reading the config file.
+   */
+  public Set<String> getDatabasePaths() throws IOException {
+    return getConfigurationValues("ds-cfg-backend-directory");
+  }
+
+
+  /**
    * Loads the contents of the configuration file into memory.
    * @throws IOException if there were problems loading the file
    */
   public void load() throws IOException {
-    StringBuffer buf = new StringBuffer();
+    StringBuilder buf = new StringBuilder();
     FileReader reader = new FileReader(file);
     BufferedReader in = new BufferedReader(reader);
     String line;
@@ -194,16 +265,17 @@
   {
     Set<String> set = new HashSet<String>();
     attrName += ":";
-    int index1 = getContents().indexOf(attrName);
+    String contents = getContents();
+    int index1 = contents.indexOf(attrName);
     while (index1 != -1) {
-      int index2 = getContents().indexOf(Constants.LINE_SEPARATOR, index1);
+      int index2 = contents.indexOf(Constants.LINE_SEPARATOR, index1);
       String value;
       if (index2 > (index1 + attrName.length())) {
-        value = getContents().substring(attrName.length() + index1,
+        value = contents.substring(attrName.length() + index1,
                 index2).trim();
-      } else if (getContents().length() > (index1 + attrName.length())) {
+      } else if (contents.length() > (index1 + attrName.length())) {
         // Assume end of file
-        value = getContents().substring(
+        value = contents.substring(
                 attrName.length() + index1).trim();
       } else {
         value = null;
@@ -213,7 +285,7 @@
         set.add(value);
       }
 
-      index1 = getContents().indexOf(attrName,
+      index1 = contents.indexOf(attrName,
               index1 + attrName.length());
     }
     return set;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
index 220c7f5..6c7a61e 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
@@ -27,13 +27,11 @@
 
 package org.opends.quicksetup;
 
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.opends.quicksetup.i18n.ResourceProvider;
 import org.opends.quicksetup.util.Utils;
@@ -50,26 +48,15 @@
 
 public class CurrentInstallStatus
 {
+  static private final Logger LOG =
+          Logger.getLogger(CurrentInstallStatus.class.getName());
+
   private boolean isInstalled;
 
   private boolean canOverwriteCurrentInstall;
 
   private String installationMsg;
 
-  private String configFileContents;
-
-  private Set<String> directoryManagerDns;
-
-  private Set<String> dbPaths;
-
-  private Set<String> logPaths;
-
-  private String ldapUrl;
-
-  private String ldapsUrl;
-
-  private static boolean lockPathInitialized;
-
   /**
    * The constructor of a CurrentInstallStatus object.
    *
@@ -81,10 +68,11 @@
       isInstalled = false;
     } else
     {
+      Installation installation = Installation.getLocal();
       boolean dbFileExists = false;
       ArrayList<String> msgs = new ArrayList<String>();
 
-      if (isServerRunning())
+      if (installation.getStatus().isServerRunning())
       {
         msgs.add(getMsg("installstatus-serverrunning", new String[]
             { String.valueOf(getPort()) }));
@@ -160,217 +148,14 @@
     return installationMsg;
   }
 
-  /**
-   * Returns the list of directory manager dns as they appear in the
-   * configuration file.
-   *
-   * @return the list of directory manager dns as they appear in the
-   * configuration file.
-   */
-  public Set<String> getDirectoryManagerDns()
-  {
-    if (directoryManagerDns == null)
-    {
-      directoryManagerDns = new HashSet<String>();
-      String directoryManagerDnAttr = "ds-cfg-alternate-bind-dn";
-      updateSetWithValues(directoryManagerDns, directoryManagerDnAttr);
-    }
-    return directoryManagerDns;
-  }
-
-  /**
-   * Returns the list of paths where the databases are installed as they appear
-   * in the configuration file.
-   *
-   * @return the list of paths where the databases are installed as they appear
-   * in the configuration file.
-   */
-  public Set<String> getDatabasePaths()
-  {
-    if (dbPaths == null)
-    {
-      dbPaths = new HashSet<String>();
-      String dbFileAttr = "ds-cfg-backend-directory";
-      updateSetWithValues(dbPaths, dbFileAttr);
-    }
-    return dbPaths;
-  }
-
-  /**
-   * Returns the list of paths where the logs files are located as they appear
-   * in the configuration file.
-   *
-   * @return the list of paths where the logs files are located as they appear
-   * in the configuration file.
-   */
-  public Set<String> getLogPaths()
-  {
-    if (logPaths == null)
-    {
-      logPaths = new HashSet<String>();
-      String logFileAttr = "ds-cfg-log-file";
-      updateSetWithValues(logPaths, logFileAttr);
-    }
-    return logPaths;
-  }
-
-  /**
-   * Returns if the server is running on the given path.  The location
-   * of the 'locks' directory which is required for this method is
-   * determined by getting the installation path from the classpath.
-   * NOTE: this method is to be called only when the OpenDS.jar class has
-   * already been loaded as it uses classes in that jar.
-   *
-   * LIMITATIONS:
-   * If the locks directory does not exist the mechanism fails if the server is
-   * stopped.  However if the server.lock does not exist AND the server is not
-   * running the mechanism should work most of the times (see failing case 3).
-   *
-   * The cases where this mechanism does not work are:
-   *
-   * 1. The user deletes/renames the locks directory.
-   * 2. The user deletes/renames the server.lock file AND the server is running.
-   * 3. The server is not running but the user that is running the code does not
-   * have file system access rights.
-   * 4. The server is not running and another process has a lock on the file.
-   * @return <CODE>true</CODE> if the server is running and <CODE>false</CODE>
-   * otherwise.
-   */
-  public static boolean isServerRunning() {
-    File locksDir = new File(Utils.getInstallPathFromClasspath(),
-            org.opends.server.util.ServerConstants.LOCKS_DIRECTORY);
-    return isServerRunning(locksDir);
-  }
-
-  /**
-   * Returns if the server is running on the given path.
-   * NOTE: this method is to be called only when the OpenDS.jar class has
-   * already been loaded as it uses classes in that jar.
-   * @param locksDir File representing the location of the server's 'locks'
-   * directory
-   * @return <CODE>true</CODE> if the server is running and <CODE>false</CODE>
-   * otherwise.
-   */
-  public static boolean isServerRunning(File locksDir)
-  {
-    boolean isServerRunning;
-    if (!lockPathInitialized)
-    {
-      System.setProperty(
-        org.opends.server.util.ServerConstants.PROPERTY_LOCK_DIRECTORY,
-        Utils.getPath(locksDir));
-      lockPathInitialized = true;
-    }
-    String lockFile =
-      org.opends.server.core.LockFileManager.getServerLockFileName();
-    StringBuilder failureReason = new StringBuilder();
-    try
-    {
-      if (org.opends.server.core.LockFileManager.acquireExclusiveLock(lockFile,
-          failureReason))
-      {
-        org.opends.server.core.LockFileManager.releaseLock(lockFile,
-            failureReason);
-        isServerRunning = false;
-      }
-      else
-      {
-        isServerRunning = true;
-      }
-    }
-    catch (Throwable t)
-    {
-      // Assume that if we cannot acquire the lock file the server is
-      // running.
-      isServerRunning = true;
-    }
-    return isServerRunning;
-  }
-
-  /**
-   * Provides the ldap url to the server (assumes we are calling this locally).
-   *
-   * @return the ldap url to the server.
-   */
-  public String getLdapUrl()
-  {
-    if (ldapUrl == null)
-    {
-      if (getPort() != -1)
-      {
-        ldapUrl = "ldap://localhost:"+getPort();
-      }
-    }
-    return ldapUrl;
-  }
-
-  /**
-   * Provides the ldap secure url to the server (assumes we are calling this
-   * locally).
-   *
-   * @return the ldap secure url to the server.
-   */
-  public String getLdapsUrl()
-  {
-    if (ldapsUrl == null)
-    {
-      if (getSecurePort() != -1)
-      {
-        ldapsUrl = "ldaps://localhost:"+getSecurePort();
-      }
-    }
-    return ldapsUrl;
-  }
-
-  /**
-   * Provides the LDAP port as is specified in the config.ldif file.
-   *
-   * @return the LDAP port specified in the config.ldif file.
-   */
   private int getPort()
   {
-    return getPort("ds-cfg-listen-port");
-  }
-
-  /**
-   * Provides the LDAP secure port as is specified in the config.ldif file.
-   *
-   * @return the LDAP secure port specified in the config.ldif file.
-   */
-  private int getSecurePort()
-  {
-    // TODO find out which is the attribute for this port.
-    return getPort("ds-cfg-listen-secure-port");
-  }
-
-  private int getPort(String portAttr)
-  {
     int port = -1;
-
-    int index = getConfigFileContents().indexOf("cn=ldap connection handler");
-
-    if (index != -1)
-    {
-      String attrWithPoints = portAttr+":";
-      int index1 = getConfigFileContents().indexOf(attrWithPoints, index);
-      if (index1 != -1)
-      {
-        int index2 =
-            getConfigFileContents().indexOf(Constants.LINE_SEPARATOR, index1);
-        if (index2 != -1)
-        {
-          String sPort =
-              getConfigFileContents().substring(attrWithPoints.length() +
-                  index1,
-                  index2).trim();
-          try
-          {
-            port = Integer.parseInt(sPort);
-          } catch (NumberFormatException nfe)
-          {
-          }
-        }
-      }
+    try {
+      port = Installation.getLocal().getCurrentConfiguration().
+              getPort();
+    } catch (IOException ioe) {
+      LOG.log(Level.INFO, "Failed to get port", ioe);
     }
     return port;
   }
@@ -384,7 +169,8 @@
   private boolean dbFilesExist()
   {
     boolean dbFilesExist = false;
-    File dbDir = new File(Utils.getInstallPathFromClasspath(), "db");
+
+    File dbDir = Installation.getLocal().getDatabasesDirectory();
     File[] children = dbDir.listFiles();
     if ((children != null) && (children.length > 0))
     {
@@ -403,53 +189,16 @@
    */
   private boolean isConfigFileModified()
   {
-    boolean isConfigFileModified = getPort() != 389;
-
-    if (!isConfigFileModified)
-    {
-      // TODO: this is not really stable
-      isConfigFileModified =
-          getConfigFileContents().indexOf("# cddl header start") == -1;
+    boolean mod = false;
+    try {
+      mod = Installation.getLocal().getCurrentConfiguration()
+              .hasBeenModified();
+    } catch (IOException ioe) {
+      LOG.log(Level.INFO, "failed to determine if config modified", ioe);
     }
-
-    return isConfigFileModified;
+    return mod;
   }
 
-  /**
-   * Provides the contents of the config.ldif file in a String.
-   *
-   * @return a String representing the contents of the config.ldif file.
-   */
-  private String getConfigFileContents()
-  {
-    if (configFileContents == null)
-    {
-      StringBuilder buf = new StringBuilder();
-      try
-      {
-        Installation installation = getInstallationFromClassPath();
-        FileReader reader =
-                new FileReader(installation.getCurrentConfigurationFile());
-        BufferedReader in = new BufferedReader(reader);
-        String line;
-        // We do not care about encoding: we are just interested in the ports
-        while ((line = in.readLine()) != null)
-        {
-          buf.append(line).append(Constants.LINE_SEPARATOR);
-        }
-        reader.close();
-      } catch (IOException ioe)
-      {
-      }
-      configFileContents = buf.toString().toLowerCase();
-    }
-    return configFileContents;
-  }
-
-  /**
-   * The following three methods are just commodity methods to get localized
-   * messages.
-   */
   private String getMsg(String key)
   {
     return getI18n().getMsg(key);
@@ -465,42 +214,4 @@
     return ResourceProvider.getInstance();
   }
 
-  private void updateSetWithValues(Set<String> set, String attrName)
-  {
-    attrName += ":";
-    int index1 = getConfigFileContents().indexOf(attrName);
-    while (index1 != -1)
-    {
-      int index2 = getConfigFileContents().indexOf(
-            Constants.LINE_SEPARATOR, index1);
-      String value;
-      if (index2 > (index1 + attrName.length()))
-      {
-        value = getConfigFileContents().substring(attrName.length() + index1,
-              index2).trim();
-      }
-      else if (getConfigFileContents().length() > (index1 + attrName.length()))
-      {
-        // Assume end of file
-        value = getConfigFileContents().substring(
-            attrName.length() + index1).trim();
-      }
-      else
-      {
-        value = null;
-      }
-
-      if ((value != null) && (value.length() > 0))
-      {
-        set.add(value);
-      }
-
-      index1 = getConfigFileContents().indexOf(attrName,
-          index1 + attrName.length());
-    }
-  }
-
-  private Installation getInstallationFromClassPath() {
-    return new Installation(Utils.getInstallPathFromClasspath());
-  }
 }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java
index 8762705..74bab38 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java
@@ -263,6 +263,29 @@
     }
   }
 
+  static private Installation local;
+
+  /**
+   * Obtains the installation by reading the classpath of the running
+   * JVM to determine the location of the jars and determine the
+   * installation root.
+   * @return Installation obtained by reading the classpath
+   */
+  static public Installation getLocal() {
+    if (local == null) {
+
+      // This allows testing of configuration components when the OpenDS.jar
+      // in the classpath does not necessarily point to the server's
+      String installRoot = System.getProperty("org.opends.quicksetup.Root");
+
+      if (installRoot == null) {
+        installRoot = Utils.getInstallPathFromClasspath();
+      }
+      local = new Installation(installRoot);
+    }
+    return local;
+  }
+
   static private final Logger LOG =
           Logger.getLogger(Installation.class.getName());
 
@@ -369,7 +392,7 @@
    */
   public Configuration getCurrentConfiguration() {
     if (configuration == null) {
-      configuration = new Configuration(getCurrentConfigurationFile());
+      configuration = new Configuration(this, getCurrentConfigurationFile());
     }
     return configuration;
   }
@@ -384,7 +407,7 @@
    */
   public Configuration getBaseConfiguration() throws ApplicationException {
     if (baseConfiguration == null) {
-      baseConfiguration = new Configuration(getBaseConfigurationFile());
+      baseConfiguration = new Configuration(this, getBaseConfigurationFile());
     }
     return baseConfiguration;
   }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
index 36619dc..a8a9670 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
@@ -59,12 +59,21 @@
       logger.addHandler(fileHandler);
       logger.log(Level.INFO, getInitialLogRecord());
       logger = Logger.getLogger("org.opends.admin.ads");
-      logger.setUseParentHandlers(false); // disable logging to console
       logger.addHandler(fileHandler);
+      disableConsoleLogging();
     }
   }
 
   /**
+   * Prevents messages written to loggers from appearing in the console
+   * output.
+   */
+  static public void disableConsoleLogging() {
+    Logger logger = Logger.getLogger("org.opends.quicksetup");
+    logger.setUseParentHandlers(false);
+  }
+
+  /**
    * Gets the name of the log file.
    * @return File representing the log file
    */
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Status.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Status.java
index 34cf37f..d6e55ba 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Status.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Status.java
@@ -27,6 +27,10 @@
 
 package org.opends.quicksetup;
 
+import org.opends.server.util.ServerConstants;
+import org.opends.server.core.LockFileManager;
+import org.opends.quicksetup.util.Utils;
+
 import java.io.File;
 import java.io.IOException;
 
@@ -90,28 +94,37 @@
    * NOTE: this method is to be called only when the OpenDS.jar class has
    * already been loaded as it uses classes in that jar.
    *
+   * LIMITATIONS:
+   * If the locks directory does not exist the mechanism fails if the server is
+   * stopped.  However if the server.lock does not exist AND the server is not
+   * running the mechanism should work most of the times (see failing case 3).
+   *
+   * The cases where this mechanism does not work are:
+   *
+   * 1. The user deletes/renames the locks directory.
+   * 2. The user deletes/renames the server.lock file AND the server is running.
+   * 3. The server is not running but the user that is running the code does not
+   * have file system access rights.
+   * 4. The server is not running and another process has a lock on the file.
    * @return <CODE>true</CODE> if the server is running and <CODE>false</CODE>
-   *         otherwise.
-   * @throws java.io.IOException if there was a problem reading required
-   * configuration information
+   * otherwise.
    */
-  public boolean isServerRunning() throws IOException {
+  public boolean isServerRunning() {
     boolean isServerRunning;
     if (!lockPathInitialized) {
-      File lockDirectory = installation.getLocksDirectory();
+      File locksDir = installation.getLocksDirectory();
 
       System.setProperty(
-              org.opends.server.util.ServerConstants.PROPERTY_LOCK_DIRECTORY,
-              lockDirectory.getCanonicalPath());
+              ServerConstants.PROPERTY_LOCK_DIRECTORY,
+              Utils.getPath(locksDir));
       lockPathInitialized = true;
     }
-    String lockFile =
-            org.opends.server.core.LockFileManager.getServerLockFileName();
+    String lockFile = LockFileManager.getServerLockFileName();
     StringBuilder failureReason = new StringBuilder();
     try {
-      if (org.opends.server.core.LockFileManager.acquireExclusiveLock(lockFile,
+      if (LockFileManager.acquireExclusiveLock(lockFile,
               failureReason)) {
-        org.opends.server.core.LockFileManager.releaseLock(lockFile,
+        LockFileManager.releaseLock(lockFile,
                 failureReason);
         isServerRunning = false;
       } else {
@@ -119,8 +132,8 @@
       }
     }
     catch (Throwable t) {
-      // Assume that if we cannot acquire the lock file the server is
-      // running.
+      // Assume that if we cannot acquire the lock file the
+      // server is running.
       isServerRunning = true;
     }
     return isServerRunning;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
index 460e2a9..ec2f48e 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
@@ -1038,6 +1038,8 @@
 progress-deleting-installation-files=Deleting Files under the Installation Path:
 progress-deleting-file=Deleting file {0}
 progress-deleting-directory=Deleting directory {0}
+progress-deleting-file-does-not-exist=Ignoring file {0} since it does not exist. 
+
 progress-copying-file=Copying file {0} to {1}
 progress-server-already-stopped=The Directory Server is already stopped.
 progress-server-waiting-to-stop=Waiting for Server to stop...
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ConfirmUninstallPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ConfirmUninstallPanel.java
index 5d2440a..0a836ab 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ConfirmUninstallPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ConfirmUninstallPanel.java
@@ -28,6 +28,8 @@
 package org.opends.quicksetup.ui;
 
 import org.opends.quicksetup.CurrentInstallStatus;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.Configuration;
 import org.opends.quicksetup.util.Utils;
 
 import javax.swing.*;
@@ -36,6 +38,9 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.io.IOException;
 
 /**
  * This is the panel displayed when the user is uninstalling Open DS.  It is
@@ -45,6 +50,9 @@
  */
 public class ConfirmUninstallPanel extends QuickSetupStepPanel
 {
+  private static final Logger LOG =
+          Logger.getLogger(ConfirmUninstallPanel.class.getName());
+
   private static final long serialVersionUID = 81730510134697056L;
 
   private CurrentInstallStatus installStatus;
@@ -202,8 +210,20 @@
 
     panel.add(p, gbc);
 
-    outsideDbs = Utils.getOutsideDbs(installStatus);
-    outsideLogs = Utils.getOutsideLogs(installStatus);
+    Installation installation = Installation.getLocal();
+    Configuration config = installation.getCurrentConfiguration();
+    try {
+      outsideDbs = config.getOutsideDbs();
+    } catch (IOException ioe) {
+      LOG.log(Level.INFO, "Unable to determin outside databases", ioe);
+    }
+
+    try {
+      outsideLogs = config.getOutsideLogs();
+    } catch (IOException ioe) {
+      LOG.log(Level.INFO, "Unable to determin outside logs", ioe);
+    }
+
 
     gbc.insets.top = UIFactory.TOP_INSET_PRIMARY_FIELD;
     gbc.fill = GridBagConstraints.HORIZONTAL;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/DirectoryManagerAuthenticationDialog.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/DirectoryManagerAuthenticationDialog.java
index 6faf772..7922a3b 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/DirectoryManagerAuthenticationDialog.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/DirectoryManagerAuthenticationDialog.java
@@ -35,6 +35,9 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.io.IOException;
 
 import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
@@ -48,7 +51,7 @@
 import javax.swing.JTextField;
 import javax.swing.text.JTextComponent;
 
-import org.opends.quicksetup.CurrentInstallStatus;
+import org.opends.quicksetup.Installation;
 import org.opends.quicksetup.event.MinimumSizeComponentListener;
 import org.opends.quicksetup.i18n.ResourceProvider;
 import org.opends.quicksetup.util.BackgroundTask;
@@ -61,12 +64,14 @@
  */
 public class DirectoryManagerAuthenticationDialog extends JDialog
 {
+  private static final Logger LOG =
+          Logger.getLogger(
+                  DirectoryManagerAuthenticationDialog.class.getName());
+
   private static final long serialVersionUID = 9049409381101152000L;
 
   private JFrame parent;
 
-  private CurrentInstallStatus installStatus;
-
   private JLabel lDn;
   private JLabel lPwd;
 
@@ -83,16 +88,13 @@
   /**
    * Constructor of the DirectoryManagerAuthenticationDialog.
    * @param parent the parent frame for this dialog.
-   * @param installStatus the object describing the current installation
    * status.
    */
-  public DirectoryManagerAuthenticationDialog(JFrame parent,
-      CurrentInstallStatus installStatus)
+  public DirectoryManagerAuthenticationDialog(JFrame parent)
   {
     super(parent);
     setTitle(getMsg("shutdown-directory-manager-dialog-title"));
     this.parent = parent;
-    this.installStatus = installStatus;
     getContentPane().add(createPanel());
   }
 
@@ -312,8 +314,14 @@
   private String getProposedDirectoryManagerDn()
   {
     String dn;
-    Set<String> dns = installStatus.getDirectoryManagerDns();
-    if (dns.size() > 0)
+    Set<String> dns = null;
+    try {
+      dns = Installation.getLocal().getCurrentConfiguration().
+              getDirectoryManagerDns();
+    } catch (IOException ioe) {
+      LOG.log(Level.INFO, "error obtaining dirmanager DNs", ioe);
+    }
+    if (dns != null && dns.size() > 0)
     {
       dn = dns.iterator().next();
     }
@@ -340,8 +348,12 @@
         Boolean isServerRunning = Boolean.TRUE;
         try
         {
+          String installPath = Utils.getInstallPathFromClasspath();
+          Installation installation = new Installation(installPath);
+          int port = installation.getCurrentConfiguration().getPort();
+          String ldapUrl = "ldap://localhost:"+port;
           InitialLdapContext ctx =
-            Utils.createLdapContext(installStatus.getLdapUrl(), tfDn.getText(),
+            Utils.createLdapContext(ldapUrl, tfDn.getText(),
               tfPwd.getText(), Utils.getDefaultLDAPTimeout(), null);
 
           /*
@@ -357,7 +369,7 @@
 
         } catch (NamingException ne)
         {
-          if (CurrentInstallStatus.isServerRunning())
+          if (Installation.getLocal().getStatus().isServerRunning())
           {
             throw ne;
           }
@@ -394,11 +406,17 @@
             else
             {
               boolean found = false;
-              Iterator<String> it =
-                installStatus.getDirectoryManagerDns().iterator();
-              while (it.hasNext() && !found)
-              {
-                found = Utils.areDnsEqual(dn, it.next());
+              try {
+                Set<String> dns;
+                dns = Installation.getLocal().getCurrentConfiguration()
+                        .getDirectoryManagerDns();
+                Iterator<String> it = dns.iterator();
+                while (it.hasNext() && !found)
+                {
+                  found = Utils.areDnsEqual(dn, it.next());
+                }
+              } catch (IOException ioe) {
+                LOG.log(Level.INFO, "error obtaining dirmanager DNs", ioe);
               }
               if (!found)
               {
@@ -517,8 +535,7 @@
     {
       // UIFactory.initialize();
       DirectoryManagerAuthenticationDialog dlg =
-          new DirectoryManagerAuthenticationDialog(new JFrame(),
-              new CurrentInstallStatus());
+          new DirectoryManagerAuthenticationDialog(new JFrame());
       dlg.packAndShow();
     } catch (Exception ex)
     {
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 5112773..5d70931 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
@@ -36,7 +36,6 @@
 
 import javax.swing.*;
 import java.awt.event.WindowEvent;
-import java.io.IOException;
 import java.io.File;
 import java.security.cert.X509Certificate;
 import java.util.LinkedHashSet;
@@ -492,6 +491,7 @@
           Thread.sleep(300);
         } catch (Exception ex)
         {
+          // do nothing;
         }
       }
     }
@@ -526,13 +526,8 @@
       }
       InProcessServerController ipsc =
               new InProcessServerController(getInstallation());
-      ipsc.disableConnectionHandlers(true);
+      InProcessServerController.disableConnectionHandlers(true);
       ipsc.startServer();
-    } catch (IOException e) {
-      String msg = getMsg("error-determining-server-state");
-      LOG.log(Level.INFO, msg, e);
-      throw new ApplicationException(ApplicationException.Type.IMPORT_ERROR,
-          msg, e);
     } catch (Throwable t) {
       String msg = getMsg("error-starting-server-with-no-connection-handlers",
           (t.getMessage() == null) ? t.toString() : t.getMessage());
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallCliHelper.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallCliHelper.java
index 04b295e..341ee00 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallCliHelper.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/UninstallCliHelper.java
@@ -33,6 +33,10 @@
 
 import java.util.HashSet;
 import java.util.Set;
+import java.util.Collections;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.io.IOException;
 
 /**
  * The class used to provide some CLI interface in the uninstall.
@@ -46,6 +50,9 @@
  */
 class UninstallCliHelper extends CliApplicationHelper {
 
+  static private final Logger LOG =
+          Logger.getLogger(UninstallCliHelper.class.getName());
+
   static private String FORMAT_KEY = "cli-uninstall-confirm-prompt";
 
   /**
@@ -83,8 +90,23 @@
     /* Step 2: If this is not a silent install ask for confirmation to delete
      * the different parts of the installation
      */
-    Set<String> outsideDbs = getOutsideDbs(installStatus);
-    Set<String> outsideLogs = getOutsideLogs(installStatus);
+    Set<String> outsideDbs;
+    Set<String> outsideLogs;
+    Configuration config =
+            Installation.getLocal().getCurrentConfiguration();
+    try {
+      outsideDbs = config.getOutsideDbs();
+    } catch (IOException ioe) {
+      outsideDbs = Collections.emptySet();
+      LOG.log(Level.INFO, "error determining outside databases", ioe);
+    }
+
+    try {
+      outsideLogs = config.getOutsideLogs();
+    } catch (IOException ioe) {
+      outsideLogs = Collections.emptySet();
+      LOG.log(Level.INFO, "error determining outside logs", ioe);
+    }
 
     if (silentUninstall)
     {
@@ -121,30 +143,6 @@
   }
 
   /**
-   * Returns a Set of relative paths containing the db paths outside the
-   * installation.
-   * @param installStatus the Current Install Status object.
-   * @return a Set of relative paths containing the db paths outside the
-   * installation.
-   */
-  private Set<String> getOutsideDbs(CurrentInstallStatus installStatus)
-  {
-    return Utils.getOutsideDbs(installStatus);
-  }
-
-  /**
-   * Returns a Set of relative paths containing the log paths outside the
-   * installation.
-   * @param installStatus the Current Install Status object.
-   * @return a Set of relative paths containing the log paths outside the
-   * installation.
-   */
-  private Set<String> getOutsideLogs(CurrentInstallStatus installStatus)
-  {
-    return Utils.getOutsideLogs(installStatus);
-  }
-
-  /**
    * 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>
@@ -325,8 +323,8 @@
   throws UserDataException
   {
     boolean cancelled = false;
-
-    if (CurrentInstallStatus.isServerRunning())
+    Status status = Installation.getLocal().getStatus();
+    if (status.isServerRunning())
     {
         if (!silentUninstall)
         {
@@ -337,7 +335,7 @@
         if (!cancelled)
         {
             /* During all the confirmations, the server might be stopped. */
-            userData.setStopServer(CurrentInstallStatus.isServerRunning());
+            userData.setStopServer(status.isServerRunning());
         }
     }
     else
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
index cc88ab1..b03fefa 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
@@ -271,7 +271,8 @@
             throw new UserDataException(cStep,
                     getThrowableMsg("bug-msg", t));
           }
-          return CurrentInstallStatus.isServerRunning();
+          Status status = Installation.getLocal().getStatus();
+          return status.isServerRunning();
         }
 
         public void backgroundTaskCompleted(Object returnValue,
@@ -812,7 +813,7 @@
       // Just tell that the file/directory does not exist.
       String[] arg = {file.toString()};
       notifyListeners(getFormattedWarning(
-              getMsg("deleting-file-does-not-exist", arg)));
+              getMsg("progress-deleting-file-does-not-exist", arg)));
     }
   }
 
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 1e87ab5..f5158ef 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
@@ -161,8 +161,7 @@
             boolean stopped = false;
 
             for (int i = 0; i < nTries && !stopped; i++) {
-              stopped = !CurrentInstallStatus.isServerRunning(
-                      installation.getLocksDirectory());
+              installation.getStatus().isServerRunning();
               if (!stopped) {
                 if (application != null) {
                   String msg =
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
index fc78b0e..136389c 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -209,7 +209,6 @@
    */
   public static boolean isDescendant(String descendant, String path)
   {
-    boolean isDescendant = false;
     File f1;
     File f2;
 
@@ -230,16 +229,28 @@
     {
       f2 = new File(descendant);
     }
+    return isDescendant(f1, f2);
+  }
 
-    f2 = f2.getParentFile();
 
-    while ((f2 != null) && !isDescendant)
-    {
-      isDescendant = f1.equals(f2);
-
-      if (!isDescendant)
-      {
-        f2 = f2.getParentFile();
+  /**
+   * Returns <CODE>true</CODE> if the first provided path is under the second
+   * path in the file system.
+   * @param descendant the descendant candidate path.
+   * @param path the path.
+   * @return <CODE>true</CODE> if the first provided path is under the second
+   * path in the file system; <code>false</code> otherwise or if
+   * either of the files are null
+   */
+  public static boolean isDescendant(File descendant, File path) {
+    boolean isDescendant = false;
+    if (descendant != null && path != null) {
+      File parent = descendant.getParentFile();
+      while ((parent != null) && !isDescendant) {
+        isDescendant = path.equals(parent);
+        if (!isDescendant) {
+          parent = parent.getParentFile();
+        }
       }
     }
     return isDescendant;
@@ -885,7 +896,7 @@
    *
    * @see javax.naming.Context
    * @see javax.naming.ldap.InitialLdapContext
-   * @see TrustedSocketFactory
+   * @see org.opends.admin.ads.util.TrustedSocketFactory
    */
   public static InitialLdapContext createLdapsContext(String ldapsURL,
       String dn, String pwd, int timeout, Hashtable<String, String> env,
@@ -924,7 +935,7 @@
    * @see javax.naming.ldap.InitialLdapContext
    * @see javax.naming.ldap.StartTlsRequest
    * @see javax.naming.ldap.StartTlsResponse
-   * @see TrustedSocketFactory
+   * @see org.opends.admin.ads.util.TrustedSocketFactory
    */
 
   public static InitialLdapContext createStartTLSContext(String ldapsURL,
@@ -1088,55 +1099,6 @@
   }
 
   /**
-   * Returns a Set of relative paths containing the db paths outside the
-   * installation.
-   * @param installStatus the Current Install Status object.
-   * @return a Set of relative paths containing the db paths outside the
-   * installation.
-   */
-  public static Set<String> getOutsideDbs(CurrentInstallStatus installStatus)
-  {
-    String installPath = getInstallPathFromClasspath();
-    Set<String> dbs = installStatus.getDatabasePaths();
-    Set<String> outsideDbs = new HashSet<String>();
-    for (String relativePath : dbs)
-    {
-      /* The db paths are relative */
-      String fullDbPath = getPath(installPath, relativePath);
-      if (!isDescendant(fullDbPath, installPath))
-      {
-        outsideDbs.add(fullDbPath);
-      }
-    }
-    return outsideDbs;
-  }
-
-  /**
-   * Returns a Set of relative paths containing the log paths outside the
-   * installation.
-   * @param installStatus the Current Install Status object.
-   * @return a Set of relative paths containing the log paths outside the
-   * installation.
-   */
-  public static Set<String> getOutsideLogs(CurrentInstallStatus installStatus)
-  {
-    String installPath = getInstallPathFromClasspath();
-    Set<String> logs = installStatus.getLogPaths();
-    Set<String> outsideLogs = new HashSet<String>();
-    for (String relativePath : logs)
-    {
-      /* The db paths are relative */
-      String fullDbPath = getPath(installPath, relativePath);
-      if (!isDescendant(fullDbPath, installPath))
-      {
-        outsideLogs.add(fullDbPath);
-      }
-    }
-    return outsideLogs;
-  }
-
-
-  /**
 
    * Returns the max size in character of a line to be displayed in the command
    * line.
diff --git a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
index 97af64b..aed3f03 100644
--- a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
+++ b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
@@ -30,7 +30,7 @@
 import java.io.File;
 import java.util.HashSet;
 
-import org.opends.quicksetup.CurrentInstallStatus;
+import org.opends.quicksetup.Installation;
 import org.opends.quicksetup.util.Utils;
 import org.opends.statuspanel.event.ServerStatusChangeEvent;
 import org.opends.statuspanel.event.ServerStatusChangeListener;
@@ -151,6 +151,7 @@
     }
     catch (Throwable t)
     {
+      // do nothing;
     }
   }
 
@@ -300,7 +301,7 @@
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STOPPING);
     }
-    else if (CurrentInstallStatus.isServerRunning())
+    else if (Installation.getLocal().getStatus().isServerRunning())
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STARTED);
     }
@@ -412,10 +413,6 @@
     }
   }
 
-  /**
-   * The following three methods are just commodity methods to get localized
-   * messages.
-   */
   private String getMsg(String key)
   {
     return getI18n().getMsg(key);
diff --git a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
index c3729ef..8c9471a 100644
--- a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
+++ b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
@@ -40,8 +40,8 @@
 
 import javax.swing.table.TableModel;
 
-import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.QuickSetupLog;
 import org.opends.quicksetup.util.Utils;
 
 import org.opends.server.core.DirectoryServer;
@@ -52,8 +52,6 @@
 
 import static org.opends.server.tools.ToolConstants.*;
 import org.opends.server.util.PasswordReader;
-import static org.opends.server.messages.ToolMessages.*;
-import static org.opends.server.messages.MessageHandler.*;
 
 /**
  * The class used to provide some CLI interface to display status.
@@ -90,6 +88,7 @@
    */
   public static void main(String[] args)
   {
+    QuickSetupLog.disableConsoleLogging();
     StatusCli cli = new StatusCli(args);
     System.exit(cli.run());
   }
@@ -274,7 +273,8 @@
     }
     else
     {
-      boolean isServerRunning = CurrentInstallStatus.isServerRunning();
+      boolean isServerRunning =
+              Installation.getLocal().getStatus().isServerRunning();
       /* This is required to retrieve the ldap url to be used by the
        * ConfigFromLDAP class.
        */
@@ -397,7 +397,7 @@
     ServerStatusDescriptor desc = new ServerStatusDescriptor();
     desc.setAuthenticated((dn != null) && (pwd != null));
 
-    if (CurrentInstallStatus.isServerRunning())
+    if (Installation.getLocal().getStatus().isServerRunning())
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STARTED);
     }
diff --git a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
index f248539..1541f0b 100644
--- a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
+++ b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
@@ -39,7 +39,6 @@
 
 import org.opends.server.core.DirectoryServer;
 
-import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.Installation;
 import org.opends.quicksetup.ui.UIFactory;
 import org.opends.quicksetup.util.BackgroundTask;
@@ -579,7 +578,7 @@
         boolean running = false;
         for (int i=0; i<5 && !running; i++)
         {
-          running = CurrentInstallStatus.isServerRunning();
+          running = Installation.getLocal().getStatus().isServerRunning();
         }
 
         if (!running)
@@ -696,7 +695,8 @@
           int nTries = 10;
           for (int i=0; i<nTries && !stopped; i++)
           {
-            stopped = !CurrentInstallStatus.isServerRunning();
+            stopped = !Installation.getLocal().getStatus()
+                    .isServerRunning();
             if (!stopped)
             {
               String msg =
diff --git a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
index f60a851..fe51dc5 100644
--- a/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
+++ b/opendj-sdk/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
@@ -48,7 +48,7 @@
 import javax.swing.JTextField;
 import javax.swing.text.JTextComponent;
 
-import org.opends.quicksetup.CurrentInstallStatus;
+import org.opends.quicksetup.Installation;
 import org.opends.quicksetup.event.MinimumSizeComponentListener;
 import org.opends.quicksetup.ui.UIFactory;
 import org.opends.quicksetup.util.BackgroundTask;
@@ -545,7 +545,7 @@
    */
   private boolean isServerRunning()
   {
-    return CurrentInstallStatus.isServerRunning();
+    return Installation.getLocal().getStatus().isServerRunning();
   }
 
   /**
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/ConfigurationTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/ConfigurationTest.java
new file mode 100644
index 0000000..132cdc1
--- /dev/null
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/ConfigurationTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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 2006-2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup;
+
+import static org.testng.Assert.*;
+import org.testng.annotations.*;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * Configuration Tester.
+ */
+@Test(groups = {"slow"})
+public class ConfigurationTest extends QuickSetupTestCase {
+
+  Configuration config;
+
+  @BeforeClass
+  public void setUp() throws Exception {
+    config = Utils.getInstallation().getCurrentConfiguration();
+  }
+
+  @Test
+  public void testGetDirectoryManagerDns() throws IOException {
+    Set<String> dns = config.getDirectoryManagerDns();
+    assertTrue(dns.size() > 0);
+  }
+
+  @Test
+  public void testGetPort() throws IOException {
+    assertTrue(Utils.ldapPort.equals(config.getPort()));
+  }
+
+  @Test
+  public void testGetSecurePort() throws IOException {
+    // TODO: something more useful
+    config.getSecurePort();
+  }
+
+  @Test
+  public void testGetLogPaths() throws IOException {
+    // TODO: something more useful
+    config.getLogPaths();
+  }
+
+  @Test
+  public void testHasBeenModified() throws IOException {
+    assertTrue(config.hasBeenModified());
+  }
+
+  @Test
+  public void testGetOutsideLogs() throws IOException {
+    // TODO: something more useful
+    config.getOutsideLogs();
+  }
+
+  @Test
+  public void testGetOutsideDbs() throws IOException {
+    // TODO: something more useful
+    config.getOutsideDbs();
+  }
+
+  @Test
+  public void testGetContents() throws IOException {
+    assertNotNull(config.getContents());
+  }
+
+  @Test
+  public void testGetDatabasePaths() throws IOException {
+    assertTrue(config.getDatabasePaths().size() > 0);
+  }
+
+  public void testLoad() {
+    //TODO:  need way to verify reload
+  }
+
+}
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/InstallationTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/InstallationTest.java
index fb5c283..4bd5a04 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/InstallationTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/InstallationTest.java
@@ -38,12 +38,12 @@
  */
 @Test(groups = {"slow"})
 public class InstallationTest extends QuickSetupTestCase {
+
   Installation installation;
 
   @BeforeClass
   public void setUp() throws Exception {
-    Utils.extractServer();
-    installation = new Installation(Utils.getQuickSetupTestServerRootDir());
+    installation = Utils.getInstallation();
   }
 
   /**
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/QuickSetupTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/QuickSetupTestCase.java
index 6c9e7a2..43aa94c 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/QuickSetupTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/QuickSetupTestCase.java
@@ -31,6 +31,8 @@
 import org.testng.annotations.AfterSuite;
 import org.opends.server.TestCaseUtils;
 
+import java.io.IOException;
+
 /**
  *
  */
@@ -41,8 +43,16 @@
     TestCaseUtils.suppressOutput();
   }
 
+  @BeforeSuite
+  public final void initServer()
+          throws IOException, ApplicationException, InterruptedException
+  {
+    Utils.initServer();
+  }
+
   @AfterSuite
-  public final void shutdownServer() {
+  public final void shutdownServer() throws ApplicationException {
+    Utils.stopServer();
     TestCaseUtils.unsupressOutput();
   }  
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/Utils.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/Utils.java
index 4529be4..cba2d36 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/Utils.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/Utils.java
@@ -28,11 +28,16 @@
 package org.opends.quicksetup;
 
 import org.opends.quicksetup.util.ZipExtractor;
+import org.opends.quicksetup.util.ServerController;
+import org.opends.server.TestCaseUtils;
+import org.opends.server.types.OperatingSystem;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.PrintStream;
-import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.util.List;
+import java.util.ArrayList;
 
 /**
  *
@@ -45,10 +50,70 @@
   public static final String PROPERTY_BUILD_ROOT =
           "org.opends.server.BuildRoot";
 
-  static public void extractServer()
-          throws FileNotFoundException, ApplicationException {
-    ZipExtractor extractor = new ZipExtractor(getInstallPackageFile());
-    extractor.extract(getQuickSetupTestServerRootDir());
+  public static final String DIRECTORY_MANAGER_PASSWORD = "password";
+
+  public static Integer ldapPort;
+
+  public static Integer jmxPort;
+
+  private static boolean initialized;
+
+  static public void initServer()
+          throws IOException, ApplicationException, InterruptedException {
+    File qsServerRoot = getQuickSetupTestServerRootDir();
+    if (!initialized) {
+      if (qsServerRoot.exists()) {
+        stopServer();
+        if (!qsServerRoot.delete()) {
+          throw new IllegalStateException("cannot delete stale installation");
+        }
+      }
+      ZipExtractor extractor = new ZipExtractor(getInstallPackageFile());
+      extractor.extract(qsServerRoot);
+      setupServer();
+      initialized = true;
+    }
+  }
+
+  static public Installation getInstallation() {
+    return new Installation(Utils.getQuickSetupTestServerRootDir());
+  }
+
+  static private void setupServer() throws IOException, InterruptedException {
+    ServerSocket ldapSocket = TestCaseUtils.bindFreePort();
+    ldapPort = ldapSocket.getLocalPort();
+    ldapSocket.close();
+
+    ServerSocket jmxSocket = TestCaseUtils.bindFreePort();
+    jmxPort = jmxSocket.getLocalPort();
+    jmxSocket.close();
+
+    List<String> args = new ArrayList<String>();
+    File root = getQuickSetupTestServerRootDir();
+    if (OperatingSystem.isUNIXBased(
+            OperatingSystem.forName(System.getProperty("os.name")))) {
+      args.add(new File(root, "setup").getPath());
+    } else {
+      args.add(new File(root, "setup.bat").getPath());
+    }
+    args.add("--cli");
+    args.add("-s");
+    args.add("-p");
+    args.add(Integer.toString(ldapPort));
+    args.add("-x");
+    args.add(Integer.toString(jmxPort));
+    args.add("-w");
+    args.add(DIRECTORY_MANAGER_PASSWORD);
+    ProcessBuilder pb = new ProcessBuilder(args);
+    Process p = pb.start();
+    if (p.waitFor() != 0) {
+      throw new IllegalStateException("setup server failed");
+    }
+  }
+
+  static public void stopServer() throws ApplicationException {
+    ServerController controller = new ServerController(getInstallation());
+    controller.stopServer();
   }
 
   static public File getInstallPackageFile() throws FileNotFoundException {
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/util/ServerControllerTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/util/ServerControllerTest.java
new file mode 100644
index 0000000..3eb0318
--- /dev/null
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/quicksetup/util/ServerControllerTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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 2006-2007 Sun Microsystems, Inc.
+ */
+
+
+package org.opends.quicksetup.util;
+
+import org.testng.annotations.*;
+import org.opends.quicksetup.*;
+import org.opends.quicksetup.Utils;
+import org.opends.server.TestCaseUtils;
+
+import java.io.FileNotFoundException;
+
+/**
+ * ServerController Tester.
+ */
+@Test(groups = {"slow"})
+public class ServerControllerTest extends QuickSetupTestCase {
+  ServerController controller;
+  Status status;
+
+  @BeforeClass
+  public void setUp() throws Exception {
+    Installation installation = Utils.getInstallation();
+    controller = new ServerController(installation);
+    status = installation.getStatus();
+  }
+
+  /**
+   * Tests ability to stop the server.
+   * @throws ApplicationException
+   */
+  @Test
+  public void testStopServer() throws ApplicationException {
+    if (!status.isServerRunning()) {
+      controller.startServer();
+    }
+    assert (status.isServerRunning());
+    controller.stopServer();
+    assert (!status.isServerRunning());
+  }
+
+  /**
+   * Tests ability to start the server.
+   * @throws ApplicationException
+   */
+  @Test
+  public void testStartServer() throws ApplicationException {
+    if (status.isServerRunning()) {
+      controller.stopServer();
+    }
+    assert (!status.isServerRunning());
+    controller.startServer();
+    assert (status.isServerRunning());
+  }
+
+}

--
Gitblit v1.10.0