From 14f210825823c17cff84d9221fa76673cbe27aa9 Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Mon, 23 Apr 2007 00:29:32 +0000
Subject: [PATCH] The commit contains code for the following:
---
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java | 27
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupStepPanel.java | 19
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/Utilities.java | 5
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebBrowserErrorDialog.java | 2
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/UIFactory.java | 39 +
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java | 32
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java | 246 ++++++-
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundTask.java | 9
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java | 325 +++++++++
opendj-sdk/opends/resource/upgrade | 40
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java | 19
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties | 32
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java | 158 +++++
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeUserData.java | 20
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ReviewPanel.java | 30
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundThreadTask.java | 10
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebProxyDialog.java | 392 ++++++++++++
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupPanel.java | 9
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Build.java | 81 ++
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java | 123 ++-
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ServerSettingsPanel.java | 4
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/CustomHTMLEditorKit.java | 16
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/UpgraderReviewPanel.java | 82 ++
opendj-sdk/opends/resource/webstart/create-webstart-standalone.sh | 63 +
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java | 51 +
25 files changed, 1,601 insertions(+), 233 deletions(-)
diff --git a/opendj-sdk/opends/resource/upgrade b/opendj-sdk/opends/resource/upgrade
index db99987..ddef946 100644
--- a/opendj-sdk/opends/resource/upgrade
+++ b/opendj-sdk/opends/resource/upgrade
@@ -36,12 +36,16 @@
then
. "${INSTANCE_ROOT}/bin/set-java-home"
JAVA_BIN="${JAVA_HOME}/bin/java"
+ JAVAWS_BIN="${JAVA_HOME}/bin/javaws"
export JAVA_BIN
+ export JAVAWS_BIN
else
JAVA_BIN=`which java 2> /dev/null`
+ JAVAWS_BIN=`which javaws 2> /dev/null`
if test ${?} -eq 0
then
export JAVA_BIN
+ export JAVAWS_BIN
else
echo "Please set JAVA_HOME to the root of a Java 5.0 installation."
exit 1
@@ -49,7 +53,9 @@
fi
else
JAVA_BIN="${JAVA_HOME}/bin/java"
+ JAVAWS_BIN="${JAVA_HOME}/bin/javaws"
export JAVA_BIN
+ export JAVA_WS
fi
fi
@@ -138,19 +144,29 @@
if test ${?} -eq 0
then
- # Configure the appropriate CLASSPATH.
- # Unlike BuildExtractor, the Upgrader uses
- # the newly extracted build's jars.
- for JAR in ${INSTANCE_ROOT}/tmp/upgrade/lib/*.jar
- do
- CLASSPATH=${JAR}:${CLASSPATH}
- done
- # Launch the upgrade process.
- "${JAVA_BIN}" org.opends.quicksetup.upgrader.UpgradeLauncher "${@}"
-
- # Clean up if necessary
if [ -r "./tmp/upgrade" ]
then
- rm -fr "./tmp/upgrade"
+
+ # Configure the appropriate CLASSPATH.
+ # Unlike BuildExtractor, the Upgrader uses
+ # the newly extracted build's jars.
+ for JAR in ${INSTANCE_ROOT}/tmp/upgrade/lib/*.jar
+ do
+ CLASSPATH=${JAR}:${CLASSPATH}
+ done
+ # Launch the upgrade process.
+ "${JAVA_BIN}" org.opends.quicksetup.upgrader.UpgradeLauncher "${@}"
+
+ # Clean up if necessary
+ if [ -r "./tmp/upgrade" ]
+ then
+ rm -fr "./tmp/upgrade"
+ fi
+ else
+ # URL FOR TESTING ONLY
+ # JAVAWS_VM_ARGS="-Dorg.opends.quicksetup.upgrader.Root=$INSTANCE_ROOT -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
+ JAVAWS_VM_ARGS="-Xclearcache -Dorg.opends.quicksetup.upgrader.Root=$INSTANCE_ROOT"
+ export JAVAWS_VM_ARGS
+ "${JAVAWS_BIN}" "http://localhost:8080/install/QuickUpgrade.jnlp"
fi
fi
diff --git a/opendj-sdk/opends/resource/webstart/create-webstart-standalone.sh b/opendj-sdk/opends/resource/webstart/create-webstart-standalone.sh
index c60ac37..81d4f52 100755
--- a/opendj-sdk/opends/resource/webstart/create-webstart-standalone.sh
+++ b/opendj-sdk/opends/resource/webstart/create-webstart-standalone.sh
@@ -31,11 +31,17 @@
fi
echo "BASE_PATH: ${BASE_PATH}"
-if test -z "${JNLP_FILENAME}"
+if test -z "${INSTALL_JNLP_FILENAME}"
then
- JNLP_FILENAME="QuickSetup.jnlp"
+ INSTALL_JNLP_FILENAME="QuickSetup.jnlp"
fi
-echo "JNLP_FILENAME: ${JNLP_FILENAME}"
+echo "INSTALL_JNLP_FILENAME: ${INSTALL_JNLP_FILENAME}"
+
+if test -z "${UPGRADE_JNLP_FILENAME}"
+then
+ UPGRADE_JNLP_FILENAME="QuickUpgrade.jnlp"
+fi
+echo "UPGRADE_JNLP_FILENAME: ${UPGRADE_JNLP_FILENAME}"
if test -z "${PORT}"
then
@@ -146,14 +152,14 @@
-storepass "${CERT_KEYSTORE_PIN}" zipped.jar "${CERT_ALIAS}"
-# Create the JNLP file with the appropriate contents.
-echo "Creating JNLP file ${JNLP_FILENAME} ..."
+# Create the Setup JNLP file with the appropriate contents.
+echo "Creating Setup JNLP file ${INSTALL_JNLP_FILENAME} ..."
cd ..
-cat > "${JNLP_FILENAME}" <<ENDOFJNLP
+cat > "${INSTALL_JNLP_FILENAME}" <<ENDOFINSTALLJNLP
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for OpenDS Quick Setup Application -->
<jnlp spec="1.5+"
- codebase="${INSTALLER_URI}" href="${JNLP_FILENAME}">
+ codebase="${INSTALLER_URI}" href="${INSTALL_JNLP_FILENAME}">
<information>
<title>OpenDS Quick Setup Application</title>
<vendor>http://www.opends.org/</vendor>
@@ -187,8 +193,49 @@
<application-desc main-class="org.opends.quicksetup.SplashScreen"/>
</jnlp>
-ENDOFJNLP
+ENDOFINSTALLJNLP
+# Create the Upgrade JNLP file with the appropriate contents.
+echo "Creating Upgrade JNLP file ${UPGRADE_JNLP_FILENAME} ..."
+cat > "${UPGRADE_JNLP_FILENAME}" <<ENDOFUPGRADEJNLP
+<?xml version="1.0" encoding="utf-8"?>
+<!-- JNLP File for OpenDS Quick Upgrade Application -->
+<jnlp spec="1.5+"
+ codebase="${INSTALLER_URI}" href="${UPGRADE_JNLP_FILENAME}">
+ <information>
+ <title>OpenDS Quick Setup Application</title>
+ <vendor>http://www.opends.org/</vendor>
+ <homepage href="http://www.opends.org"/>
+ <description>OpenDS Quick Upgrade Application</description>
+ <description kind="short">OpenDS Web Start Upgrader</description>
+ <icon href="images/opendshref.png" height="128" width="128"/>
+ <icon kind="splash" href="images/opendssplash.png" height="114" width="479"/>
+ </information>
+
+ <security>
+ <all-permissions/>
+ </security>
+
+ <resources>
+ <j2se version="1.5+" java-vm-args="-client"/>
+ <jar href="lib/quicksetup.jar" download="eager" main="true"/>
+ <jar href="lib/OpenDS.jar" download="lazy"/>
+ <jar href="lib/je.jar" download="lazy"/>
+ <jar href="lib/aspectjrt.jar" download="lazy"/>
+ <jar href="lib/zipped.jar" download="lazy"/>
+ <property name="org.opends.quicksetup.iswebstart" value="true" />
+ <property name="org.opends.quicksetup.Application.class" value="org.opends.quicksetup.upgrader.Upgrader"/>
+ <property name="org.opends.quicksetup.lazyjarurls" value="${INSTALLER_URI}/lib/OpenDS.jar ${INSTALLER_URI}/lib/zipped.jar ${INSTALLER_URI}/lib/je.jar ${INSTALLER_URI}/lib/aspectjrt.jar" />
+ <property name="org.opends.quicksetup.zipfilename" value="${ZIP_FILENAME_BASE}.zip"/>
+ </resources>
+
+ <resources os="AIX">
+ <j2se version="1.5+"/>
+ </resources>
+
+ <application-desc main-class="org.opends.quicksetup.SplashScreen"/>
+</jnlp>
+ENDOFUPGRADEJNLP
# Tell the user where the files are.
echo "The deployable content may be found in ${ROOT_DIR}/build/webstart"
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 6c75975..281e5c4 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Installation.java
@@ -27,11 +27,10 @@
package org.opends.quicksetup;
-import java.io.File;
-import java.io.IOException;
-import java.util.Set;
-import java.util.Arrays;
-import java.util.HashSet;
+import java.io.*;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
import org.opends.quicksetup.util.Utils;
@@ -245,6 +244,8 @@
private Configuration baseConfiguration;
+ private String buildId;
+
/**
* Creates a new instance from a root directory specified as a string.
*
@@ -454,6 +455,46 @@
}
/**
+ * Gets the build ID which is the 14 digit number code like 20070420110336.
+ * @return String representing the build ID
+ * @throws QuickSetupException if something goes wrong
+ */
+ public String getBuildId() throws QuickSetupException {
+ if (buildId == null) {
+ List<String> args = new ArrayList<String>();
+ args.add(Utils.getPath(getServerStartCommandFile()));
+ args.add("-V"); // verbose
+ ProcessBuilder pb = new ProcessBuilder(args);
+ InputStream is = null;
+ try {
+ Process process = pb.start();
+ is = process.getInputStream();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ String line = null;
+ Pattern p = Pattern.compile("(Build )(\\d{14})");
+ while (null != (line = reader.readLine())) {
+ Matcher m = p.matcher(line);
+ if (m.matches()) {
+ buildId = line.substring(m.start(2), m.end(2));
+ }
+ }
+ } catch (IOException e) {
+ throw new QuickSetupException(QuickSetupException.Type.START_ERROR,
+ "Error attempting to determine build ID", e);
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // ignore;
+ }
+ }
+ }
+ }
+ return buildId;
+ }
+
+ /**
* Returns the path to the configuration file of the directory server. Note
* that this method assumes that this code is being run locally.
*
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
index d0229db..ea6100e 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
@@ -51,6 +51,7 @@
private HashMap<FieldName, JTextComponent> hmFields =
new HashMap<FieldName, JTextComponent>();
+ private JCheckBox checkBox;
/**
* Constructor of the panel.
@@ -161,7 +162,7 @@
JTextComponent field = UIFactory.makeJTextComponent(desc, null);
field.setOpaque(false);
- JLabel label = makeJLabel(desc);
+ JLabel label = UIFactory.makeJLabel(desc);
hmFields.put(fieldName, field);
label.setLabelFor(field);
@@ -313,4 +314,20 @@
return panel;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ protected JCheckBox getCheckBox()
+ {
+ if (checkBox == null)
+ {
+ checkBox =
+ UIFactory.makeJCheckBox(getMsg("start-server-label"),
+ getMsg("start-server-tooltip"), UIFactory.TextStyle.CHECKBOX);
+ checkBox.setOpaque(false);
+ checkBox.setSelected(getApplication().getUserData().getStartServer());
+ }
+ return checkBox;
+ }
}
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 4f0bdfe..bf03e38 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
@@ -685,6 +685,8 @@
summary-upgrade-not-started=Starting Upgrade...
summary-upgrade-initializing=Initializing Upgrade...
+summary-upgrade-downloading=Downloading Build...
+summary-upgrade-extracting=Extracting Build...
summary-upgrade-backing-up-db=Backing Up Data...
summary-upgrade-backing-up-files=Backing Up Files...
summary-upgrade-calculating-schema-customization=Calculating Schema \
@@ -825,19 +827,25 @@
# a language there is no translation to be done but if we have specific URL for
# each language the URL must be localized.
upgrade-welcome-panel-offline-instructions=The OpenDS Upgrade tool will upgrade \
- an existing build in place.<br><br> \
+ an existing build in place.<br><br>You will be prompted to choose among a list \
+ of available builds to which you can upgrade or you can specify an install\
+ package (.zip) file that you have already downloaded.You can also use this tool to set up a build you have \
+ downloaded manually.<br><br> \
Additional information on this tool is available in the <a href="https://opends.dev.java.net/public/docs/index.html"> \
- Documentation Depot</a> section of OpenDS project web site.
+ Documentation Depot</a> section of OpenDS project web site.<br><br>
upgrade-welcome-panel-webstart-instructions=The OpenDS Upgrade tool will upgrade \
- an existing build in place.<br><br>You can also use this tool to set up a build you have \
- downloaded manually. To run Upgrade in this case, use the {0} command at \
- the top level of the OpenDS directory.<br><br> \
+ an existing build in place.<br><br>You will be prompted to choose among a list \
+ of available builds to which you can upgrade or you can specify an install\
+ package (.zip) file that you have already downloaded.You can also use this tool to set up a build you have \
+ downloaded manually.<br><br> \
Additional information on this tool is available in the <a href="https://opends.dev.java.net/public/docs/index.html"> \
Documentation Depot</a> section of OpenDS project web site.<br><br>
upgrade-location-label=Server to Upgrade:
upgrade-location-tooltip=File system location of the build that will be upgraded
upgrade-build-id-label=Build Version:
upgrade-build-id-tooltip=The ID of the build version installed in the above location
+upgrade-build-id-unknown=Unknown
+error-invalid-server-location=Invalid server location: {0}
#
# Upgrader Choose Version Panel
@@ -851,9 +859,18 @@
upgrade-choose-version-remote-weekly=Weekly Builds
upgrade-choose-version-remote-nightly=Nightly Builds
upgrade-choose-version-local-label=Upgrade Based on Downloaded Weekly Build (.zip)
-upgrade-choose-version-local-tooltip=Upgrade to a build whose .zip file you have\
+upgrade-choose-version-local-tooltip=Upgrade to a build whose .zip file you have \
already downloaded.
upgrade-choose-version-local-path=Path:
+upgrade-choose-version-build-list-error=<b>Error Accessing Build Information.</b>\
+ <br>Unable to retrieve the list of builds from {0} due to: {1}.<br>\
+ Possible Causes:<br>\
+ <ul><li>Need to specify a proxy.<br><table><tr><td>\
+ <input value="Specify Proxy" type="submit"/></td><td>Current Proxy: {2}<td>\
+ </tr></table><br></li><li>{0} \
+ is down or experiencing difficulty.</li></ul><br>You can still continue with \
+ upgrade but will need to download a build separately and then point to it in \
+ the wizard.
upgrade-review-panel-title=Review
upgrade-review-panel-instructions=Review your settings and click Finish if they \
@@ -865,4 +882,5 @@
upgrade-review-panel-new-version-label=New Version:
upgrade-review-panel-new-version-tooltip=The target version of the server
upgrade-review-panel-start-server=Start Server when the Upgrade has Completed
-
+upgrade-review-panel-start-server-tooltip=Check this check box if you want to \
+ start the server once the upgrade has completed
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/CustomHTMLEditorKit.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/CustomHTMLEditorKit.java
index 84defad..56f82ec 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/CustomHTMLEditorKit.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/CustomHTMLEditorKit.java
@@ -40,7 +40,7 @@
/**
* Class used to be able to detect events in the button inside an HTML pane.
*/
-class CustomHTMLEditorKit extends HTMLEditorKit
+public class CustomHTMLEditorKit extends HTMLEditorKit
{
private HashSet<ActionListener> listeners = new HashSet<ActionListener>();
private static final long serialVersionUID = 298103926252426388L;
@@ -48,7 +48,7 @@
/**
* Default constructor.
*/
- CustomHTMLEditorKit()
+ public CustomHTMLEditorKit()
{
super();
}
@@ -116,10 +116,16 @@
*/
public void actionPerformed(ActionEvent ev)
{
- for (ActionListener l: listeners)
- {
- l.actionPerformed(ev);
+ if (ev != null && ev.getWhen() != lastActionWhen) {
+ lastActionWhen = ev.getWhen();
+ for (ActionListener l: listeners)
+ {
+ l.actionPerformed(ev);
+ }
}
}
}
+
+ private static long lastActionWhen = 0;
+
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
index 8a3fdf8..01fbf9b 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
@@ -41,6 +41,8 @@
{
/**
* The value associated with this is a String.
+ * The upgrader uses this field to indicate the
+ * location of the server to upgrade.
*/
SERVER_LOCATION,
/**
@@ -114,6 +116,29 @@
/**
* The value associated with this is a Set of String.
*/
- EXTERNAL_LOG_FILES
+ EXTERNAL_LOG_FILES,
+
+ /**
+ * Indicates whether the upgrade will need to first download
+ * an OpenDS install package (.zip) to download or the
+ * upgrader will use a file that has already been
+ * downloaded. The value of this field is boolean and if
+ * true must be accompanied by a value for UPGRADE_BUILD_TO_DOWNLOAD.
+ * If false UPGRADE_FILE must be specified.
+ */
+ UPGRADE_DOWNLOAD,
+
+ /**
+ * Display name of the build to which the upgrader
+ * will upgrade the build indicated by SERVER_LOCATION.
+ */
+ UPGRADE_BUILD_TO_DOWNLOAD,
+
+ /**
+ * Local OpenDS install package (.zip) file containing
+ * a build to which the build indicated by SERVER_LOCATION
+ * will be upgraded.
+ */
+ UPGRADE_FILE
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupPanel.java
index 8c2e87e..8713fb3 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupPanel.java
@@ -34,6 +34,7 @@
import javax.swing.JPanel;
import org.opends.quicksetup.i18n.ResourceProvider;
+import org.opends.quicksetup.UserData;
/**
* This class is an abstract class that provides some commodity methods.
@@ -92,6 +93,14 @@
}
/**
+ * Gets the user data associated with the current application.
+ * @return UserData user specified data
+ */
+ protected UserData getUserData() {
+ return application.getUserData();
+ }
+
+ /**
* Returns a localized message for a key value. In the properties file we
* have something of type:
* key=value
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupStepPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupStepPanel.java
index 01ee001..15decb0 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupStepPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetupStepPanel.java
@@ -304,25 +304,6 @@
}
/**
- * Commodity method that returns a JLabel based on a LabelFieldDescriptor.
- * @param desc the LabelFieldDescriptor describing the JLabel.
- * @return a JLabel based on a LabelFieldDescriptor.
- */
- protected JLabel makeJLabel(LabelFieldDescriptor desc)
- {
- UIFactory.TextStyle style;
- if (desc.getLabelType() == LabelFieldDescriptor.LabelType.PRIMARY)
- {
- style = UIFactory.TextStyle.PRIMARY_FIELD_VALID;
- } else
- {
- style = UIFactory.TextStyle.SECONDARY_FIELD_VALID;
- }
- return UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, desc.getLabel(),
- style);
- }
-
- /**
* Creates and returns the panel that contains the layout specific to the
* panel.
* @return the panel that contains the layout specific to the
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ReviewPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ReviewPanel.java
index 1d0be4c..3482c67 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ReviewPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ReviewPanel.java
@@ -36,8 +36,6 @@
*/
public abstract class ReviewPanel extends QuickSetupStepPanel {
- private JCheckBox checkBox;
-
/**
* Creates an instance.
* @param application GuiApplication this panel represents
@@ -57,8 +55,8 @@
*/
final protected Component createInputPanel()
{
- JPanel panel = new JPanel(new GridBagLayout());
- panel.setOpaque(false);
+ JPanel panel = UIFactory.makeJPanel();
+ panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
@@ -70,10 +68,13 @@
addVerticalGlue(panel);
- gbc.insets.top = UIFactory.TOP_INSET_PRIMARY_FIELD;
- gbc.weighty = 0.0;
- gbc.fill = GridBagConstraints.HORIZONTAL;
- panel.add(getCheckBox(), gbc);
+ JCheckBox chk = getCheckBox();
+ if (chk != null) {
+ gbc.insets.top = UIFactory.TOP_INSET_PRIMARY_FIELD;
+ gbc.weighty = 0.0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ panel.add(chk, gbc);
+ }
return panel;
}
@@ -83,16 +84,5 @@
* If it does not exist creates the start server check box.
* @return the start server check box.
*/
- protected JCheckBox getCheckBox()
- {
- if (checkBox == null)
- {
- checkBox =
- UIFactory.makeJCheckBox(getMsg("start-server-label"),
- getMsg("start-server-tooltip"), UIFactory.TextStyle.CHECKBOX);
- checkBox.setOpaque(false);
- checkBox.setSelected(getApplication().getUserData().getStartServer());
- }
- return checkBox;
- }
+ protected abstract JCheckBox getCheckBox();
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ServerSettingsPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ServerSettingsPanel.java
index 8681077..145438c 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ServerSettingsPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ServerSettingsPanel.java
@@ -450,7 +450,7 @@
LabelFieldDescriptor desc = hm.get(fieldName);
String defaultValue = getDefaultValue(fieldName);
- JLabel label = makeJLabel(desc);
+ JLabel label = UIFactory.makeJLabel(desc);
if (fieldName != FieldName.SECURITY_OPTIONS)
{
@@ -473,7 +473,7 @@
getMsg("server-location-parent-tooltip"),
LabelFieldDescriptor.FieldType.TEXTFIELD,
LabelFieldDescriptor.LabelType.PRIMARY, UIFactory.PATH_FIELD_SIZE);
- lServerLocation = makeJLabel(desc);
+ lServerLocation = UIFactory.makeJLabel(desc);
tfServerLocationParent = UIFactory.makeJTextComponent(desc, "");
lServerLocation.setLabelFor(tfServerLocationParent);
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/UIFactory.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/UIFactory.java
index 37bd4ca..0496457 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/UIFactory.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/UIFactory.java
@@ -40,6 +40,7 @@
import javax.swing.*;
import javax.swing.text.JTextComponent;
+import javax.swing.text.html.HTMLEditorKit;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
@@ -460,7 +461,7 @@
/**
* Specifies the font for the text in the WebBrowserErrorDialog.
*/
- public static final Font BROWSER_ERROR_DIALOG_FONT =
+ public static final Font ERROR_DIALOG_FONT =
Font.decode("Arial-PLAIN-12");
private static final String SPAN_CLOSE = "</span>";
@@ -655,11 +656,24 @@
}
/**
+ * Creates a new JPanel.
+ * @return JPanel newly created
+ */
+ public static JPanel makeJPanel() {
+ JPanel pnl = new JPanel();
+ pnl.setOpaque(false);
+ return pnl;
+ }
+
+ /**
* Creates a JComboBox.
* @return JComboBox a new combo box
*/
static public JComboBox makeJComboBox() {
- return new JComboBox();
+ JComboBox cbo = new JComboBox();
+ cbo.setOpaque(true);
+ cbo.setBackground(Color.WHITE);
+ return cbo;
}
/**
@@ -1037,8 +1051,25 @@
*/
public static JEditorPane makeHtmlPane(String text, Font font)
{
- JEditorPane pane =
- new JEditorPane("text/html", applyFontToHtmlWithDiv(text, font));
+ return makeHtmlPane(text, null, font);
+ }
+
+ /**
+ * Returns a read only JEditorPane containing the provided text with the
+ * provided font. The JEditorPane will assume that the text is HTML text.
+ * @param text the text to be used to initialize the JEditorPane contents.
+ * @param ek HTMLEditor kit used for the new HTML pane
+ * @param font the font to be used.
+ * @return a read only JEditorPane containing the provided text with the
+ * provided font.
+ */
+ public static JEditorPane makeHtmlPane(String text, HTMLEditorKit ek,
+ Font font)
+ {
+ JEditorPane pane = new JEditorPane();
+ if (ek != null) pane.setEditorKit(ek);
+ pane.setContentType("text/html");
+ pane.setText(applyFontToHtmlWithDiv(text, font));
pane.setEditable(false);
pane.setBorder(new EmptyBorder(0, 0, 0, 0));
return pane;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/Utilities.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/Utilities.java
index 8431aa3..73295f1 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/Utilities.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/Utilities.java
@@ -49,8 +49,9 @@
{
GridBagConstraints gbc = new GridBagConstraints();
- JPanel panel = new JPanel(new GridBagLayout());
- panel.setOpaque(false);
+ JPanel panel = UIFactory.makeJPanel();
+ panel.setLayout(new GridBagLayout());
+
gbc.insets = UIFactory.getEmptyInsets();
gbc.gridwidth = 4;
gbc.weightx = 0.0;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebBrowserErrorDialog.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebBrowserErrorDialog.java
index 2336d80..ef78ce4 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebBrowserErrorDialog.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebBrowserErrorDialog.java
@@ -134,7 +134,7 @@
{ url });
JTextComponent tf =
UIFactory.makeHtmlPane(msg,
- UIFactory.BROWSER_ERROR_DIALOG_FONT);
+ UIFactory.ERROR_DIALOG_FONT);
tf.setOpaque(false);
tf.setEditable(false);
p1.add(tf, gbc);
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebProxyDialog.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebProxyDialog.java
new file mode 100644
index 0000000..9825931
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/WebProxyDialog.java
@@ -0,0 +1,392 @@
+/*
+ * 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.ui;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+import java.util.Properties;
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+
+/**
+ * Dialog allowing the user to specify a host, port, user name and passoword
+ * for accessing a web proxy.
+ */
+public class WebProxyDialog extends JDialog
+ implements PropertyChangeListener, ActionListener {
+
+ private static final long serialVersionUID = 4402474441754399992L;
+
+ private JTextField tfHost;
+ private JTextField tfPort;
+ private JCheckBox chkRequiresAuth;
+ private JTextField tfUserName;
+ private JPasswordField tfPassword;
+
+ private JOptionPane optionPane;
+
+ /**
+ * Creates an instance loading values from system properties.
+ * @param parent of this dialog
+ */
+ public WebProxyDialog(Frame parent) {
+ this(parent, null, null, null, null);
+ loadSystemProperties();
+ }
+
+ /**
+ * Creates an instance loading values from system properties.
+ * @param parent of this dialog
+ */
+ public WebProxyDialog(Dialog parent) {
+ this(parent, null, null, null, null);
+ loadSystemProperties();
+ }
+
+ /**
+ * Creates an instance.
+ * @param parent of this dialog
+ * @param host default value for host field
+ * @param port default value for port field
+ * @param user default value for user field
+ * @param pw default value for password field
+ */
+ public WebProxyDialog(Frame parent, String host, Integer port,
+ String user, char[] pw) {
+ super(parent, /*modal=*/true);
+ init(host, port, user, pw);
+ }
+
+ /**
+ * Creates an instance.
+ * @param parent of this dialog
+ * @param host default value for host field
+ * @param port default value for port field
+ * @param user default value for user field
+ * @param pw default value for password field
+ */
+ public WebProxyDialog(Dialog parent, String host, Integer port,
+ String user, char[] pw) {
+ super(parent, /*modal=*/true);
+ init(host, port, user, pw);
+ }
+
+ private void init(String host, Integer port, String user, char[] pw) {
+ setTitle("Proxy Configuration");
+ optionPane = createContentPane(host, port, user, pw);
+ optionPane.addPropertyChangeListener(this);
+ setContentPane(optionPane);
+ setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+
+ //Ensure the text field always gets the first focus.
+ addComponentListener(new ComponentAdapter() {
+ public void componentShown(ComponentEvent ce) {
+ tfHost.requestFocusInWindow();
+ }
+ });
+ pack();
+ }
+
+ /**
+ * Creates a SocketAddress from current data.
+ * @return newly created SocketAddress from the current value of the
+ * host and port fields
+ */
+ public SocketAddress getSocketAddress() {
+ SocketAddress addr = null;
+ String host = getHost();
+ Integer port = getPort();
+ if (host != null && port != null) {
+ addr = new InetSocketAddress(host, port);
+ }
+ return addr;
+ }
+
+ private JOptionPane createContentPane(String host, Integer port,
+ String user, char[] pw) {
+ JOptionPane pane = new JOptionPane(createPanel(host, port, user, pw),
+ JOptionPane.INFORMATION_MESSAGE,
+ JOptionPane.OK_CANCEL_OPTION);
+ return pane;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void propertyChange(PropertyChangeEvent e) {
+ String prop = e.getPropertyName();
+
+ if (isVisible()
+ && (e.getSource() == optionPane)
+ && (JOptionPane.VALUE_PROPERTY.equals(prop) ||
+ JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
+ Object value = optionPane.getValue();
+
+ if (value == JOptionPane.UNINITIALIZED_VALUE) {
+ //ignore reset
+ return;
+ }
+
+ //Reset the JOptionPane's value.
+ //If you don't do this, then if the user
+ //presses the same button next time, no
+ //property change event will be fired.
+ optionPane.setValue(
+ JOptionPane.UNINITIALIZED_VALUE);
+
+ if (value.equals(JOptionPane.OK_OPTION)) {
+ if (validateUserData()) {
+ setVisible(false);
+ }
+ } else if (value.equals(JOptionPane.CANCEL_OPTION)) {
+ setVisible(false);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void actionPerformed(ActionEvent actionEvent) {
+ optionPane.setValue(JOptionPane.OK_OPTION);
+ }
+
+ /**
+ * Gets the current value of the host field.
+ * @return String representing the host value
+ */
+ public String getHost() {
+ String v = tfHost.getText();
+ if (v != null && v.trim().length() == 0) v = null;
+ return v;
+ }
+
+ /**
+ * Gets the current value of the port field.
+ * @return String representing the port value
+ */
+ public Integer getPort() {
+ Integer i = null;
+ String v = tfPort.getText();
+ if (v != null && v.trim().length() == 0) v = null;
+ try {
+ i = Integer.parseInt(v);
+ } catch (NumberFormatException e) {
+ // do nothing;
+ }
+ return i;
+ }
+
+ /**
+ * Gets the current value of the user field.
+ * @return String representing the user value
+ */
+ public String getUserName() {
+ String v = tfUserName.getText();
+ if ((v != null && v.trim().length() == 0) ||
+ !chkRequiresAuth.isSelected()) v = null;
+ return v;
+ }
+
+ /**
+ * Gets the current value of the password field.
+ * @return char[] representing the password value
+ */
+ public char[] getPassword() {
+ char[] v = tfPassword.getPassword();
+ if ((v != null && v.length == 0) ||
+ !chkRequiresAuth.isSelected()) v = null;
+ return v;
+ }
+
+ /**
+ * Writes the current values to system properties.
+ */
+ public void applySystemProperties() {
+ Properties systemSettings = System.getProperties();
+
+ String v = tfHost.getText();
+ if (v != null && v.trim().length() == 0) v = null;
+ systemSettings.put("http.proxyHost", v);
+ systemSettings.put("https.proxyHost", v);
+
+ v = tfPort.getText();
+ if (v != null && v.trim().length() == 0) v = null;
+ systemSettings.put("http.proxyPort", v);
+ systemSettings.put("https.proxyPort", v);
+
+ System.setProperties(systemSettings);
+ }
+
+ private void loadSystemProperties() {
+ Properties systemSettings = System.getProperties();
+
+ Object v = systemSettings.get("http.proxyHost");
+ tfHost.setText(v != null ? v.toString() : "");
+
+ v = systemSettings.get("http.proxyPort");
+ tfPort.setText(v != null ? v.toString() : "");
+ }
+
+ private JPanel createPanel(String host, Integer port,
+ String user, char[] pw) {
+ JPanel p = new JPanel();
+ p.setLayout(new GridBagLayout());
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ final JLabel lblUser = UIFactory.makeJLabel(null, "User:",
+ UIFactory.TextStyle.SECONDARY_FIELD_VALID);
+
+ final JLabel lblPassword = UIFactory.makeJLabel(null, "Password:",
+ UIFactory.TextStyle.SECONDARY_FIELD_VALID);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+ gbc.fill = GridBagConstraints.NONE;
+ p.add(new JLabel("Proxy Host:"), gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.weightx = 1.0;
+ p.add(tfHost = new JTextField(host), gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ gbc.weightx = 0;
+ gbc.fill = GridBagConstraints.NONE;
+ p.add(new JLabel("Proxy Port:"), gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 1;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ p.add(tfPort = new JTextField(port != null?port.toString():""), gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 2;
+ gbc.weightx = 0;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.insets.top = 7; // I don't understand why this is necesary
+ p.add(new JLabel("Auhentication:"), gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 2;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.insets.top = 0;
+ p.add(chkRequiresAuth = new JCheckBox("Required by proxy"), gbc);
+ chkRequiresAuth.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent actionEvent) {
+ tfUserName.setEnabled(chkRequiresAuth.isSelected());
+ tfPassword.setEnabled(chkRequiresAuth.isSelected());
+ lblUser.setEnabled(chkRequiresAuth.isSelected());
+ lblPassword.setEnabled(chkRequiresAuth.isSelected());
+ }
+ });
+
+ gbc.gridx = 0;
+ gbc.gridy = 3;
+ gbc.gridwidth = 1;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.insets.left = UIFactory.LEFT_INSET_SECONDARY_FIELD;
+ p.add(lblUser, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 3;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.insets.left = 0;
+ p.add(tfUserName = new JTextField(user), gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 4;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.insets.left = UIFactory.LEFT_INSET_SECONDARY_FIELD;
+ p.add(lblPassword, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 4;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.insets.left = 0;
+ gbc.weighty = 1.0;
+ p.add(tfPassword = new JPasswordField(pw != null ? new String(pw) : ""),
+ gbc);
+
+ // By default, proxy does not require auth
+ chkRequiresAuth.setSelected(false);
+ tfUserName.setEnabled(false);
+ tfPassword.setEnabled(false);
+ lblPassword.setEnabled(false);
+ lblUser.setEnabled(false);
+
+ // For automatic closure
+ tfHost.addActionListener(this);
+ tfPort.addActionListener(this);
+ tfUserName.addActionListener(this);
+ tfPassword.addActionListener(this);
+
+ return p;
+ }
+
+ private boolean validateUserData() {
+ String errorMsg = null;
+ String portString = tfPort.getText();
+
+ //TODO better port number verification
+ try {
+ Integer.parseInt(portString);
+ } catch (NumberFormatException e) {
+ errorMsg = "Illegal port value " + portString;
+ }
+
+ if (errorMsg != null) {
+ JOptionPane.showMessageDialog(this, errorMsg);
+ }
+ return (errorMsg == null);
+ }
+
+// /**
+// * For testing.
+// * @param args cl args
+// */
+// public static void main(String[] args) {
+// JDialog dlg = new WebProxyDialog(new JFrame());
+// dlg.addComponentListener(new ComponentAdapter() {
+// public void componentHidden(ComponentEvent componentEvent) {
+// System.exit(0);
+// }
+// });
+// dlg.setVisible(true);
+// }
+
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Build.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Build.java
new file mode 100644
index 0000000..a459219
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Build.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 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.upgrader;
+
+import java.net.URL;
+
+/**
+ * Representation of an OpenDS build package.
+ */
+public class Build {
+
+ private URL url;
+ private String id;
+
+ /**
+ * Creates an instance.
+ * @param url where the build package can be accessed
+ * @param id of the new build
+ */
+ Build(URL url, String id) {
+ this.url = url;
+ this.id = id;
+ }
+
+ /**
+ * Gets the URL where the build can be accessed.
+ * @return URL representing access to the build package
+ */
+ public URL getUrl() {
+ return url;
+ }
+
+ /**
+ * Gets the builds ID number, a 14 digit number representing the time
+ * the build was created.
+ * @return String represenging the build
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Gets a string appropriate for presentation to a user.
+ * @return String representing this build
+ */
+ public String getDisplayName() {
+ return getId();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString() {
+ return getDisplayName();
+ }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
index 15c4bd0..ca6ea19 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/RemoteBuildManager.java
@@ -29,14 +29,17 @@
import org.opends.quicksetup.Application;
+import javax.swing.*;
import java.net.URL;
import java.net.Proxy;
import java.net.URLConnection;
import java.util.*;
+import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.logging.Logger;
import java.io.*;
+import java.awt.*;
/**
* Manages listing and retreival of build packages on a remote host.
@@ -51,54 +54,27 @@
*/
enum BuildType {
+ /**
+ * Nightly build descriptor.
+ */
NIGHTLY,
+ /**
+ * Weekly build descriptor.
+ */
WEEKLY
}
- /**
- * Representation of an OpenDS build package.
- */
- public class Build {
-
- private URL url;
- private String id;
-
- /**
- * Creates an instance.
- * @param url where the build package can be accessed
- * @param id of the new build
- */
- Build(URL url, String id) {
- this.url = url;
- this.id = id;
- }
-
- /**
- * Gets the URL where the build can be accessed.
- * @return URL representing access to the build package
- */
- public URL getUrl() {
- return url;
- }
-
- /**
- * Gets the builds ID number, a 14 digit number representing the time
- * the build was created.
- * @return String represenging the build
- */
- public String getId() {
- return id;
- }
-
- }
-
private Application app;
+ private URL url;
+
private Proxy proxy;
- private URL url;
+ private String proxyUserName;
+
+ private char[] proxyPw;
/**
* Creates an instance.
@@ -111,14 +87,36 @@
}
/**
+ * Gets the base context where the build information is stored.
+ * @return URL representing base context of the build repo
+ */
+ public URL getBaseContext() {
+ return this.url;
+ }
+
+ /**
* Gets a list of builds found in the remote repository.
* @return List of Build objects representing remote builds
* @throws IOException if there was a problem contacting the build
* repository
*/
public List<Build> listBuilds() throws IOException {
+ return listBuilds(null, null);
+ }
+
+ /**
+ * Gets the list of builds from the build repository using a
+ * progress monitor to keep the user informed about the status
+ * of downloading the build page.
+ * @param c Component to act as parent of the progress monitor
+ * @param o message to display in the progress monitor
+ * @return list of Build objects
+ * @throws IOException if something goes wrong loading the list
+ * from the build repository
+ */
+ public List<Build> listBuilds(Component c, Object o) throws IOException {
List<Build> buildList = new ArrayList<Build>();
- String dailyBuildsPage = getDailyBuildsPage();
+ String dailyBuildsPage = downloadDailyBuildsPage(c, o);
Pattern p = Pattern.compile("\\d{14}");
Matcher m = p.matcher(dailyBuildsPage);
Set<String> buildIds = new HashSet<String>();
@@ -131,7 +129,9 @@
return buildList;
}
- private String getDailyBuildsPage() throws IOException {
+ private String downloadDailyBuildsPage(Component c, Object o)
+ throws IOException
+ {
URL dailyBuildsUrl = new URL(url, "daily-builds");
URLConnection conn;
if (proxy == null) {
@@ -139,7 +139,21 @@
} else {
conn = dailyBuildsUrl.openConnection(proxy);
}
- InputStream in = conn.getInputStream();
+ String proxyAuthString = createProxyAuthString();
+ if (proxyAuthString != null) {
+ conn.setRequestProperty("Proxy-Authorization", "Basic " +
+ proxyAuthString);
+ }
+ InputStream in;
+ if (c != null) {
+ ProgressMonitorInputStream pmis =
+ new ProgressMonitorInputStream(c, o, conn.getInputStream());
+ ProgressMonitor pm = pmis.getProgressMonitor();
+ pm.setMillisToDecideToPopup(0);
+ in = pmis;
+ } else {
+ in = conn.getInputStream();
+ }
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder builder = new StringBuilder();
String line;
@@ -154,30 +168,146 @@
* location on the local file system.
* @param build to download
* @param destination directory for the newly downloaded file
+ * @throws IOException if the build could not be downloaded
*/
- public void download(Build build, File destination) {
+ public void download(Build build, File destination) throws IOException {
+ download(build.getUrl(), destination);
+ }
+ private void download(URL url, File destination) throws IOException {
+ URLConnection conn = null;
+ if (proxy == null) {
+ conn = url.openConnection();
+ } else {
+ conn = url.openConnection(proxy);
+ }
+ String proxyAuthString = createProxyAuthString();
+ if (proxyAuthString != null) {
+ conn.setRequestProperty("Proxy-Authorization", "Basic " +
+ proxyAuthString);
+ }
+ InputStream is = null;
+ FileOutputStream fos = null;
+ try {
+ is = conn.getInputStream();
+ fos = new FileOutputStream(destination);
+ int i = 0;
+ int bytesRead = 0;
+ byte[] buf = new byte[1024];
+ while ((i = is.read(buf)) != -1) {
+ fos.write(buf, 0, i);
+ bytesRead += i;
+ }
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (fos != null) {
+ fos.close();
+ }
+ }
+ }
+
+ /**
+ * Sets the proxy object this class will use when establishing network
+ * connections.
+ * @param proxy to use when establishing connections
+ */
+ public void setProxy(Proxy proxy) {
+ this.proxy = proxy;
+ }
+
+ /**
+ * Gets the proxy object this class uses when establishing network
+ * connections.
+ * @return Proxy to use when establishing connections
+ */
+ public Proxy getProxy() {
+ return this.proxy;
+ }
+
+ /**
+ * Sets the user name this class will use to authenticate to its
+ * proxy when establishing network connections.
+ * @param user this class is acting on behalf of
+ */
+ public void setProxyUserName(String user) {
+ this.proxyUserName = user;
+ }
+
+ /**
+ * Sets the user name this class will use to authenticate to its
+ * proxy when establishing network connections.
+ * @return String representing the name of the user of which this class is
+ * acting on behalf
+ */
+ public String getProxyUserName() {
+ return this.proxyUserName;
+ }
+
+ /**
+ * Sets the password this class will use to authenticate to its
+ * proxy when establishing network connections.
+ * @param pw char[] representing the password of the user of which this class
+ * is acting on behalf
+ */
+ public void setProxyPassword(char[] pw) {
+ this.proxyPw = pw;
+ }
+
+ /**
+ * Sets the password this class will use to authenticate to its
+ * proxy when establishing network connections.
+ * @return char[] representing the password of the user of which this class is
+ * acting on behalf
+ */
+ public char[] getProxyPassword() {
+ return this.proxyPw;
+ }
+
+ private String createProxyAuthString() {
+ return createAuthenticationString(getProxyUserName(), getProxyPassword());
+ }
+
+ static private String createAuthenticationString(String user, char[] pw) {
+ String s = null;
+ if (user != null && pw != null) {
+ StringBuilder sb = new StringBuilder()
+ .append(user)
+ .append(":")
+ .append(pw);
+ s = org.opends.server.util.Base64.encode(sb.toString().getBytes());
+ }
+ return s;
}
/**
* For testing only.
* @param args command line arguments
*/
- public static void main(String[] args) {
- try {
- Properties systemSettings = System.getProperties();
- systemSettings.put("http.proxyHost", "webcache.central.sun.com");
- systemSettings.put("http.proxyPort", "8080");
- System.setProperties(systemSettings);
- URL url = new URL("http://builds.opends.org");
- RemoteBuildManager rbm = new RemoteBuildManager(null, url);
- List<Build> builds = rbm.listBuilds();
- for (Build build : builds) {
- System.out.println("build " + build.getId());
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
+// public static void main(String[] args) {
+// try {
+// Properties systemSettings = System.getProperties();
+// systemSettings.put("http.proxyHost", "webcache.central.sun.com");
+// systemSettings.put("http.proxyPort", "8080");
+// systemSettings.put("https.proxyHost", "webcache.central.sun.com");
+// systemSettings.put("https.proxyPort", "8080");
+//
+// System.setProperties(systemSettings);
+//
+// URL url = new URL("http://builds.opends.org");
+// RemoteBuildManager rbm = new RemoteBuildManager(null, url);
+// //List<Build> builds = rbm.listBuilds();
+// //for (Build build : builds) {
+// // System.out.println("build " + build);
+// //}
+// rbm.download(new URL("https://opends.dev.java.net/" +
+// "files/documents/4926/55351/OpenDS-0.1-build035.zip"),
+// new File("/tmp/OpenDS-xxx.zip"));
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+//
+// }
- }
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeUserData.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeUserData.java
index e73d176..382449e 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeUserData.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeUserData.java
@@ -38,6 +38,8 @@
File installPackage;
+ Build buildToDownload;
+
/**
* Gets the OpenDS package (.zip) file whose contents will
* be used in the upgrade/reversion.
@@ -56,4 +58,22 @@
this.installPackage = installPackage;
}
+ /**
+ * Gets the Build that will need to be downloaded before
+ * the upgrade can begin.
+ * @return Build representing the build to download
+ */
+ public Build getInstallPackageToDownload() {
+ return buildToDownload;
+ }
+
+ /**
+ * Sets the Build that will need to be downloaded before
+ * the upgrade can begin.
+ * @param build Build to download
+ */
+ public void setBuildToDownload(Build build) {
+ this.buildToDownload = build;
+ }
+
}
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 88ae62f..9d86f03 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
@@ -34,6 +34,7 @@
import org.opends.quicksetup.util.Utils;
import org.opends.quicksetup.util.FileManager;
import org.opends.quicksetup.util.ServerController;
+import org.opends.quicksetup.util.ZipExtractor;
import org.opends.quicksetup.ui.*;
import org.opends.server.tools.BackUpDB;
import org.opends.server.tools.LDIFDiff;
@@ -49,6 +50,8 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.*;
+import java.net.URL;
+import java.net.MalformedURLException;
import static org.opends.quicksetup.Installation.*;
@@ -92,6 +95,10 @@
NOT_STARTED("summary-upgrade-not-started"),
+ DOWNLOADING("summary-upgrade-downloading"),
+
+ EXTRACTING("summary-upgrade-extracting"),
+
INITIALIZING("summary-upgrade-initializing"),
STARTING_SERVER("summary-starting"),
@@ -203,6 +210,8 @@
/** SVN rev number of the build in the stage directory. */
private Integer stagedVersion = null;
+ private RemoteBuildManager remoteBuildManager = null;
+
/**
* {@inheritDoc}
*/
@@ -227,6 +236,26 @@
}
/**
+ * 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() {
+ if (remoteBuildManager == null) {
+ try {
+ // TODO: make this configurable.
+ // The slash at the end of the URL was/is important in getting the
+ // correct redirection from the web server
+ URL buildRepo = new URL("http://builds.opends.org/");
+ remoteBuildManager = new RemoteBuildManager(this, buildRepo);
+ } catch (MalformedURLException e) {
+ LOG.log(Level.INFO, "error", e);
+ }
+ }
+ return remoteBuildManager;
+ }
+
+ /**
* {@inheritDoc}
*/
protected String getInstallationPath() {
@@ -236,9 +265,20 @@
// we still want the Installation to point at the build being
// upgraded so the install path reported in [installroot].
- String stagePath = Utils.getInstallPathFromClasspath();
- File f = new File(stagePath);
- return Utils.getPath(f.getParentFile().getParentFile());
+ String installationPath = null;
+ String path = Utils.getInstallPathFromClasspath();
+ if (path != null) {
+ File f = new File(path);
+ if (f.getParentFile() != null &&
+ f.getParentFile().getParentFile() != null &&
+ new File(f.getParentFile().getParentFile(),
+ Installation.LOCKS_PATH_RELATIVE).exists()) {
+ installationPath = Utils.getPath(f.getParentFile().getParentFile());
+ } else {
+ installationPath = path;
+ }
+ }
+ return installationPath;
}
/**
@@ -352,6 +392,60 @@
*/
public void updateUserData(WizardStep cStep, QuickSetup qs)
throws UserDataException {
+ List<String> errorMsgs = new ArrayList<String>();
+ UpgradeUserData uud = getUpgradeUserData();
+ if (cStep == UpgradeWizardStep.WELCOME) {
+
+ // User can only select the installation to upgrade
+ // in the webstart version of this tool. Otherwise
+ // the fields are readonly.
+ if (Utils.isWebStart()) {
+ String serverLocationString =
+ qs.getFieldStringValue(FieldName.SERVER_LOCATION);
+ if ((serverLocationString == null) ||
+ ("".equals(serverLocationString.trim()))) {
+ errorMsgs.add(getMsg("empty-server-location"));
+ qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true);
+ } else {
+ try {
+ File serverLocation = new File(serverLocationString);
+ Installation.validateRootDirectory(serverLocation);
+
+ // If we get here the value is acceptable
+ Installation installation = new Installation(serverLocation);
+ setInstallation(installation);
+ uud.setServerLocation(serverLocationString);
+
+ } catch (IllegalArgumentException iae) {
+ errorMsgs.add(getMsg("error-invalid-server-location",
+ iae.getLocalizedMessage()));
+ qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true);
+ }
+ }
+ } else {
+ // do nothing; all fields are read-only
+ }
+
+ } else if (cStep == UpgradeWizardStep.CHOOSE_VERSION) {
+ Build buildToDownload = null;
+ File buildFile = null;
+ Boolean downloadFirst =
+ (Boolean)qs.getFieldValue(FieldName.UPGRADE_DOWNLOAD);
+ if (downloadFirst) {
+ buildToDownload =
+ (Build)qs.getFieldValue(FieldName.UPGRADE_BUILD_TO_DOWNLOAD);
+ } else {
+ buildFile = (File)qs.getFieldValue(FieldName.UPGRADE_FILE);
+ }
+ uud.setBuildToDownload(buildToDownload);
+ uud.setInstallPackage(buildFile);
+ }
+
+ if (errorMsgs.size() > 0) {
+ throw new UserDataException(Step.SERVER_SETTINGS,
+ Utils.getStringFromCollection(errorMsgs, "\n"));
+ }
+
}
/**
@@ -402,6 +496,51 @@
runException = null;
try {
+
+ File buildZip;
+ Build buildToDownload =
+ getUpgradeUserData().getInstallPackageToDownload();
+ if (buildToDownload != null) {
+ try {
+ setCurrentProgressStep(UpgradeProgressStep.DOWNLOADING);
+ buildZip = new File(getStageDirectory(), "OpenDS.zip");
+ if (buildZip.exists()) {
+ if (!buildZip.delete()) {
+ throw ApplicationException.createFileSystemException(
+ "Could not delete existing build file " +
+ Utils.getPath(buildZip), null);
+ }
+ }
+ getRemoteBuildManager().download(buildToDownload, buildZip);
+ } catch (ApplicationException e) {
+ LOG.log(Level.INFO, "Error downloading build file", e);
+ throw e;
+ }
+ } else {
+ buildZip = getUpgradeUserData().getInstallPackage();
+ }
+
+ if (buildZip != null) {
+ try {
+ setCurrentProgressStep(UpgradeProgressStep.EXTRACTING);
+ ZipExtractor extractor = new ZipExtractor(buildZip,
+ 1, 10, // TODO figure out these values
+ Utils.getNumberZipEntries(), this);
+ extractor.extract(getStageDirectory());
+ } catch (ApplicationException e) {
+ LOG.log(Level.INFO, "Error extracting build file", e);
+ throw e;
+ }
+ }
+
+ try {
+ setCurrentProgressStep(UpgradeProgressStep.INITIALIZING);
+ initialize();
+ } catch (ApplicationException e) {
+ LOG.log(Level.INFO, "Error initializing upgrader", e);
+ throw e;
+ }
+
try {
setCurrentProgressStep(UpgradeProgressStep.INITIALIZING);
initialize();
@@ -1062,6 +1201,19 @@
/**
* {@inheritDoc}
*/
+ public UserData createUserData() {
+ UpgradeUserData uud = new UpgradeUserData();
+ String instanceRootFromSystem =
+ System.getProperty("org.opends.quicksetup.upgrader.Root");
+ if (instanceRootFromSystem != null) {
+ uud.setServerLocation(instanceRootFromSystem);
+ }
+ return uud;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public UserData createUserData(String[] args, CurrentInstallStatus cis)
throws UserDataException {
return getCliHelper().createUserData(args, cis);
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java
index 154482e..40921cf 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java
@@ -27,23 +27,52 @@
package org.opends.quicksetup.upgrader.ui;
+import org.opends.quicksetup.UserData;
+import org.opends.quicksetup.ui.CustomHTMLEditorKit;
+import org.opends.quicksetup.ui.FieldName;
+import org.opends.quicksetup.ui.GuiApplication;
import org.opends.quicksetup.ui.QuickSetupStepPanel;
import org.opends.quicksetup.ui.UIFactory;
import org.opends.quicksetup.ui.Utilities;
-import org.opends.quicksetup.ui.GuiApplication;
+import org.opends.quicksetup.ui.WebProxyDialog;
+import org.opends.quicksetup.upgrader.Build;
+import org.opends.quicksetup.upgrader.RemoteBuildManager;
+import org.opends.quicksetup.upgrader.Upgrader;
+import org.opends.quicksetup.util.BackgroundTask;
import javax.swing.*;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.SocketAddress;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* This panel allows the user to select a remote or local build for upgrade.
*/
public class ChooseVersionPanel extends QuickSetupStepPanel {
- private static final long serialVersionUID = -6941309163077121917L;
+ static private final Logger LOG =
+ Logger.getLogger(ChooseVersionPanel.class.getName());
+
+ static private final long serialVersionUID = -6941309163077121917L;
+
+ private JRadioButton rbRemote = null;
+ private JRadioButton rbLocal = null;
+ private ButtonGroup grpRemoteLocal = null;
+ private JComboBox cboBuild = null;
+ private JTextField tfFile = null;
+ private boolean loadBuildListAttempted = false;
/**
* Creates an instance.
+ *
* @param application this panel represents.
*/
public ChooseVersionPanel(GuiApplication application) {
@@ -53,33 +82,63 @@
/**
* {@inheritDoc}
*/
+ public void beginDisplay(UserData data) {
+ super.beginDisplay(data);
+ if (!loadBuildListAttempted) {
+ loadBuildList();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object getFieldValue(FieldName fieldName) {
+ Object value = null;
+ if (FieldName.UPGRADE_DOWNLOAD.equals(fieldName)) {
+ value = new Boolean(rbRemote.isSelected());
+ } else if (FieldName.UPGRADE_BUILD_TO_DOWNLOAD.equals(fieldName)) {
+ value = cboBuild.getSelectedItem();
+ } else if (FieldName.UPGRADE_FILE.equals(fieldName)) {
+ value = new File(tfFile.getText());
+ }
+ return value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
protected Component createInputPanel() {
Component c;
- JPanel p = new JPanel();
+ JPanel p = UIFactory.makeJPanel();
- JRadioButton rbRemote = UIFactory.makeJRadioButton(
+ rbRemote = UIFactory.makeJRadioButton(
getMsg("upgrade-choose-version-remote-label"),
getMsg("upgrade-choose-version-remote-tooltip"),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
- JRadioButton rbLocal = UIFactory.makeJRadioButton(
+ rbLocal = UIFactory.makeJRadioButton(
getMsg("upgrade-choose-version-local-label"),
getMsg("upgrade-choose-version-local-tooltip"),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
- JComboBox cboBuild = UIFactory.makeJComboBox();
- cboBuild.setModel(createBuildComboBoxModel());
+ grpRemoteLocal = new ButtonGroup();
+ grpRemoteLocal.add(rbRemote);
+ grpRemoteLocal.add(rbLocal);
+ grpRemoteLocal.setSelected(rbRemote.getModel(), true);
+
+ cboBuild = UIFactory.makeJComboBox();
+ cboBuild.setEditable(false);
// TODO: use UIFactory
- JTextField tfBuild = new JTextField();
- tfBuild.setColumns(20);
+ tfFile = new JTextField();
+ tfFile.setColumns(20);
JPanel pnlBrowse = Utilities.createBrowseButtonPanel(
UIFactory.makeJLabel(null,
getMsg("upgrade-choose-version-local-path"),
UIFactory.TextStyle.SECONDARY_FIELD_VALID),
- tfBuild,
+ tfFile,
UIFactory.makeJButton(getMsg("browse-button-label"),
getMsg("browse-button-tooltip")));
@@ -113,7 +172,7 @@
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = UIFactory.getEmptyInsets();
- JPanel fill = new JPanel();
+ JPanel fill = UIFactory.makeJPanel();
// fill.setBorder(BorderFactory.createLineBorder(Color.BLUE));
p.add(fill, gbc);
@@ -134,11 +193,10 @@
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.LINE_START;
- JPanel fill2 = new JPanel();
+ JPanel fill2 = UIFactory.makeJPanel();
//fill.setBorder(BorderFactory.createLineBorder(Color.BLUE));
p.add(fill2, gbc);
-
c = p;
return c;
}
@@ -157,10 +215,243 @@
return getMsg("upgrade-choose-version-panel-instructions");
}
- private ComboBoxModel createBuildComboBoxModel() {
- // TODO: populate a list model with builds.
- ComboBoxModel cbm = new DefaultComboBoxModel(new String[] {"xx","YY","ZZ"});
- return cbm;
+ private void loadBuildList() {
+ RemoteBuildListComboBoxModelCreator bld =
+ new RemoteBuildListComboBoxModelCreator();
+ bld.startBackgroundTask();
+ }
+
+ private void specifyProxy(final Component parent) {
+ Runnable proxySpecifier = new Runnable() {
+ public void run() {
+ String host = null;
+ Integer port = null;
+ RemoteBuildManager rbm =
+ ((Upgrader) getApplication()).getRemoteBuildManager();
+ Proxy proxy = rbm.getProxy();
+ if (proxy != null) {
+ SocketAddress address = proxy.address();
+ if (address instanceof InetSocketAddress) {
+ host = ((InetSocketAddress) address).getHostName();
+ port = ((InetSocketAddress) address).getPort();
+ }
+ }
+ String user = rbm.getProxyUserName();
+ char[] pw = rbm.getProxyPassword();
+ WebProxyDialog dlg;
+ if (parent instanceof Dialog) {
+ dlg = new WebProxyDialog((Dialog) parent, host, port, user, pw);
+ } else if (parent instanceof Frame) {
+ dlg = new WebProxyDialog((Frame) parent, host, port, user, pw);
+ } else {
+ dlg = new WebProxyDialog((Frame) null, host, port, user, pw);
+ }
+ dlg.setVisible(true);
+ SocketAddress address = dlg.getSocketAddress();
+ if (address != null) {
+ proxy = new Proxy(Proxy.Type.HTTP, address);
+ rbm.setProxy(proxy);
+ rbm.setProxyUserName(dlg.getUserName());
+ rbm.setProxyPassword(dlg.getPassword());
+ }
+ }
+ };
+ if (SwingUtilities.isEventDispatchThread()) {
+ proxySpecifier.run();
+ } else {
+ try {
+ SwingUtilities.invokeAndWait(proxySpecifier);
+ } catch (InterruptedException e) {
+ LOG.log(Level.INFO, "error", e);
+ } catch (InvocationTargetException e) {
+ LOG.log(Level.INFO, "error", e);
+ } catch (Throwable t) {
+ LOG.log(Level.INFO, "error", t);
+ }
+ }
+ }
+
+ /**
+ * Renders the combo box when there has been an error downloading
+ * the build information.
+ */
+ private class BuildListErrorComboBoxRenderer extends JLabel
+ implements ListCellRenderer {
+
+ /**
+ * Creates a default instance.
+ */
+ public BuildListErrorComboBoxRenderer() {
+ super("Error accessing build information",
+ UIFactory.getImageIcon(UIFactory.IconType.ERROR),
+ SwingConstants.LEFT);
+ UIFactory.setTextStyle(this, UIFactory.TextStyle.SECONDARY_FIELD_INVALID);
+ setOpaque(true);
+ setBackground(Color.WHITE);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Component getListCellRendererComponent(JList jList,
+ Object object,
+ int i,
+ boolean b,
+ boolean b1) {
+ return this;
+ }
+ }
+
+ /**
+ * This panel represents the big error message the pops up when the
+ * panel can't download the build information.
+ */
+ private class BuildListDownloadErrorPanel extends JPanel {
+
+ private RemoteBuildManager rbm = null;
+ private Throwable reason = null;
+
+ /**
+ * Creates an instance.
+ * @param rbm RemoteBuildManager that is having trouble.
+ */
+ public BuildListDownloadErrorPanel(RemoteBuildManager rbm,
+ Throwable reason) {
+ this.rbm = rbm;
+ this.reason = reason;
+ layoutPanel();
+ }
+
+ private void layoutPanel() {
+ setLayout(new GridBagLayout());
+
+ String proxyString = "None";
+ Proxy proxy = rbm.getProxy();
+ if (proxy != null) {
+ SocketAddress addr = proxy.address();
+ proxyString = addr.toString();
+ }
+
+ String baseContext = "Unspecified";
+ URL url = rbm.getBaseContext();
+ if (url != null) {
+ baseContext = url.toString();
+ }
+
+ String html = getMsg("upgrade-choose-version-build-list-error",
+ new String[]{
+ baseContext,
+ reason.getLocalizedMessage(),
+ proxyString});
+
+ /* This helps with debugger the HTML rendering
+ StringBuffer content = new StringBuffer();
+ try {
+ FileInputStream fis = new FileInputStream("/tmp/error-html");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
+ String line = null;
+ while (null != (line = reader.readLine())) {
+ content.append(line);
+ }
+ html = content.toString();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ */
+
+ CustomHTMLEditorKit ek = new CustomHTMLEditorKit();
+ ek.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ev) {
+ specifyProxy(getParent());
+
+ // Since the proxy info may change we need
+ // to regenerate the text
+ removeAll();
+ layoutPanel();
+ repaint();
+ validate();
+ }
+ });
+ add(UIFactory.makeHtmlPane(html, ek, UIFactory.INSTRUCTIONS_FONT));
+ }
+
+ }
+
+ /**
+ * Uses the remote build manager is a separate thread to create
+ * and populate the combo box model with build information. Contains
+ * the loop and dialog prompting that happens if there is a problem
+ * accessing the remote build repository.
+ */
+ private class RemoteBuildListComboBoxModelCreator
+ extends BackgroundTask<java.util.List<Build>> {
+
+ private RemoteBuildManager rbm = null;
+
+ /**
+ * {@inheritDoc}
+ */
+ public java.util.List<Build> processBackgroundTask() throws Exception {
+ rbm = ((Upgrader)getApplication()).getRemoteBuildManager();
+ return rbm.listBuilds(getMainWindow(), "Loading build information");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void backgroundTaskCompleted(java.util.List<Build> buildList,
+ Throwable throwable) {
+ ComboBoxModel cbm = null;
+ if (throwable == null) {
+ cbm = new DefaultComboBoxModel(buildList.toArray());
+ } else {
+ try {
+ String[] options = { "Retry", "Close" };
+ int i = JOptionPane.showOptionDialog(getMainWindow(),
+ new BuildListDownloadErrorPanel(rbm, throwable),
+ "Network Error",
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.ERROR_MESSAGE,
+ null,
+ options,
+ null);
+ if (i == JOptionPane.NO_OPTION ||
+ i == JOptionPane.CLOSED_OPTION) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ cboBuild.setRenderer(new BuildListErrorComboBoxRenderer());
+ // Disable the remote widgets
+ cboBuild.setEnabled(false);
+ rbLocal.setSelected(true);
+ rbRemote.setSelected(false);
+ // grpRemoteLocal.setSelected(rbRemote.getModel(), false);
+ rbRemote.setEnabled(false);
+ }
+ });
+ } else {
+ loadBuildList();
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ final ComboBoxModel cbmFinal = cbm;
+ if (cbm != null) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ loadBuildListAttempted = true;
+ cboBuild.setModel(cbmFinal);
+ cboBuild.setRenderer(new DefaultListCellRenderer());
+ // Disable the remote widgets
+ cboBuild.setEnabled(true);
+ rbLocal.setSelected(false);
+ rbRemote.setSelected(true);
+ // grpRemoteLocal.setSelected(rbRemote.getModel(), false);
+ rbRemote.setEnabled(true);
+ }
+ });
+ }
+ }
}
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/UpgraderReviewPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/UpgraderReviewPanel.java
index dae6789..1ebf08c 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/UpgraderReviewPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/UpgraderReviewPanel.java
@@ -31,9 +31,16 @@
import org.opends.quicksetup.ui.UIFactory;
import org.opends.quicksetup.ui.LabelFieldDescriptor;
import org.opends.quicksetup.upgrader.Upgrader;
+import org.opends.quicksetup.upgrader.UpgradeUserData;
+import org.opends.quicksetup.upgrader.Build;
+import org.opends.quicksetup.QuickSetupException;
+import org.opends.quicksetup.UserData;
import javax.swing.*;
+import javax.swing.text.JTextComponent;
import java.awt.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Presents upgrade information to the user to confirm before starting the
@@ -41,8 +48,16 @@
*/
public class UpgraderReviewPanel extends ReviewPanel {
+ static private final Logger LOG =
+ Logger.getLogger(UpgraderReviewPanel.class.getName());
+
private static final long serialVersionUID = 5942916658585976799L;
+ JTextComponent tcServerLocation = null;
+ JTextComponent tcOldBuild = null;
+ JTextComponent tcNewBuild = null;
+ private JCheckBox checkBox;
+
/**
* Creates an instance.
* @param application Application represented by this panel
@@ -54,6 +69,15 @@
/**
* {@inheritDoc}
*/
+ public void beginDisplay(UserData data) {
+ tcServerLocation.setText(getServerToUpgrade());
+ tcOldBuild.setText(getOldBuildId());
+ tcNewBuild.setText(getNewBuildId());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
protected String getTitle() {
return getMsg("upgrade-review-panel-title");
}
@@ -69,7 +93,9 @@
* {@inheritDoc}
*/
protected JPanel createFieldsPanel() {
- JPanel p = new JPanel();
+ UpgradeUserData uud = (UpgradeUserData)getUserData();
+
+ JPanel p = UIFactory.makeJPanel();
LabelFieldDescriptor serverDescriptor = new LabelFieldDescriptor(
getMsg("upgrade-review-panel-server-label"),
@@ -110,7 +136,8 @@
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
- p.add(UIFactory.makeJTextComponent(serverDescriptor, "/xx/xx/xx"), gbc);
+ p.add(tcServerLocation = UIFactory.makeJTextComponent(serverDescriptor,
+ null), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
@@ -120,7 +147,8 @@
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
- p.add(UIFactory.makeJTextComponent(oldVersionDescriptor, "abcdefg"), gbc);
+ p.add(tcOldBuild = UIFactory.makeJTextComponent(oldVersionDescriptor,
+ null), gbc);
gbc.gridx = 0;
gbc.gridy = 2;
@@ -131,8 +159,54 @@
gbc.gridy = 2;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
- p.add(UIFactory.makeJTextComponent(newVersionDescriptor, "1234567"), gbc);
+ p.add(tcNewBuild = UIFactory.makeJTextComponent(newVersionDescriptor,
+ null), gbc);
return p;
}
+
+ private String getServerToUpgrade() {
+ return getUserData().getServerLocation();
+ }
+
+ private String getOldBuildId() {
+ String oldVersion;
+ try {
+ oldVersion = getApplication().getInstallation().getBuildId();
+ } catch (QuickSetupException e) {
+ LOG.log(Level.INFO, "error", e);
+ oldVersion = getMsg("upgrade-build-id-unknown");
+ }
+ return oldVersion;
+ }
+
+ private String getNewBuildId() {
+ String newVersion;
+ UpgradeUserData uud = (UpgradeUserData)getUserData();
+ Build build = uud.getInstallPackageToDownload();
+ if (build != null) {
+ newVersion = build.getId();
+ } else {
+ // TODO: figure out the build from the zip somehow
+ newVersion = getMsg("upgrade-build-id-unknown");
+ }
+ return newVersion;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected JCheckBox getCheckBox()
+ {
+ if (checkBox == null)
+ {
+ checkBox =
+ UIFactory.makeJCheckBox(getMsg("upgrade-review-panel-start-server"),
+ getMsg("start-server-tooltip"), UIFactory.TextStyle.CHECKBOX);
+ checkBox.setOpaque(false);
+ checkBox.setSelected(getApplication().getUserData().getStartServer());
+ }
+ return checkBox;
+ }
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
index 7944998..3a245ce 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
@@ -27,12 +27,10 @@
package org.opends.quicksetup.upgrader.ui;
-import org.opends.quicksetup.ui.QuickSetupStepPanel;
-import org.opends.quicksetup.ui.UIFactory;
-import org.opends.quicksetup.ui.Utilities;
-import org.opends.quicksetup.ui.LabelFieldDescriptor;
+import org.opends.quicksetup.ui.*;
import org.opends.quicksetup.util.Utils;
import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.UserData;
import org.opends.quicksetup.event.BrowseActionListener;
import org.opends.quicksetup.upgrader.Upgrader;
@@ -42,12 +40,18 @@
import java.util.ArrayList;
/**
- * This panel is used to show a welcome message.
+ * This panel is used to show a welcome message. If this is the WebStart,
+ * allows the user to select a build to upgrade. Otherwise shows the user
+ * some readonly information about the current build.
*/
public class WelcomePanel extends QuickSetupStepPanel {
private static final long serialVersionUID = 8695606871542491768L;
+ private JTextComponent tcServerLocation;
+
+ private JTextComponent tcCurrentServerBuildNumber;
+
/**
* Default constructor.
* @param application Upgrader application
@@ -59,6 +63,25 @@
/**
* {@inheritDoc}
*/
+ public void beginDisplay(UserData data) {
+ super.beginDisplay(data);
+ tcServerLocation.setText(data.getServerLocation());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object getFieldValue(FieldName fieldName) {
+ Object v = null;
+ if (FieldName.SERVER_LOCATION.equals(fieldName)) {
+ v = tcServerLocation.getText();
+ }
+ return v;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
protected String getTitle() {
return getMsg("upgrade-welcome-panel-title");
}
@@ -91,43 +114,65 @@
protected Component createInputPanel() {
Component c;
- JPanel pnlBuildInfo = new JPanel();
+ LabelFieldDescriptor serverLocationDescriptor =
+ new LabelFieldDescriptor(getMsg("upgrade-location-label"),
+ getMsg("upgrade-location-tooltip"),
+ LabelFieldDescriptor.FieldType.TEXTFIELD,
+ LabelFieldDescriptor.LabelType.PRIMARY,
+ UIFactory.PATH_FIELD_SIZE);
+
+ LabelFieldDescriptor serverLocationDescriptorRO =
+ new LabelFieldDescriptor(getMsg("upgrade-location-label"),
+ getMsg("upgrade-location-tooltip"),
+ LabelFieldDescriptor.FieldType.READ_ONLY,
+ LabelFieldDescriptor.LabelType.PRIMARY,
+ UIFactory.PATH_FIELD_SIZE);
+
+ LabelFieldDescriptor serverBuildDescriptorRO =
+ new LabelFieldDescriptor(getMsg("upgrade-build-id-label"),
+ getMsg("upgrade-build-id-tooltip"),
+ LabelFieldDescriptor.FieldType.READ_ONLY,
+ LabelFieldDescriptor.LabelType.PRIMARY,
+ UIFactory.PATH_FIELD_SIZE);
+
+ JPanel pnlBuildInfo = UIFactory.makeJPanel();
pnlBuildInfo.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
+ UserData userData = getApplication().getUserData();
+
// The WebStart version of this tool allows the user to
// select a build to upgrade. Running the tool from the
// command line implies a build.
- if (!Utils.isWebStart()) {
+ if (Utils.isWebStart()) {
- LabelFieldDescriptor serverLocationDescriptor =
- new LabelFieldDescriptor(getMsg("upgrade-location-label"),
- getMsg("upgrade-location-tooltip"),
- LabelFieldDescriptor.FieldType.TEXTFIELD,
- LabelFieldDescriptor.LabelType.PRIMARY,
- UIFactory.PATH_FIELD_SIZE);
-
- JTextComponent tfBuild =
- UIFactory.makeJTextComponent(serverLocationDescriptor, null);
+ tcServerLocation =
+ UIFactory.makeJTextComponent(serverLocationDescriptor,
+ userData.getServerLocation());
JButton butBrowse =
UIFactory.makeJButton(getMsg("browse-button-label"),
getMsg("browse-button-tooltip"));
BrowseActionListener l =
- new BrowseActionListener(tfBuild,
+ new BrowseActionListener(tcServerLocation,
BrowseActionListener.BrowseType.LOCATION_DIRECTORY,
getMainWindow());
butBrowse.addActionListener(l);
JPanel pnlBrowser = Utilities.createBrowseButtonPanel(
UIFactory.makeJLabel(serverLocationDescriptor),
- tfBuild,
+ tcServerLocation,
butBrowse);
- // pnlBrowser.setBorder(BorderFactory.createLineBorder(Color.GREEN));
+ pnlBrowser.setOpaque(false);
+
+ //pnlBrowser.setBorder(BorderFactory.createLineBorder(Color.GREEN));
gbc.insets.top = 15; // non-standard but looks better
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+ gbc.gridwidth = GridBagConstraints.REMAINDER;
+ gbc.weightx = 1.0;
+ gbc.fill = GridBagConstraints.BOTH;
pnlBuildInfo.add(pnlBrowser, gbc);
gbc.gridy = 1;
@@ -135,25 +180,26 @@
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.LINE_START;
- JPanel fill = new JPanel();
+ JPanel fill = UIFactory.makeJPanel();
// fill.setBorder(BorderFactory.createLineBorder(Color.BLUE));
pnlBuildInfo.add(fill, gbc);
} else {
- LabelFieldDescriptor serverLocationDescriptorRO =
- new LabelFieldDescriptor(getMsg("upgrade-location-label"),
- getMsg("upgrade-location-tooltip"),
- LabelFieldDescriptor.FieldType.READ_ONLY,
- LabelFieldDescriptor.LabelType.PRIMARY,
- UIFactory.PATH_FIELD_SIZE);
+ tcServerLocation = UIFactory.makeJTextComponent(
+ serverLocationDescriptorRO, null);
- LabelFieldDescriptor serverBuildDescriptorRO =
- new LabelFieldDescriptor(getMsg("upgrade-build-id-label"),
- getMsg("upgrade-build-id-tooltip"),
- LabelFieldDescriptor.FieldType.READ_ONLY,
- LabelFieldDescriptor.LabelType.PRIMARY,
- UIFactory.PATH_FIELD_SIZE);
+ String buildId = null;
+ Installation installation = getApplication().getInstallation();
+ try {
+ buildId = installation.getBuildId();
+ } catch (Exception e) {
+ buildId = getMsg("upgrade-build-id-unknown");
+ }
+
+ tcCurrentServerBuildNumber = UIFactory.makeJTextComponent(
+ serverBuildDescriptorRO,
+ buildId);
gbc.gridx = 0;
gbc.gridy = 0;
@@ -162,17 +208,14 @@
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
pnlBuildInfo.add(UIFactory.makeJLabel(serverLocationDescriptorRO), gbc);
+
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.PAGE_START;
- String installLocation = Utils.getPath(
- getApplication().getInstallation().getRootDirectory());
- pnlBuildInfo.add(
- UIFactory.makeJTextComponent(
- serverLocationDescriptorRO, installLocation), gbc);
+ pnlBuildInfo.add(tcServerLocation, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
@@ -185,16 +228,14 @@
gbc.gridy = 1;
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
gbc.fill = GridBagConstraints.HORIZONTAL;
- pnlBuildInfo.add(UIFactory.makeJTextComponent(
- serverBuildDescriptorRO,
- org.opends.server.util.DynamicConstants.BUILD_ID), gbc);
+ pnlBuildInfo.add(tcCurrentServerBuildNumber, gbc);
gbc.gridy = 2;
gbc.weighty = 1.0;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.LINE_START;
- JPanel fill = new JPanel();
+ JPanel fill = UIFactory.makeJPanel();
//fill.setBorder(BorderFactory.createLineBorder(Color.BLUE));
pnlBuildInfo.add(fill, gbc);
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundTask.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundTask.java
index 8a82ac6..cadb6f0 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundTask.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundTask.java
@@ -32,8 +32,9 @@
* This class provides a mechanism for running a task in the background using a
* separate thread and providing the caller with notification when it has
* completed.
+ * @param <T> type of object returned by this process
*/
-public abstract class BackgroundTask
+public abstract class BackgroundTask<T>
{
/**
* Creates a new thread and begins running the task in the background. When
@@ -42,7 +43,7 @@
*/
public final void startBackgroundTask()
{
- BackgroundTaskThread taskThread = new BackgroundTaskThread(this);
+ BackgroundTaskThread taskThread = new BackgroundTaskThread<T>(this);
taskThread.start();
}
@@ -57,7 +58,7 @@
* @throws Exception exception that will be passed through the method
* backgroundTaskCompleted.
*/
- public abstract Object processBackgroundTask() throws Exception;
+ public abstract T processBackgroundTask() throws Exception;
@@ -77,6 +78,6 @@
* was raised during processing, or {@code null} if all
* processing completed successfully.
*/
- public abstract void backgroundTaskCompleted(Object returnValue,
+ public abstract void backgroundTaskCompleted(T returnValue,
Throwable throwable);
}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundThreadTask.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundThreadTask.java
index 3ba772b..0309735 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundThreadTask.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/BackgroundThreadTask.java
@@ -31,12 +31,14 @@
/**
* This class defines a thread that will be used to actually perform the
* processing for a background task.
+ * @param <T> type of object returned by the background task fed to this
+ * object
*/
-class BackgroundTaskThread
+class BackgroundTaskThread<T>
extends Thread
{
// The background task that is to be processed.
- private final BackgroundTask backgroundTask;
+ private final BackgroundTask<T> backgroundTask;
@@ -46,7 +48,7 @@
*
* @param backgroundTask The task to be processed.
*/
- public BackgroundTaskThread(BackgroundTask backgroundTask)
+ public BackgroundTaskThread(BackgroundTask<T> backgroundTask)
{
this.backgroundTask = backgroundTask;
}
@@ -60,7 +62,7 @@
{
try
{
- Object returnValue = backgroundTask.processBackgroundTask();
+ T returnValue = backgroundTask.processBackgroundTask();
backgroundTask.backgroundTaskCompleted(returnValue, null);
}
catch (Throwable t)
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 452ec9e..5923745 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
@@ -898,7 +898,7 @@
*/
public static String getInstallPathFromClasspath()
{
- String installPath;
+ String installPath = null;
/* Get the install path from the Class Path */
String sep = System.getProperty("path.separator");
@@ -916,21 +916,23 @@
}
}
}
- File f = new File(path).getAbsoluteFile();
- File librariesDir = f.getParentFile();
+ if (path != null) {
+ File f = new File(path).getAbsoluteFile();
+ File librariesDir = f.getParentFile();
- /*
- * Do a best effort to avoid having a relative representation (for
- * instance to avoid having ../../../).
- */
- try
- {
- installPath = librariesDir.getParentFile().getCanonicalPath();
- }
- catch (IOException ioe)
- {
- // Best effort
- installPath = librariesDir.getParent();
+ /*
+ * Do a best effort to avoid having a relative representation (for
+ * instance to avoid having ../../../).
+ */
+ try
+ {
+ installPath = librariesDir.getParentFile().getCanonicalPath();
+ }
+ catch (IOException ioe)
+ {
+ // Best effort
+ installPath = librariesDir.getParent();
+ }
}
return installPath;
}
--
Gitblit v1.10.0