From 23faffa02e132a30c02f928e317c6f66ac373d06 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:
---
opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java | 325 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 308 insertions(+), 17 deletions(-)
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java
index 154482e..40921cf 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/ChooseVersionPanel.java
+++ b/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);
+ }
+ });
+ }
+ }
}
}
--
Gitblit v1.10.0