From bb1b4f1a882179359bf027bdf6acb8e9c40e5ab7 Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Thu, 10 May 2007 14:16:11 +0000
Subject: [PATCH] This commit addresses several issues that Brian brought up regarding the upgrader.
---
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java | 243 ++++++++++++++++++++++++++++++++++--------------
1 files changed, 172 insertions(+), 71 deletions(-)
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index a8b5b70..8048941 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -28,6 +28,7 @@
package org.opends.quicksetup.upgrader;
import org.opends.quicksetup.*;
+import static org.opends.quicksetup.Step.PROGRESS;
import org.opends.quicksetup.upgrader.ui.WelcomePanel;
import org.opends.quicksetup.upgrader.ui.ChooseVersionPanel;
import org.opends.quicksetup.upgrader.ui.UpgraderReviewPanel;
@@ -51,6 +52,8 @@
import static org.opends.quicksetup.Installation.*;
+import javax.swing.*;
+
/**
* QuickSetup application of ugrading the bits of an installation of
* OpenDS.
@@ -239,6 +242,9 @@
private RemoteBuildManager remoteBuildManager = null;
+ /** Set to true if the user decides to close the window while running. */
+ private boolean abort = false;
+
/**
* Creates a default instance.
*/
@@ -362,8 +368,7 @@
* {@inheritDoc}
*/
public Integer getRatio(ProgressStep step) {
- return ((UpgradeProgressStep) step).ordinal() /
- EnumSet.allOf(UpgradeWizardStep.class).size();
+ return ((UpgradeProgressStep) step).getProgress();
}
/**
@@ -373,7 +378,10 @@
String txt = null;
if (step == UpgradeProgressStep.FINISHED) {
txt = getFinalSuccessMessage();
- } else {
+ } else if (step == UpgradeProgressStep.FINISHED_WITH_ERRORS) {
+ txt = getFinalErrorMessage();
+ }
+ else {
txt = getMsg(((UpgradeProgressStep) step).getSummaryMesssageKey());
}
return txt;
@@ -451,7 +459,7 @@
/**
* {@inheritDoc}
*/
- public boolean canCancel(WizardStep step) {
+ public boolean canQuit(WizardStep step) {
return UpgradeWizardStep.WELCOME == step ||
UpgradeWizardStep.CHOOSE_VERSION == step ||
UpgradeWizardStep.REVIEW == step;
@@ -460,7 +468,79 @@
/**
* {@inheritDoc}
*/
- public void quitClicked(WizardStep step, QuickSetup qs) {
+ public boolean canClose(WizardStep step) {
+ return step == UpgradeWizardStep.PROGRESS;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getFinishButtonToolTipKey() {
+ return "finish-button-upgrade-tooltip";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getQuitButtonToolTipKey() {
+ return "quit-button-upgrade-tooltip";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void closeClicked(WizardStep cStep, final QuickSetup qs) {
+ if (cStep == UpgradeWizardStep.PROGRESS) {
+ if (isFinished()) {
+ qs.quit();
+ } else if (qs.displayConfirmation(getMsg("confirm-close-upgrade-msg"),
+ getMsg("confirm-close-upgrade-title"))) {
+ abort = true;
+ JButton btnClose = qs.getDialog().getButtonsPanel().
+ getButton(ButtonName.CLOSE);
+ btnClose.setEnabled(false);
+ new Thread(new Runnable() {
+ public void run() {
+ while (!isFinished()) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+ qs.quit();
+ }
+ }).start();
+ }
+ } else {
+ throw new IllegalStateException(
+ "Close only can be clicked on PROGRESS step");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isFinished() {
+ return getCurrentProgressStep() ==
+ UpgradeProgressStep.FINISHED
+ || getCurrentProgressStep() ==
+ UpgradeProgressStep.FINISHED_WITH_ERRORS;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void quitClicked(WizardStep cStep, final QuickSetup qs) {
+ if (cStep == UpgradeWizardStep.PROGRESS) {
+ throw new IllegalStateException(
+ "Cannot click on quit from progress step");
+ } else if (isFinished()) {
+ qs.quit();
+ } else if (qs.displayConfirmation(getMsg("confirm-quit-upgrade-msg"),
+ getMsg("confirm-quit-upgrade-title"))) {
+ qs.quit();
+ }
}
/**
@@ -507,8 +587,10 @@
uud.setServerLocation(serverLocationString);
} catch (IllegalArgumentException iae) {
+ LOG.log(Level.INFO,
+ "illegal OpenDS installation directory selected", iae);
errorMsgs.add(getMsg("error-invalid-server-location",
- iae.getLocalizedMessage()));
+ serverLocationString));
qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true);
}
}
@@ -568,22 +650,6 @@
/**
* {@inheritDoc}
*/
- public void closeClicked(WizardStep cStep, QuickSetup qs) {
- // TODO: prompt
- qs.quit();
- }
-
- /**
- * {@inheritDoc}
- */
- public void cancelClicked(WizardStep cStep, QuickSetup qs) {
- // TODO: confirm cancel
- System.exit(1);
- }
-
- /**
- * {@inheritDoc}
- */
public boolean canFinish(WizardStep step) {
boolean cf = UpgradeWizardStep.REVIEW.equals(step);
return cf;
@@ -599,13 +665,6 @@
/**
* {@inheritDoc}
*/
- public boolean canClose(WizardStep step) {
- return step.equals(UpgradeWizardStep.PROGRESS);
- }
-
- /**
- * {@inheritDoc}
- */
public void run() {
// Reset exception just in case this application is rerun
// for some reason
@@ -623,6 +682,8 @@
}
}
+ checkAbort();
+
File buildZip;
Build buildToDownload =
getUpgradeUserData().getInstallPackageToDownload();
@@ -664,6 +725,8 @@
LOG.log(Level.INFO, "will use local build " + buildZip);
}
+ checkAbort();
+
if (buildZip != null) {
LOG.log(Level.INFO, "existing local build file " + buildZip.getName());
try {
@@ -680,6 +743,8 @@
}
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "initializing upgrade");
setCurrentProgressStep(UpgradeProgressStep.INITIALIZING);
@@ -692,6 +757,8 @@
throw e;
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "checking server health");
setCurrentProgressStep(UpgradeProgressStep.CHECK_SERVER_HEALTH);
@@ -704,6 +771,8 @@
throw e;
}
+ checkAbort();
+
boolean schemaCustomizationPresent = false;
try {
LOG.log(Level.INFO, "checking for schema customizations");
@@ -718,6 +787,8 @@
throw e;
}
+ checkAbort();
+
boolean configCustimizationPresent = false;
try {
LOG.log(Level.INFO, "checking for config customizations");
@@ -733,6 +804,8 @@
throw e;
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "backing up databases");
setCurrentProgressStep(UpgradeProgressStep.BACKING_UP_DATABASES);
@@ -745,6 +818,8 @@
throw e;
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "backing up filesystem");
setCurrentProgressStep(UpgradeProgressStep.BACKING_UP_FILESYSTEM);
@@ -757,6 +832,8 @@
throw e;
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "upgrading components");
setCurrentProgressStep(
@@ -771,6 +848,8 @@
throw e;
}
+ checkAbort();
+
//********************************************
//* The two steps following this step require
//* the server to be started 'in process'.
@@ -791,6 +870,8 @@
throw e;
}
+ checkAbort();
+
if (schemaCustomizationPresent) {
try {
LOG.log(Level.INFO, "applying schema customizatoin");
@@ -807,6 +888,8 @@
}
}
+ checkAbort();
+
if (configCustimizationPresent) {
try {
LOG.log(Level.INFO, "applying config customizatoin");
@@ -823,6 +906,8 @@
}
}
+ checkAbort();
+
try {
LOG.log(Level.INFO, "stopping server");
getServerController().stopServerInProcess();
@@ -834,6 +919,8 @@
}
}
+ checkAbort();
+
// 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.
@@ -905,57 +992,55 @@
LOG.log(Level.INFO, "history recorded");
notifyListeners("See '" +
Utils.getPath(getInstallation().getHistoryLogFile()) +
- "' for upgrade history" + formatter.getLineBreak());
+ " for upgrade history" + formatter.getLineBreak());
} catch (ApplicationException e) {
System.err.print("Error cleaning up after upgrade: " +
e.getLocalizedMessage());
}
- }
- // Decide final status based on presense of error
+ // Decide final status based on presense of error
- // It would be nice if this were simpler.
-
- if (runException == null) {
- LOG.log(Level.INFO, "upgrade completed successfully");
- if (!Utils.isCli()) {
-
- notifyListenersOfLog();
-
- // This seems to be the preferred way to print
- // a message to the top of the progress panel without
- // having it show up in the Details section which we
- // don't want since it is in HTML
- this.currentProgressStep = UpgradeProgressStep.FINISHED;
- notifyListeners(null);
-
+ // WARNING: change this code at your own risk! The ordering
+ // of these statements is important. There are differences
+ // in how the CLI and GUI application's processes exit.
+ // Changing the ordering here may result in messages being
+ // skipped because the process has already exited by the time
+ // processing messages has finished. Need to resolve these
+ // issues.
+ if (runException == null) {
+ LOG.log(Level.INFO, "upgrade completed successfully");
+ if (!Utils.isCli()) {
+ notifyListenersOfLog();
+ this.currentProgressStep = UpgradeProgressStep.FINISHED;
+ notifyListeners(null);
+ } else {
+ notifyListeners(null);
+ this.currentProgressStep = UpgradeProgressStep.FINISHED;
+ }
} else {
- 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
- // System.exit gets called in QuickSetupCli
- this.currentProgressStep = UpgradeProgressStep.FINISHED;
- }
-
- } else {
- LOG.log(Level.INFO, "upgrade completed with errors", runException);
- if (!Utils.isCli()) {
- notifyListeners(100,
- getMsg(UpgradeProgressStep.FINISHED_WITH_ERRORS.
- getSummaryMesssageKey()),
- formatter.getFormattedError(runException, true));
- notifyListenersOfLog();
- notifyListeners(null);
- setCurrentProgressStep(UpgradeProgressStep.FINISHED_WITH_ERRORS);
- } else {
- runException.printStackTrace();
- this.currentProgressStep = UpgradeProgressStep.FINISHED_WITH_ERRORS;
+ LOG.log(Level.INFO, "upgrade completed with errors", runException);
+ if (!Utils.isCli()) {
+ notifyListenersOfLog();
+ this.currentProgressStep = UpgradeProgressStep.FINISHED_WITH_ERRORS;
+ notifyListeners(formatter.getFormattedError(runException, true));
+ } else {
+ notifyListeners(formatter.getFormattedError(runException, true) +
+ formatter.getLineBreak());
+ notifyListeners(formatter.getLineBreak());
+ setCurrentProgressStep(UpgradeProgressStep.FINISHED_WITH_ERRORS);
+ notifyListeners(formatter.getLineBreak());
+ }
}
}
}
+ private void checkAbort() throws ApplicationException {
+ if (abort) throw new ApplicationException(
+ ApplicationException.Type.APPLICATION,
+ "upgrade canceled by user", null);
+ }
+
/**
* Stops and starts the server checking for serious errors. Also
* has the side effect of having the server write schema.current
@@ -973,7 +1058,7 @@
if (errors != null) {
throw new ApplicationException(
ApplicationException.Type.APPLICATION,
- "The server currently starts with errors with must" +
+ "The server currently starts with errors which must" +
"be resolved before an upgrade can occur: " +
Utils.listToString(errors, " "),
null);
@@ -1513,7 +1598,7 @@
this.currentProgressStep = step;
int progress = step.getProgress();
String msg = getSummary(step);
- notifyListeners(progress, getFormattedProgress(msg), msg);
+ notifyListeners(progress, msg, getFormattedProgress(msg));
}
private UpgraderCliHelper getCliHelper() {
@@ -1528,7 +1613,12 @@
String installPath = Utils.getPath(getInstallation().getRootDirectory());
String newVersion = null;
try {
- newVersion = getInstallation().getBuildInformation().getBuildId();
+ BuildInformation bi = getInstallation().getBuildInformation();
+ if (bi != null) {
+ newVersion = bi.toString();
+ } else {
+ newVersion = getMsg("upgrade-build-id-unknown");
+ }
} catch (ApplicationException e) {
newVersion = getMsg("upgrade-build-id-unknown");
}
@@ -1545,6 +1635,17 @@
return txt;
}
+ private String getFinalErrorMessage() {
+ String txt;
+ if (Utils.isCli()) {
+ txt = getMsg("summary-upgrade-finished-with-errors-cli");
+ } else {
+ txt = getFormattedError(
+ getMsg("summary-upgrade-finished-with-errors"));
+ }
+ return txt;
+ }
+
private File getStageDirectory()
throws ApplicationException, IOException {
return getInstallation().getTemporaryUpgradeDirectory();
--
Gitblit v1.10.0