From 6df6635f1250c399a2f39d87d0534301ce4c22d7 Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Fri, 31 Aug 2007 15:43:58 +0000
Subject: [PATCH] Exposes the reversion functionality of the upgrader (issue 2169).  Originally it was intended to be exposed as a new script but in order to avoid the negativity of having a command devoted to undoing the upgrade and to avoid more scripts in the top-level directory, I've exposed the functionality as 2 new options in the existing upgrade script.  I will update the Wiki with documentation for these new options soon.

---
 opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java |  118 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 82 insertions(+), 36 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
index d0200ee..a17d7cc 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
@@ -43,10 +43,17 @@
 import java.util.logging.Logger;
 
 /**
- * BuildExtractor unzips an OpenDS installation package (.zip file) from a user
- * specified location into the current builds staging directory.  This Java
- * program handles this task so that we don't need to rely on the operating
- * system's tools for managing zip files.
+ * BuildExtractor runs prior to an upgrade or reversion operation.  Its main
+ * purpose is to unzip an OpenDS installation package (.zip file) from a user
+ * specified location into the current builds staging directory.  However,
+ * this program is also responsible for determining whether or not this
+ * invocation is intended to be an upgrade or reversion operation.  If this
+ * is a reversion, this program just exists with the appropriate exit code
+ * indicating reversion.  If this is an upgrade this program unzips the
+ * installation package.
+ *
+ * This Java program handles unzipping files so that we don't need to rely on
+ * the operating system's tools for managing zip files.
  *
  * This tool is a stand-alone program since it is run in preparation for a
  * off line upgrade and runs using the current program's jars rather than
@@ -60,6 +67,12 @@
   static private final Logger LOG =
           Logger.getLogger(BuildExtractor.class.getName());
 
+  /** Return code indicating that this invocation is an upgrade. */
+  private static final int RC_CONTINUE_WITH_UPGRADE = 99;
+
+  /** Return code indicating that this invocation is a reversion. */
+  private static final int RC_CONTINUE_WITH_REVERSION = 98;
+
   /**
    * Creates and run a BuildExtractor using command line arguments.
    * @param args String[] command line arguments
@@ -78,14 +91,14 @@
     new BuildExtractor(args).launch();
   }
 
-  private BuildExtractorCliHelper helper = new BuildExtractorCliHelper();
-
   private UpgradeUserData userData;
 
   private boolean finished;
 
   private ApplicationException error;
 
+  private ReturnCode rc;
+
   private BuildExtractor(String[] args) {
     super(args);
   }
@@ -101,37 +114,49 @@
    * contents into the current build's staging are and exits with return code 0.
    */
   public void run() {
-    try {
-      UpgradeUserData uud = (UpgradeUserData)getUserData();
-      File buildFile = uud.getInstallPackage();
-      if (buildFile != null) {
-        LOG.log(Level.INFO, "expanding zip file " + buildFile.getPath());
-        File stageDirectory = initStageDirectory();
-        ZipExtractor extractor = new ZipExtractor(buildFile);
-        extractor.extract(stageDirectory);
-        LOG.log(Level.INFO, "extraction finished");
-        Installation installation = new Installation(stageDirectory);
-        if (!installation.isValid()) {
-          LOG.log(Level.INFO, "extraction produed an invalid OpenDS" +
-                  "installation: " + installation.getInvalidityReason());
-          Message invalidMsg = INFO_BUILD_EXTRACTOR_FILE_INVALID.get(
-                  Utils.getPath(buildFile),
-                  installation.getInvalidityReason());
-          error = new ApplicationException(
-              ApplicationReturnCode.ReturnCode.APPLICATION_ERROR,
-                  invalidMsg, null);
-          System.err.println(invalidMsg);
+    UpgradeUserData uud = (UpgradeUserData)getUserData();
+    if (UpgradeUserData.Operation.REVERSION.equals(uud.getOperation())) {
+      rc = new ReturnCode(RC_CONTINUE_WITH_REVERSION);
+    } else {
+      try {
+        File buildFile = uud.getInstallPackage();
+        if (buildFile != null) {
+          LOG.log(Level.INFO, "Expanding zip file " + buildFile.getPath());
+          File stageDirectory = initStageDirectory();
+          ZipExtractor extractor = new ZipExtractor(buildFile);
+          extractor.extract(stageDirectory);
+          LOG.log(Level.INFO, "Extraction finished");
+          Installation installation = new Installation(stageDirectory);
+          if (!installation.isValid()) {
+            LOG.log(Level.INFO, "Extraction produed an invalid OpenDS" +
+                    "installation: " + installation.getInvalidityReason());
+            Message invalidMsg = INFO_BUILD_EXTRACTOR_FILE_INVALID.get(
+                    Utils.getPath(buildFile),
+                    installation.getInvalidityReason());
+            error = new ApplicationException(
+                ReturnCode.APPLICATION_ERROR,
+                    invalidMsg, null);
+            System.err.println(invalidMsg);
+          }
+          rc = new ReturnCode(RC_CONTINUE_WITH_UPGRADE);
+        } else {
+          // This should never happen assuming createUserData did the
+          // right thing
+          LOG.log(Level.INFO, "Build extractor failed to " +
+                  "specify valid installation zip file");
+          throw new IllegalStateException("Build extractor failed to " +
+                  "specify valid installation zip file");
         }
+      } catch (Throwable t) {
+        LOG.log(Level.INFO, "Unexpected error extracting build", t);
+        String reason = t.getLocalizedMessage();
+        error = new ApplicationException(
+                ReturnCode.APPLICATION_ERROR,
+                INFO_BUILD_EXTRACTOR_ERROR.get(reason), t);
+        System.err.println(reason);
+      } finally   {
+        finished = true;
       }
-    } catch (Throwable t) {
-      LOG.log(Level.INFO, "unexpected error extracting build", t);
-      String reason = t.getLocalizedMessage();
-      error = new ApplicationException(
-              ApplicationReturnCode.ReturnCode.APPLICATION_ERROR,
-              INFO_BUILD_EXTRACTOR_ERROR.get(reason), t);
-      System.err.println(reason);
-    } finally   {
-      finished = true;
     }
   }
 
@@ -173,7 +198,21 @@
   public UserData createUserData(Launcher launcher)
           throws UserDataException
   {
-    return helper.createUserData(args);
+    BuildExtractorCliHelper helper =
+            new BuildExtractorCliHelper((UpgradeLauncher)launcher);
+    UpgradeUserData uud = helper.createUserData(args);
+
+    // Build Extractor is always quiet
+    uud.setQuiet(true);
+
+    // The user may have indicated the operation via interactivity
+    if (UpgradeUserData.Operation.UPGRADE.equals(uud.getOperation())) {
+      isUpgrade = true;
+    } else if (UpgradeUserData.Operation.REVERSION.equals(uud.getOperation())) {
+      isReversion = true;
+    }
+
+    return uud;
   }
 
   /**
@@ -216,6 +255,13 @@
   /**
    * {@inheritDoc}
    */
+  public ReturnCode getReturnCode() {
+    return rc;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
   public void addProgressUpdateListener(ProgressUpdateListener l) {
     // ignored;  no progress messages
   }

--
Gitblit v1.10.0