From eebe112fb9a05226379250e0773a43b219be18da Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Wed, 02 May 2007 19:22:13 +0000
Subject: [PATCH] mproves the amount of logging that is done in quicksetup applications.  Much of what was simply relayed to the user as progress messages is not logged also.

---
 opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java       |  214 ++++++++++-------
 opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties   |    6 
 opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java           |   38 ++
 opends/src/quicksetup/org/opends/quicksetup/ApplicationException.java        |   25 ++
 opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java     |   24 +
 opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java            |   72 ++++-
 opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java |   26 ++
 opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java           |  300 ++++++++++++++----------
 opends/src/statuspanel/org/opends/statuspanel/i18n/ResourceProvider.java     |    2 
 opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java               |    1 
 opends/src/quicksetup/org/opends/quicksetup/i18n/ResourceProvider.java       |    2 
 11 files changed, 457 insertions(+), 253 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/ApplicationException.java b/opends/src/quicksetup/org/opends/quicksetup/ApplicationException.java
index 0362cac..5ecb378 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/ApplicationException.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/ApplicationException.java
@@ -40,6 +40,8 @@
 {
   private static final long serialVersionUID = -3527273444231560341L;
 
+  private String formattedMsg = null;
+
   private Type type;
 
   /**
@@ -124,6 +126,21 @@
   }
 
   /**
+   * The constructor of the ApplicationException.
+   * @param type the type of error we have.
+   * @param localizedMsg a localized string describing the problem.
+   * @param formattedMsg a localized message with extra formatting
+   * @param rootCause the root cause of this exception.
+   */
+  public ApplicationException(Type type, String localizedMsg,
+                              String formattedMsg, Throwable rootCause)
+  {
+    super(localizedMsg, rootCause);
+    this.formattedMsg = formattedMsg;
+    this.type = type;
+  }
+
+  /**
    * Returns the Type of this exception.
    * @return the Type of this exception.
    */
@@ -133,6 +150,14 @@
   }
 
   /**
+   * Gets the localized message with extra formatting markup.
+   * @return String representing a formatted message.
+   */
+  public String getFormattedMessage() {
+    return formattedMsg;
+  }
+
+  /**
    * {@inheritDoc}
    */
   public String toString()
diff --git a/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java b/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
index 2527d63..0378aef 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/QuickSetupLog.java
@@ -55,6 +55,7 @@
       FileHandler fileHandler = new FileHandler(logFile.getCanonicalPath());
       fileHandler.setFormatter(new SimpleFormatter());
       Logger logger = Logger.getLogger("org.opends.quicksetup");
+      logger.setUseParentHandlers(false); // disable logging to console
       logger.addHandler(fileHandler);
       logger.log(Level.INFO, getInitialLogRecord());
     }
diff --git a/opends/src/quicksetup/org/opends/quicksetup/i18n/ResourceProvider.java b/opends/src/quicksetup/org/opends/quicksetup/i18n/ResourceProvider.java
index a7b6201..1bbbdb1 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/i18n/ResourceProvider.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/i18n/ResourceProvider.java
@@ -119,7 +119,7 @@
    * @throws IllegalArgumentException if the key could not be found in the
    * properties file.
    */
-  public String getMsg(String key, String[] args)
+  public String getMsg(String key, String... args)
   throws IllegalArgumentException
   {
     String msg;
diff --git a/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties b/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
index 51e1da0..16a41e9 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
+++ b/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
@@ -792,7 +792,7 @@
 summary-upgrade-verifying=Verifying Upgrade...
 summary-upgrade-history=Recording Upgrade History...
 summary-upgrade-cleanup=Cleaning Up...
-summary-upgrade-abort=Aborting Upgrade Due to Error...
+summary-upgrade-abort=Aborting Upgrade...
 summary-upgrade-finished-successfully=<b>OpenDS QuickSetup Completed \
   Successfully.</b><br>The OpenDS installation at {0} has now been upgraded \
   to version {1}.
@@ -982,5 +982,9 @@
 upgrade-review-panel-start-server-tooltip=Check this check box if you want to \
   start the server once the upgrade has completed
 
+build-manager-downloading-build-progress=Downloading Build: {0}% Completed
+build-manager-downloading-build=Downloading Build...
+build-manager-downloading-build-done=Finished Downloading Build
+
 general-loading=Loading...
 general-see-for-details=See {0} for a detailed log of this operation.
\ No newline at end of file
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
index 4d6626c..85b3a67 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
@@ -38,6 +38,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.FileNotFoundException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * BuildExtractor unzips an OpenDS installation package (.zip file) from a user
@@ -54,11 +56,23 @@
  */
 public class BuildExtractor extends Application implements Runnable {
 
+  static private final Logger LOG =
+          Logger.getLogger(BuildExtractor.class.getName());
+
   /**
    * Creates and run a BuildExtractor using command line arguments.
    * @param args String[] command line arguments
    */
   public static void main(String[] args) {
+    try {
+      QuickSetupLog.initLogFileHandler(
+              File.createTempFile(
+                      UpgradeLauncher.LOG_FILE_PREFIX + "-ext-",
+                      UpgradeLauncher.LOG_FILE_SUFFIX));
+    } catch (Throwable t) {
+      System.err.println("Unable to initialize log");
+      t.printStackTrace();
+    }
     new BuildExtractor(args).run();
   }
 
@@ -100,6 +114,7 @@
       retCode = 1;
       notifyListeners(t.getLocalizedMessage() + getLineBreak());
     }
+    LOG.log(Level.INFO, "extractor exiting code=" + retCode);
     System.exit(retCode);
   }
 
@@ -125,10 +140,10 @@
 
   private void expandZipFile(File buildFile)
           throws ApplicationException, IOException {
-    ZipExtractor extractor = new ZipExtractor(buildFile,
-            1, 10, // TODO figure out these values
-            Utils.getNumberZipEntries(), this);
+    LOG.log(Level.INFO, "expanding zip file " + buildFile.getPath());
+    ZipExtractor extractor = new ZipExtractor(buildFile);
     extractor.extract(getStageDirectory());
+    LOG.log(Level.INFO, "extraction finished");
   }
 
   private File getStageDirectory() throws ApplicationException {
@@ -136,7 +151,7 @@
     Installation installation = new Installation(getInstallationPath());
     stageDir = installation.getTemporaryUpgradeDirectory();
     if (stageDir.exists()) {
-      FileManager fm = new FileManager(this);
+      FileManager fm = new FileManager();
       fm.deleteRecursively(stageDir);
     }
     if (!stageDir.mkdirs()) {
@@ -144,6 +159,7 @@
       throw ApplicationException.createFileSystemException(
               "failed to create staging directory " + stageDir, null);
     }
+    LOG.log(Level.INFO, "stage directory " + stageDir.getPath());
     return stageDir;
   }
 
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
index 0933e11..195305b 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
@@ -28,6 +28,7 @@
 package org.opends.quicksetup.upgrader;
 
 import org.opends.quicksetup.Application;
+import org.opends.quicksetup.i18n.ResourceProvider;
 import org.opends.quicksetup.util.Utils;
 
 import javax.swing.*;
@@ -187,17 +188,30 @@
 
     try {
       is = conn.getInputStream();
+      int length = conn.getContentLength();
       fos = new FileOutputStream(destination);
       int i = 0;
       int bytesRead = 0;
       byte[] buf = new byte[1024];
+      app.notifyListeners(0,
+              getMsg("build-manager-downloading-build"),
+              null);
       while ((i = is.read(buf)) != -1) {
         fos.write(buf, 0, i);
-        bytesRead += i;
         if (app != null) {
-          app.notifyListeners(".");
+          bytesRead += i;
+          if (length > 0) {
+            int progress = (bytesRead * 100) / length;
+            app.notifyListeners(0,
+                    getMsg("build-manager-downloading-build-progress",
+                            String.valueOf(progress)),
+                    null);
+          }
         }
       }
+      app.notifyListeners(0,
+              getMsg("build-manager-downloading-build-done"),
+              null);
     } finally {
       if (is != null) {
         is.close();
@@ -379,6 +393,14 @@
     }
   }
 
+  private String getMsg(String key) {
+    return ResourceProvider.getInstance().getMsg(key);
+  }
+
+  private String getMsg(String key, String... args) {
+    return ResourceProvider.getInstance().getMsg(key, args);
+  }
+
   /**
    * For testing only.
    * @param args command line arguments
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index bf2b4ac..fdbd29c 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -89,50 +89,52 @@
    */
   enum UpgradeProgressStep implements ProgressStep {
 
-    NOT_STARTED("summary-upgrade-not-started"),
+    NOT_STARTED("summary-upgrade-not-started", 0),
 
-    DOWNLOADING("summary-upgrade-downloading"),
+    DOWNLOADING("summary-upgrade-downloading", 10),
 
-    EXTRACTING("summary-upgrade-extracting"),
+    EXTRACTING("summary-upgrade-extracting", 20),
 
-    INITIALIZING("summary-upgrade-initializing"),
+    INITIALIZING("summary-upgrade-initializing", 30),
 
-    CHECK_SERVER_HEALTH("summary-upgrade-check-server-health"),
+    CHECK_SERVER_HEALTH("summary-upgrade-check-server-health", 35),
 
     CALCULATING_SCHEMA_CUSTOMIZATIONS(
-            "summary-upgrade-calculating-schema-customization"),
+            "summary-upgrade-calculating-schema-customization", 40),
 
     CALCULATING_CONFIGURATION_CUSTOMIZATIONS(
-            "summary-upgrade-calculating-config-customization"),
+            "summary-upgrade-calculating-config-customization", 45),
 
-    BACKING_UP_DATABASES("summary-upgrade-backing-up-db"),
+    BACKING_UP_DATABASES("summary-upgrade-backing-up-db", 50),
 
-    BACKING_UP_FILESYSTEM("summary-upgrade-backing-up-files"),
+    BACKING_UP_FILESYSTEM("summary-upgrade-backing-up-files",55),
 
-    UPGRADING_COMPONENTS("summary-upgrade-upgrading-components"),
+    UPGRADING_COMPONENTS("summary-upgrade-upgrading-components", 60),
 
     APPLYING_SCHEMA_CUSTOMIZATIONS(
-            "summary-upgrade-applying-schema-customization"),
+            "summary-upgrade-applying-schema-customization", 70),
 
     APPLYING_CONFIGURATION_CUSTOMIZATIONS(
-            "summary-upgrade-applying-config-customization"),
+            "summary-upgrade-applying-config-customization", 75),
 
-    VERIFYING("summary-upgrade-verifying"),
+    VERIFYING("summary-upgrade-verifying", 80),
 
-    RECORDING_HISTORY("summary-upgrade-history"),
+    RECORDING_HISTORY("summary-upgrade-history", 85),
 
-    CLEANUP("summary-upgrade-cleanup"),
+    CLEANUP("summary-upgrade-cleanup", 90),
 
-    ABORT("summary-upgrade-abort"),
+    ABORT("summary-upgrade-abort", 95),
 
-    FINISHED_WITH_ERRORS("summary-upgrade-finished-with-errors"),
+    FINISHED_WITH_ERRORS("summary-upgrade-finished-with-errors", 100),
 
-    FINISHED("summary-upgrade-finished-successfully");
+    FINISHED("summary-upgrade-finished-successfully", 100);
 
     private String summaryMsgKey;
+    private int progress;
 
-    private UpgradeProgressStep(String summaryMsgKey) {
+    private UpgradeProgressStep(String summaryMsgKey, int progress) {
       this.summaryMsgKey = summaryMsgKey;
+      this.progress = progress;
     }
 
     /**
@@ -145,6 +147,14 @@
     }
 
     /**
+     * Gets the amount of progress to show in the progress meter for this step.
+     * @return int representing progress
+     */
+    public int getProgress() {
+      return this.progress;
+    }
+
+    /**
      * {@inheritDoc}
      */
     public boolean isLast() {
@@ -212,13 +222,19 @@
    */
   private Long historicalOperationId;
 
-  /** SVN rev number of the current build. */
+  /**
+   * SVN rev number of the current build.
+   */
   private Integer currentVersion = null;
 
-  /** New OpenDS bits. */
+  /**
+   * New OpenDS bits.
+   */
   private Installation stagedInstallation = null;
 
-  /** SVN rev number of the build in the stage directory. */
+  /**
+   * SVN rev number of the build in the stage directory.
+   */
   private Integer stagedVersion = null;
 
   private RemoteBuildManager remoteBuildManager = null;
@@ -267,6 +283,7 @@
   /**
    * Gets a remote build manager that this class can use to find
    * out about and download builds for upgrading.
+   *
    * @return RemoteBuildManager to use for builds
    */
   public RemoteBuildManager getRemoteBuildManager() {
@@ -356,11 +373,6 @@
     String txt = null;
     if (step == UpgradeProgressStep.FINISHED) {
       txt = getFinalSuccessMessage();
-    } else if (step == UpgradeProgressStep.FINISHED_WITH_ERRORS) {
-      txt = getMsg(((UpgradeProgressStep) step).getSummaryMesssageKey());
-      if (!Utils.isCli()) {
-        txt = formatter.getFormattedError(txt, true);
-      }
     } else {
       txt = getMsg(((UpgradeProgressStep) step).getSummaryMesssageKey());
     }
@@ -508,12 +520,12 @@
       Build buildToDownload = null;
       File buildFile = null;
       Boolean downloadFirst =
-              (Boolean)qs.getFieldValue(FieldName.UPGRADE_DOWNLOAD);
+              (Boolean) qs.getFieldValue(FieldName.UPGRADE_DOWNLOAD);
       if (downloadFirst) {
         buildToDownload =
-                (Build)qs.getFieldValue(FieldName.UPGRADE_BUILD_TO_DOWNLOAD);
+                (Build) qs.getFieldValue(FieldName.UPGRADE_BUILD_TO_DOWNLOAD);
       } else {
-        buildFile = (File)qs.getFieldValue(FieldName.UPGRADE_FILE);
+        buildFile = (File) qs.getFieldValue(FieldName.UPGRADE_FILE);
         if (buildFile == null) {
           errorMsgs.add("You must specify a path to an OpenDS build file");
         } else if (!buildFile.exists()) {
@@ -528,7 +540,7 @@
 
     if (errorMsgs.size() > 0) {
       throw new UserDataException(Step.SERVER_SETTINGS,
-          Utils.getStringFromCollection(errorMsgs, "\n"));
+              Utils.getStringFromCollection(errorMsgs, "\n"));
     }
 
   }
@@ -633,7 +645,7 @@
             throw new ApplicationException(
                     ApplicationException.Type.APPLICATION,
                     "Failed to download build package .zip " +
-                    "file from " + buildToDownload.getUrl(), e);
+                            "file from " + buildToDownload.getUrl(), e);
           }
           notifyListeners(formatter.getFormattedDone() +
                   formatter.getLineBreak());
@@ -648,10 +660,10 @@
       if (buildZip != null) {
         try {
           setCurrentProgressStep(UpgradeProgressStep.EXTRACTING);
-          ZipExtractor extractor = new ZipExtractor(buildZip,
-                  1, 10, // TODO figure out these values
-                  Utils.getNumberZipEntries(), this);
+          ZipExtractor extractor = new ZipExtractor(buildZip);
           extractor.extract(getStageDirectory());
+          notifyListeners(formatter.getFormattedDone() +
+                  formatter.getLineBreak());
         } catch (ApplicationException e) {
           LOG.log(Level.INFO, "Error extracting build file", e);
           throw e;
@@ -661,6 +673,8 @@
       try {
         setCurrentProgressStep(UpgradeProgressStep.INITIALIZING);
         initialize();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO, "Error initializing upgrader", e);
         throw e;
@@ -669,24 +683,32 @@
       try {
         setCurrentProgressStep(UpgradeProgressStep.CHECK_SERVER_HEALTH);
         checkServerHealth();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO, "Server failed initial health check", e);
         throw e;
       }
 
+      boolean schemaCustomizationPresent = false;
       try {
         setCurrentProgressStep(
                 UpgradeProgressStep.CALCULATING_SCHEMA_CUSTOMIZATIONS);
-        calculateSchemaCustomizations();
+        schemaCustomizationPresent = calculateSchemaCustomizations();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO, "Error calculating schema customizations", e);
         throw e;
       }
 
+      boolean configCustimizationPresent = false;
       try {
         setCurrentProgressStep(
                 UpgradeProgressStep.CALCULATING_CONFIGURATION_CUSTOMIZATIONS);
-        calculateConfigCustomizations();
+        configCustimizationPresent = calculateConfigCustomizations();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO,
                 "Error calculating config customizations", e);
@@ -696,6 +718,8 @@
       try {
         setCurrentProgressStep(UpgradeProgressStep.BACKING_UP_DATABASES);
         backupDatabases();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO, "Error backing up databases", e);
         throw e;
@@ -704,6 +728,8 @@
       try {
         setCurrentProgressStep(UpgradeProgressStep.BACKING_UP_FILESYSTEM);
         backupFilesytem();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO, "Error backing up files", e);
         throw e;
@@ -725,50 +751,59 @@
       //*  The two steps following this step require
       //*  the server to be started 'in process'.
       // *******************************************
-      try {
-        startServerWithoutConnectionHandlers();
-      } catch (ApplicationException e) {
-        LOG.log(Level.INFO,
-                "Error starting server in process in order to apply custom" +
-                        "schema and/or configuration", e);
-        throw e;
-      }
+      if (schemaCustomizationPresent || configCustimizationPresent) {
+        try {
+          startServerWithoutConnectionHandlers();
+        } catch (ApplicationException e) {
+          LOG.log(Level.INFO,
+                  "Error starting server in process in order to apply custom" +
+                          "schema and/or configuration", e);
+          throw e;
+        }
 
-      try {
-        setCurrentProgressStep(
-                UpgradeProgressStep.APPLYING_SCHEMA_CUSTOMIZATIONS);
-        applySchemaCustomizations();
-      } catch (ApplicationException e) {
-        LOG.log(Level.INFO,
-                "Error applying schema customizations", e);
-        throw e;
-      }
+        if (schemaCustomizationPresent) {
+          try {
+            setCurrentProgressStep(
+                    UpgradeProgressStep.APPLYING_SCHEMA_CUSTOMIZATIONS);
+            applySchemaCustomizations();
+            notifyListeners(formatter.getFormattedDone() +
+                    formatter.getLineBreak());
+          } catch (ApplicationException e) {
+            LOG.log(Level.INFO,
+                    "Error applying schema customizations", e);
+            throw e;
+          }
+        }
 
-      try {
-        setCurrentProgressStep(
-                UpgradeProgressStep.APPLYING_CONFIGURATION_CUSTOMIZATIONS);
-        applyConfigurationCustomizations();
-      } catch (ApplicationException e) {
-        LOG.log(Level.INFO,
-                "Error applying configuration customizations", e);
-        throw e;
-      }
+        if (configCustimizationPresent) {
+          try {
+            setCurrentProgressStep(
+                    UpgradeProgressStep.APPLYING_CONFIGURATION_CUSTOMIZATIONS);
+            applyConfigurationCustomizations();
+            notifyListeners(formatter.getFormattedDone() +
+                    formatter.getLineBreak());
+          } catch (ApplicationException e) {
+            LOG.log(Level.INFO,
+                    "Error applying configuration customizations", e);
+            throw e;
+          }
+        }
 
-      try {
-        getServerController().stopServerInProcess();
-      } catch (Throwable t) {
-        LOG.log(Level.INFO,
-                "Error applying configuration customizations", t);
-        throw new ApplicationException(ApplicationException.Type.BUG,
-                "Error stopping server in process", t);
+        try {
+          getServerController().stopServerInProcess();
+        } catch (Throwable t) {
+          LOG.log(Level.INFO,
+                  "Error applying configuration customizations", t);
+          throw new ApplicationException(ApplicationException.Type.BUG,
+                  "Error stopping server in process", t);
+        }
       }
 
       // This allows you to test whether or not he upgrader can successfully
       // abort an upgrade once changes have been made to the installation
       // path's filesystem.
       if ("true".equals(
-              System.getProperty(SYS_PROP_CREATE_ERROR)))
-      {
+              System.getProperty(SYS_PROP_CREATE_ERROR))) {
         throw new ApplicationException(
                 null, "ARTIFICIAL ERROR FOR TESTING ABORT PROCESS", null);
       }
@@ -776,6 +811,8 @@
       try {
         setCurrentProgressStep(UpgradeProgressStep.VERIFYING);
         verifyUpgrade();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
       } catch (ApplicationException e) {
         LOG.log(Level.INFO,
                 "Error verifying upgrade", e);
@@ -803,21 +840,28 @@
           ProgressStep lastProgressStep = getCurrentProgressStep();
           setCurrentProgressStep(UpgradeProgressStep.ABORT);
           abort(lastProgressStep);
+          notifyListeners(formatter.getFormattedDone() +
+                  formatter.getLineBreak());
         }
 
         setCurrentProgressStep(UpgradeProgressStep.CLEANUP);
         cleanup();
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
+
 
         // Write a record in the log file indicating success/failure
         setCurrentProgressStep(UpgradeProgressStep.RECORDING_HISTORY);
-        notifyListeners("See '" +
-                Utils.getPath(getInstallation().getHistoryLogFile()) +
-                "'" + formatter.getLineBreak());
         writeHistoricalRecord(historicalOperationId,
                 getCurrentVersion(),
                 getStagedVersion(),
                 status,
                 note);
+        notifyListeners(formatter.getFormattedDone() +
+                formatter.getLineBreak());
+        notifyListeners("See '" +
+                Utils.getPath(getInstallation().getHistoryLogFile()) +
+                "' for upgrade history" + formatter.getLineBreak());
       } catch (ApplicationException e) {
         System.err.print("Error cleaning up after upgrade: " +
                 e.getLocalizedMessage());
@@ -829,6 +873,7 @@
     // It would be nice if this were simpler.
 
     if (runException == null) {
+      LOG.log(Level.INFO, "upgrade completed successfully");
       if (!Utils.isCli()) {
 
         notifyListenersOfLog();
@@ -841,7 +886,7 @@
         notifyListeners(null);
 
       } else {
-        notifyListeners(getFinalSuccessMessage());
+        notifyListeners(100, getFinalSuccessMessage());
 
         // Don't do this until we've printed out last message
         // as doing so tells the CLI that it is finished and
@@ -850,8 +895,12 @@
       }
 
     } else {
+      LOG.log(Level.INFO, "upgrade completed with errors", runException);
       if (!Utils.isCli()) {
-        notifyListeners(formatter.getFormattedError(runException, true));
+        notifyListeners(100,
+                getMsg(UpgradeProgressStep.FINISHED_WITH_ERRORS.
+                        getSummaryMesssageKey()),
+                formatter.getFormattedError(runException, true));
         notifyListenersOfLog();
         notifyListeners(null);
         setCurrentProgressStep(UpgradeProgressStep.FINISHED_WITH_ERRORS);
@@ -870,7 +919,7 @@
    */
   private void checkServerHealth() throws ApplicationException {
     Installation installation = getInstallation();
-    ServerController control = new ServerController(this, installation);
+    ServerController control = new ServerController(installation);
     try {
       if (installation.getStatus().isServerRunning()) {
         control.stopServer();
@@ -925,7 +974,7 @@
       File backupDirectory;
       try {
         backupDirectory = getFilesBackupDirectory();
-        FileManager fm = new FileManager(this);
+        FileManager fm = new FileManager();
         boolean restoreError = false;
         for (String fileName : backupDirectory.list()) {
           File f = new File(backupDirectory, fileName);
@@ -960,7 +1009,7 @@
   }
 
   private void verifyUpgrade() throws ApplicationException {
-    ServerController sc = new ServerController(this);
+    ServerController sc = new ServerController(getInstallation());
     OperationOutput op = sc.startServer();
     if (op.getErrors() != null) {
       throw new ApplicationException(ApplicationException.Type.APPLICATION,
@@ -1016,15 +1065,16 @@
   /**
    * Applies configuration or schema customizations.
    * NOTE: Assumes that the server is running in process.
+   *
    * @param ldifFile LDIF file to apply
    * @throws IOException
    * @throws org.opends.server.util.LDIFException
+   *
    * @throws ApplicationException
    */
   private void applyCustomizationLdifFile(File ldifFile)
           throws IOException, org.opends.server.util.LDIFException,
-          ApplicationException
-  {
+          ApplicationException {
     try {
       org.opends.server.protocols.internal.InternalClientConnection cc =
               org.opends.server.protocols.internal.
@@ -1055,26 +1105,19 @@
           }
           if (rc.equals(org.opends.server.types.ResultCode.
                   SUCCESS)) {
-            if (org.opends.server.core.DirectoryServer.checkSchema()) {
-              notifyListeners(
-                      getMsg("upgrade-mod",
-                              modListToString(op.getModifications()))
-                      + formatter.getLineBreak());
-            } else {
-              notifyListeners(
-                      getMsg("upgrade-mod-no-schema",
-                              modListToString(op.getModifications()))
-                      + formatter.getLineBreak());
+            LOG.log(Level.INFO, "processed server modification " +
+                    (org.opends.server.core.DirectoryServer.checkSchema() ?
+                            ":" : "(schema checking off):" +
+                            modListToString(op.getModifications())));
+            if (!org.opends.server.core.DirectoryServer.checkSchema()) {
               org.opends.server.core.DirectoryServer.setCheckSchema(true);
             }
           } else if (rc.equals(
                   org.opends.server.types.ResultCode.
                           ATTRIBUTE_OR_VALUE_EXISTS)) {
             // ignore this error
-            notifyListeners(
-                    getMsg("upgrade-mod-ignore",
-                            modListToString(op.getModifications()))
-                    + formatter.getLineBreak());
+            LOG.log(Level.INFO, "ignoring attribute that already exists: " +
+                    modListToString(op.getModifications()));
           } else {
             // report the error to the user
             StringBuilder error = op.getErrorMessage();
@@ -1102,7 +1145,7 @@
   private String modListToString(
           List<org.opends.server.types.Modification> modifications) {
     StringBuilder modsMsg = new StringBuilder();
-    for(int i = 0; i < modifications.size(); i++) {
+    for (int i = 0; i < modifications.size(); i++) {
       modsMsg.append(modifications.get(i).toString());
       if (i < modifications.size() - 1) {
         modsMsg.append(" ");
@@ -1150,7 +1193,7 @@
     try {
       File stageDir = getStageDirectory();
       File root = getInstallation().getRootDirectory();
-      FileManager fm = new FileManager(this);
+      FileManager fm = new FileManager();
       for (String fileName : stageDir.list()) {
         File f = new File(stageDir, fileName);
         fm.copyRecursively(f, root,
@@ -1163,29 +1206,32 @@
     }
   }
 
-  private void calculateConfigCustomizations() throws ApplicationException {
+  private boolean calculateConfigCustomizations() throws ApplicationException {
+    boolean isCustom = false;
     try {
       if (getInstallation().getCurrentConfiguration().hasBeenModified()) {
+        isCustom = true;
+        LOG.log(Level.INFO, "Configuration contains customizations that will " +
+                "be migrated");
         try {
           ldifDiff(getInstallation().getBaseConfigurationFile(),
-                   getInstallation().getCurrentConfigurationFile(),
-                   getCustomConfigDiffFile());
+                  getInstallation().getCurrentConfigurationFile(),
+                  getCustomConfigDiffFile());
         } catch (Exception e) {
           throw ApplicationException.createFileSystemException(
                   "Error determining configuration customizations: "
-                  + e.getLocalizedMessage(), e);
+                          + e.getLocalizedMessage(), e);
         }
       } else {
-        // TODO i18n
-        notifyListeners("No configuration customizations to migrate" +
-                formatter.getLineBreak());
+        LOG.log(Level.INFO, "No configuration customizations to migrate");
       }
     } catch (IOException e) {
       // TODO i18n
       throw ApplicationException.createFileSystemException(
               "Could not determine configuration modifications: " +
-              e.getLocalizedMessage(), e);
+                      e.getLocalizedMessage(), e);
     }
+    return isCustom;
   }
 
   private void ldifDiff(File source, File target, File output)
@@ -1205,9 +1251,9 @@
     args.add("-S"); // single-value changes
 
     // TODO i18n
-    notifyListeners(formatter.getFormattedWithPoints("Diff'ing " +
+    LOG.log(Level.INFO, "Diff'ing " +
             Utils.getPath(source) + " with " +
-            Utils.getPath(target)));
+            Utils.getPath(target));
 
     int ret = org.opends.server.tools.LDIFDiff.mainDiff(
             args.toArray(new String[]{}), false);
@@ -1217,41 +1263,36 @@
               .append(ret)
               .append(" when invoked with args: ")
               .append(Utils.listToString(args, " "));
-      notifyListeners(formatter.getLineBreak());
       throw ApplicationException.createFileSystemException(sb.toString(),
               null);
-    } else {
-      notifyListeners(formatter.getFormattedDone() + formatter.getLineBreak());
     }
   }
 
-  private void calculateSchemaCustomizations() throws ApplicationException {
+  private boolean calculateSchemaCustomizations() throws ApplicationException {
+    boolean isCustom = false;
     if (getInstallation().getStatus().schemaHasBeenModified()) {
-
-      // TODO i18n
-      notifyListeners(
-              "Schema contains customizations and needs to be migrated" +
-              formatter.getLineBreak());
+      isCustom = true;
+      LOG.log(Level.INFO, "Schema contains customizations that will " +
+              "be migrated");
       try {
         ldifDiff(getInstallation().getBaseSchemaFile(),
-                 getInstallation().getSchemaConcatFile(),
-                 getCustomSchemaDiffFile());
+                getInstallation().getSchemaConcatFile(),
+                getCustomSchemaDiffFile());
       } catch (Exception e) {
         throw ApplicationException.createFileSystemException(
                 "Error determining schema customizations: " +
-                e.getLocalizedMessage(), e);
+                        e.getLocalizedMessage(), e);
       }
     } else {
-      // TODO i18n
-      notifyListeners("No schema customizations to migrate" +
-              formatter.getLineBreak());
+      LOG.log(Level.INFO, "No schema customizations to migrate");
     }
+    return isCustom;
   }
 
   private void backupFilesytem() throws ApplicationException {
     try {
       File filesBackupDirectory = getFilesBackupDirectory();
-      FileManager fm = new FileManager(this);
+      FileManager fm = new FileManager();
       File root = getInstallation().getRootDirectory();
       FileFilter filter = new UpgradeFileFilter(root);
       for (String fileName : root.list()) {
@@ -1306,7 +1347,7 @@
     File stagingDir = null;
     try {
       stagingDir = getStageDirectory();
-      FileManager fm = new FileManager(this);
+      FileManager fm = new FileManager();
 
       // Doing this seems to work better than just plain
       // old delete.  Note that on Windows there are file
@@ -1321,7 +1362,7 @@
       throw ApplicationException.createFileSystemException(
               "Error attempting to clean up tmp directory " +
                       stagingDir != null ? stagingDir.getName() : "null" +
-              ": " + e.getLocalizedMessage(),
+                      ": " + e.getLocalizedMessage(),
               e);
     }
   }
@@ -1358,7 +1399,7 @@
       LOG.log(Level.INFO, "error", e);
       throw ApplicationException.createFileSystemException(
               "Could not determine current build information: " +
-              e.getLocalizedMessage(), e);
+                      e.getLocalizedMessage(), e);
     }
 
     try {
@@ -1367,7 +1408,7 @@
       LOG.log(Level.INFO, "error", e);
       throw ApplicationException.createFileSystemException(
               "Could not determine upgrade build information: " +
-              e.getLocalizedMessage(), e);
+                      e.getLocalizedMessage(), e);
     }
 
     UpgradeOracle uo = new UpgradeOracle(currentVersion, newVersion);
@@ -1426,8 +1467,9 @@
 
   private void setCurrentProgressStep(UpgradeProgressStep step) {
     this.currentProgressStep = step;
+    int progress = step.getProgress();
     String msg = getSummary(step);
-    notifyListeners(getFormattedProgress(msg) + getLineBreak());
+    notifyListeners(progress, getFormattedProgress(msg), msg);
   }
 
   private UpgraderCliHelper getCliHelper() {
diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java b/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
index 20e011a..d684b47 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
@@ -31,6 +31,8 @@
 import org.opends.quicksetup.i18n.ResourceProvider;
 
 import java.io.*;
+import java.util.logging.Logger;
+import java.util.logging.Level;
 
 /**
  * Utility class for use by applications containing methods for managing
@@ -39,11 +41,22 @@
  */
 public class FileManager {
 
+  static private final Logger LOG =
+          Logger.getLogger(FileManager.class.getName());
+
   private Application application = null;
 
   /**
    * Creates a new file manager.
-   * @param app Application managing files.
+   */
+  public FileManager() {
+    // do nothing;
+  }
+
+  /**
+   * Creates a new file manager.
+   * @param app Application managing files to which progress notifications
+   * will be sent
    */
   public FileManager(Application app) {
     this.application = app;
@@ -208,8 +221,13 @@
     } else {
       // Just tell that the file/directory does not exist.
       String[] arg = {file.toString()};
-      application.notifyListeners(application.getFormattedWarning(
-              getMsg("file-does-not-exist", arg)));
+
+
+      if (application != null) {
+        application.notifyListeners(application.getFormattedWarning(
+                getMsg("file-does-not-exist", arg)));
+      }
+      LOG.log(Level.INFO, "file '" + file.toString() + "' does not exist");
     }
   }
 
@@ -299,9 +317,13 @@
 
         if (!destination.exists()) {
           if (Utils.insureParentsExist(destination)) {
-            application.notifyListeners(application.getFormattedWithPoints(
-                    getMsg("progress-copying-file", args)));
-
+            if (application != null) {
+              application.notifyListeners(application.getFormattedWithPoints(
+                      getMsg("progress-copying-file", args)));
+            }
+            LOG.log(Level.INFO, "copying file '" +
+                    objectFile.getAbsolutePath() + "' to '" +
+                    destination.getAbsolutePath() + "'");
             try {
               FileInputStream fis = new FileInputStream(objectFile);
               FileOutputStream fos = new FileOutputStream(destination);
@@ -325,8 +347,10 @@
                 }
               }
 
-              application.notifyListeners(application.getFormattedDone() +
-                      application.getLineBreak());
+              if (application != null) {
+                application.notifyListeners(application.getFormattedDone() +
+                        application.getLineBreak());
+              }
 
             } catch (Exception e) {
               String errMsg = getMsg("error-copying-file", args);
@@ -340,8 +364,13 @@
                     ApplicationException.Type.FILE_SYSTEM_ERROR, errMsg, null);
           }
         } else {
-          application.notifyListeners(getMsg("info-ignoring-file", args) +
-                  application.getLineBreak());
+          LOG.log(Level.INFO, "Ignoring file '" +
+                  objectFile.getAbsolutePath() + "' since '" +
+                  destination.getAbsolutePath() + "' already exists");
+          if (application != null) {
+            application.notifyListeners(getMsg("info-ignoring-file", args) +
+                    application.getLineBreak());
+          }
         }
       }
     }
@@ -382,13 +411,18 @@
       String[] arg = {file.getAbsolutePath()};
       boolean isFile = file.isFile();
 
-      if (isFile) {
-        application.notifyListeners(application.getFormattedWithPoints(
-                getMsg("progress-deleting-file", arg)));
-      } else {
-        application.notifyListeners(application.getFormattedWithPoints(
-                getMsg("progress-deleting-directory", arg)));
+      if (application != null) {
+        if (isFile) {
+          application.notifyListeners(application.getFormattedWithPoints(
+                  getMsg("progress-deleting-file", arg)));
+        } else {
+          application.notifyListeners(application.getFormattedWithPoints(
+                  getMsg("progress-deleting-directory", arg)));
+        }
       }
+      LOG.log(Level.INFO, "deleting " +
+              (isFile ? " file " : " directory ") +
+              file.getAbsolutePath());
 
       boolean delete = false;
       /*
@@ -425,8 +459,10 @@
                 ApplicationException.Type.FILE_SYSTEM_ERROR, errMsg, null);
       }
 
-      application.notifyListeners(application.getFormattedDone() +
-              application.getLineBreak());
+      if (application != null) {
+        application.notifyListeners(application.getFormattedDone() +
+                application.getLineBreak());
+      }
     }
   }
 
diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java b/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
index 3a19f43..b6e4ab1 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/ServerController.java
@@ -28,12 +28,15 @@
 package org.opends.quicksetup.util;
 
 import org.opends.quicksetup.*;
+import org.opends.quicksetup.i18n.ResourceProvider;
 import org.opends.quicksetup.installer.InstallerHelper;
 
 import javax.naming.NamingException;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.IOException;
@@ -43,6 +46,9 @@
  */
 public class ServerController {
 
+  static private final Logger LOG =
+          Logger.getLogger(ServerController.class.getName());
+
   private Application application;
 
   private Installation installation;
@@ -57,15 +63,21 @@
   }
 
   /**
+   * Creates a new instance that will operate on <code>application</code>'s
+   * installation.
+   * @param installation representing the server instance to control
+   */
+  public ServerController(Installation installation) {
+    this(null, installation);
+  }
+
+  /**
    * Creates a new instance that will operate on <code>installation</code>
    * and use <code>application</code> for notifications.
    * @param application to use for notifications
    * @param installation representing the server instance to control
    */
   public ServerController(Application application, Installation installation) {
-    if (application == null) {
-      throw new NullPointerException("application cannot be null");
-    }
     if (installation == null) {
       throw new NullPointerException("installation cannot be null");
     }
@@ -79,10 +91,13 @@
    * @throws org.opends.quicksetup.ApplicationException if something goes wrong.
    */
   public void stopServer() throws ApplicationException {
-    application.notifyListeners(
-            application.getFormattedProgress(
-                    application.getMsg("progress-stopping")) +
-                    application.getLineBreak());
+    if (application != null) {
+      application.notifyListeners(
+              application.getFormattedProgress(
+                      application.getMsg("progress-stopping")) +
+                      application.getLineBreak());
+    }
+    LOG.log(Level.INFO, "stopping server");
 
     ArrayList<String> argList = new ArrayList<String>();
     argList.add(Utils.getPath(installation.getServerStopCommandFile()));
@@ -131,11 +146,15 @@
             stopped = !CurrentInstallStatus.isServerRunning(
                     installation.getLocksDirectory());
             if (!stopped) {
-              String msg =
-                      application.getFormattedLog(
-                        application.getMsg("progress-server-waiting-to-stop")) +
-                        application.getLineBreak();
-              application.notifyListeners(msg);
+              if (application != null) {
+                String msg =
+                        application.getFormattedLog(
+                                application.getMsg(
+                                        "progress-server-waiting-to-stop")) +
+                                application.getLineBreak();
+                application.notifyListeners(msg);
+              }
+              LOG.log(Level.FINE, "waiting for server to stop");
               try {
                 Thread.sleep(5000);
               }
@@ -151,36 +170,38 @@
       }
 
       if (returnValue == clientSideError) {
-        String msg = application.getLineBreak() +
-                application.getFormattedLog(
-                        application.getMsg("progress-server-already-stopped")) +
-                    application.getLineBreak();
-        application.notifyListeners(msg);
+        if (application != null) {
+          String msg = application.getLineBreak() +
+                  application.getFormattedLog(
+                          application.getMsg(
+                                  "progress-server-already-stopped")) +
+                  application.getLineBreak();
+          application.notifyListeners(msg);
+        }
+        LOG.log(Level.INFO, "server already stopped");
 
       } else if (returnValue != 0) {
-        String[] arg = {String.valueOf(returnValue)};
-        String msg = application.getMsg("error-stopping-server-code", arg);
-
         /*
          * The return code is not the one expected, assume the server could
          * not be stopped.
          */
         throw new ApplicationException(ApplicationException.Type.STOP_ERROR,
-                msg,
+                ResourceProvider.getInstance().getMsg(
+                        "error-stopping-server-code",
+                        String.valueOf(returnValue)),
                 null);
       } else {
-        String msg = application.getFormattedLog(
-                application.getMsg("progress-server-stopped"));
-        application.notifyListeners(msg);
+        if (application != null) {
+          String msg = application.getFormattedLog(
+                  application.getMsg("progress-server-stopped"));
+          application.notifyListeners(msg);
+        }
+        LOG.log(Level.INFO, "server stopped");
       }
 
-    } catch (IOException ioe) {
+    } catch (Exception e) {
       throw new ApplicationException(ApplicationException.Type.STOP_ERROR,
-              application.getThrowableMsg("error-stopping-server", ioe), ioe);
-    }
-    catch (InterruptedException ie) {
-      throw new ApplicationException(ApplicationException.Type.BUG,
-              application.getThrowableMsg("error-stopping-server", ie), ie);
+              getThrowableMsg("error-stopping-server", e), e);
     }
   }
 
@@ -245,10 +266,13 @@
           throws ApplicationException
   {
     OperationOutput output = new OperationOutput();
-    application.notifyListeners(
-            application.getFormattedProgress(
-                    application.getMsg("progress-starting")) +
-        application.getLineBreak());
+    if (application != null) {
+      application.notifyListeners(
+              application.getFormattedProgress(
+                      application.getMsg("progress-starting")) +
+          application.getLineBreak());
+    }
+    LOG.log(Level.INFO, "starting server");
 
     ArrayList<String> argList = new ArrayList<String>();
     argList.add(Utils.getPath(installation.getServerStartCommandFile()));
@@ -331,15 +355,18 @@
          * Try 5 times with an interval of 1 second between try.
          */
         boolean connected = false;
-        Configuration config =
-                application.getInstallation().getCurrentConfiguration();
+        Configuration config = installation.getCurrentConfiguration();
         int port = config.getPort();
         String ldapUrl = "ldap://localhost:" + port;
 
         // See if the application has prompted for credentials.  If
         // not we'll just try to connect anonymously.
-        String userDn = application.getUserData().getDirectoryManagerDn();
-        String userPw = application.getUserData().getDirectoryManagerPwd();
+        String userDn = null;
+        String userPw = null;
+        if (application != null) {
+          userDn = application.getUserData().getDirectoryManagerDn();
+          userPw = application.getUserData().getDirectoryManagerPwd();
+        }
         if (userDn == null || userPw == null) {
           userDn = null;
           userPw = null;
@@ -370,20 +397,21 @@
         }
         if (!connected)
         {
-          String[] arg = {String.valueOf(port)};
           if (Utils.isWindows())
           {
-
             throw new ApplicationException(
                 ApplicationException.Type.START_ERROR,
-                application.getMsg("error-starting-server-in-windows", arg),
+                    getMsg("error-starting-server-in-windows",
+                            String.valueOf(port)),
                     null);
           }
           else
           {
             throw new ApplicationException(
                 ApplicationException.Type.START_ERROR,
-                application.getMsg("error-starting-server-in-unix", arg), null);
+                    getMsg("error-starting-server-in-unix",
+                            String.valueOf(port)),
+                    null);
           }
         }
       }
@@ -391,7 +419,8 @@
     } catch (IOException ioe)
     {
       throw new ApplicationException(ApplicationException.Type.START_ERROR,
-          application.getThrowableMsg("error-starting-server", ioe), ioe);
+              getThrowableMsg("error-starting-server", ioe),
+              ioe);
     }
     return output;
   }
@@ -421,7 +450,7 @@
     directoryServer.bootstrapServer();
     String configClass = "org.opends.server.extensions.ConfigFileHandler";
     String configPath = Utils.getPath(
-            application.getInstallation().getCurrentConfigurationFile());
+            installation.getCurrentConfigurationFile());
     directoryServer.initializeConfiguration(configClass, configPath);
     directoryServer.startServer();
   }
@@ -444,39 +473,40 @@
      * @param isError a boolean indicating whether the BufferedReader
      *        corresponds to the standard error or to the standard output.
      */
-    public StopReader(final BufferedReader reader, final boolean isError) {
+    public StopReader(final BufferedReader reader,
+                                      final boolean isError) {
       final String errorTag =
               isError ? "error-reading-erroroutput" : "error-reading-output";
 
       isFirstLine = true;
-
       Thread t = new Thread(new Runnable() {
         public void run() {
           try {
             String line = reader.readLine();
             while (line != null) {
-              StringBuilder buf = new StringBuilder();
-              if (!isFirstLine) {
-                buf.append(application.getProgressMessageFormatter().
-                        getLineBreak());
+              if (application != null) {
+                StringBuilder buf = new StringBuilder();
+                if (!isFirstLine) {
+                  buf.append(application.getProgressMessageFormatter().
+                          getLineBreak());
+                }
+                if (isError) {
+                  buf.append(application.getFormattedLogError(line));
+                } else {
+                  buf.append(application.getFormattedLog(line));
+                }
+                application.notifyListeners(buf.toString());
+                isFirstLine = false;
               }
-              if (isError) {
-                buf.append(application.getFormattedLogError(line));
-              } else {
-                buf.append(application.getFormattedLog(line));
-              }
-              application.notifyListeners(buf.toString());
-              isFirstLine = false;
-
+              LOG.log(Level.INFO, "server: " + line);
               line = reader.readLine();
             }
-          } catch (IOException ioe) {
-            String errorMsg = application.getThrowableMsg(errorTag, ioe);
-            application.notifyListeners(errorMsg);
-
           } catch (Throwable t) {
-            String errorMsg = application.getThrowableMsg(errorTag, t);
-            application.notifyListeners(errorMsg);
+            if (application != null) {
+              String errorMsg = application.getThrowableMsg(errorTag, t);
+              application.notifyListeners(errorMsg);
+            }
+            LOG.log(Level.INFO, "error reading server messages",t);
           }
         }
       });
@@ -537,22 +567,24 @@
             String line = reader.readLine();
             while (line != null)
             {
-              StringBuffer buf = new StringBuffer();
-              if (!isFirstLine)
-              {
-                buf.append(application.getProgressMessageFormatter().
-                        getLineBreak());
+              if (application != null) {
+                StringBuffer buf = new StringBuffer();
+                if (!isFirstLine)
+                {
+                  buf.append(application.getProgressMessageFormatter().
+                          getLineBreak());
+                }
+                if (isError)
+                {
+                  buf.append(application.getFormattedLogError(line));
+                } else
+                {
+                  buf.append(application.getFormattedLog(line));
+                }
+                application.notifyListeners(buf.toString());
+                isFirstLine = false;
               }
-              if (isError)
-              {
-                buf.append(application.getFormattedLogError(line));
-              } else
-              {
-                buf.append(application.getFormattedLog(line));
-              }
-              application.notifyListeners(buf.toString());
-              isFirstLine = false;
-
+              LOG.log(Level.INFO, "server: " + line);
               if (line.indexOf("id=" + startedId) != -1)
               {
                 isFinished = true;
@@ -569,19 +601,12 @@
 
               line = reader.readLine();
             }
-          } catch (IOException ioe)
-          {
-            String errorMsg = application.getThrowableMsg(errorTag, ioe);
-            ex =
-                new ApplicationException(ApplicationException.Type.START_ERROR,
-                    errorMsg, ioe);
-
           } catch (Throwable t)
           {
-            String errorMsg = application.getThrowableMsg(errorTag, t);
             ex =
                 new ApplicationException(ApplicationException.Type.START_ERROR,
-                    errorMsg, t);
+                    getThrowableMsg(errorTag, t), t);
+
           }
           isFinished = true;
         }
@@ -616,4 +641,17 @@
     }
   }
 
+  private String getMsg(String key) {
+    return ResourceProvider.getInstance().getMsg(key);
+  }
+
+  private String getMsg(String key, String... args) {
+    return ResourceProvider.getInstance().getMsg(key, args);
+  }
+
+  private String getThrowableMsg(String key, Throwable t) {
+    return Utils.getThrowableMsg(ResourceProvider.getInstance(),
+            key, null, t);
+  }
+
 }
diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java b/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java
index 662e23e..801355b 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/ZipExtractor.java
@@ -37,6 +37,8 @@
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * Class for extracting the contents of a zip file and managing
@@ -44,6 +46,9 @@
  */
 public class ZipExtractor {
 
+  static private final Logger LOG =
+          Logger.getLogger(ZipExtractor.class.getName());
+
   private InputStream is;
   private int minRatio;
   private int maxRatio;
@@ -54,6 +59,18 @@
   /**
    * Creates an instance of an ZipExtractor.
    * @param zipFile File the zip file to extract
+   * @throws FileNotFoundException if the specified file does not exist
+   * @throws IllegalArgumentException if the zip file is not a zip file
+   */
+  public ZipExtractor(File zipFile)
+    throws FileNotFoundException, IllegalArgumentException
+  {
+    this(zipFile, 0, 0, 1, null);
+  }
+
+  /**
+   * Creates an instance of an ZipExtractor.
+   * @param zipFile File the zip file to extract
    * @param minRatio int indicating the max ration
    * @param maxRatio int indicating the min ration
    * @param numberZipEntries number of entries in the input stream
@@ -146,7 +163,7 @@
           try
           {
             copyZipEntry(entry, destination, zipFirstPath, zipIn,
-            ratioBeforeCompleted, ratioWhenCompleted, permissions, application);
+            ratioBeforeCompleted, ratioWhenCompleted, permissions);
 
           } catch (IOException ioe)
           {
@@ -219,13 +236,11 @@
    * copied.
    * @param permissions an ArrayList with permissions whose contents will be
    * updated.
-   * @param app Application to be notified about progress
    * @throws IOException if an error occurs.
    */
   private void copyZipEntry(ZipEntry entry, String basePath,
       String zipFirstPath, ZipInputStream is, int ratioBeforeCompleted,
-      int ratioWhenCompleted, Map<String, ArrayList<String>> permissions,
-      Application app)
+      int ratioWhenCompleted, Map<String, ArrayList<String>> permissions)
       throws IOException
   {
     String entryName = entry.getName();
@@ -235,10 +250,13 @@
       entryName = entryName.substring(zipFirstPath.length());
     }
     File path = new File(basePath, entryName);
-    String progressSummary =
-            ResourceProvider.getInstance().getMsg("progress-extracting",
-                    new String[]{ Utils.getPath(path) });
-    app.notifyListeners(ratioBeforeCompleted, progressSummary);
+    if (application != null) {
+      String progressSummary =
+              ResourceProvider.getInstance().getMsg("progress-extracting",
+                      new String[]{ Utils.getPath(path) });
+      application.notifyListeners(ratioBeforeCompleted, progressSummary);
+    }
+    LOG.log(Level.INFO, "extracting " + Utils.getPath(path));
     if (Utils.insureParentsExist(path))
     {
       if (entry.isDirectory())
@@ -272,7 +290,9 @@
     {
       throw new IOException("Could not create parent path: " + path);
     }
-    application.notifyListenersDone(ratioWhenCompleted);
+    if (application != null) {
+      application.notifyListenersDone(ratioWhenCompleted);
+    }
   }
 
   /**
diff --git a/opends/src/statuspanel/org/opends/statuspanel/i18n/ResourceProvider.java b/opends/src/statuspanel/org/opends/statuspanel/i18n/ResourceProvider.java
index b3aabbe..0d0d403 100644
--- a/opends/src/statuspanel/org/opends/statuspanel/i18n/ResourceProvider.java
+++ b/opends/src/statuspanel/org/opends/statuspanel/i18n/ResourceProvider.java
@@ -129,7 +129,7 @@
    * @throws IllegalArgumentException if the key could not be found in the
    * properties file.
    */
-  public String getMsg(String key, String[] args)
+  public String getMsg(String key, String... args)
   throws IllegalArgumentException
   {
     String msg;

--
Gitblit v1.10.0