diff options
| author | Simon Rettberg | 2015-08-11 19:19:03 +0200 |
|---|---|---|
| committer | Simon Rettberg | 2015-08-11 19:19:03 +0200 |
| commit | 3946cc23a61fdb4bc830a64e5993817abf055b1b (patch) | |
| tree | 9dbd00563e2e0d55804381217677054116f29476 /dozentenmodul/src/main/java | |
| parent | [client] Back off with reconnects for file transfers if it fails too often (diff) | |
| download | tutor-module-3946cc23a61fdb4bc830a64e5993817abf055b1b.tar.gz tutor-module-3946cc23a61fdb4bc830a64e5993817abf055b1b.tar.xz tutor-module-3946cc23a61fdb4bc830a64e5993817abf055b1b.zip | |
[client] Add DownloadPanel to show progress of images being downloaded
Diffstat (limited to 'dozentenmodul/src/main/java')
6 files changed, 206 insertions, 133 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java index b01e02c2..36b4b43a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java @@ -29,8 +29,10 @@ import org.openslx.bwlp.thrift.iface.WhoamiInfo; import org.openslx.dozmod.App; import org.openslx.dozmod.Config; import org.openslx.dozmod.Config.SavedSession; +import org.openslx.dozmod.filetransfer.DownloadTask; import org.openslx.dozmod.gui.Gui.GuiCallable; import org.openslx.dozmod.gui.activity.ActivityPanel; +import org.openslx.dozmod.gui.activity.DownloadPanel; import org.openslx.dozmod.gui.activity.UploadPanel; import org.openslx.dozmod.gui.helper.CompositePage; import org.openslx.dozmod.gui.helper.DebugWindow; @@ -291,14 +293,21 @@ public abstract class MainWindow { window.setVisible(false); } - public static void addUpload(UploadWizardState state) { - UploadPanel panel = new UploadPanel(state); + private static void addPanel(ActivityPanel panel) { activities.add(panel); activityPanel.add(panel); activityPanel.setVisible(true); mainWindow.validate(); } + public static void addUpload(UploadWizardState state) { + addPanel(new UploadPanel(state)); + } + + public static void addDownload(String imageName, String diskFile, DownloadTask dlTask) { + addPanel(new DownloadPanel(imageName, diskFile, dlTask)); + } + public static void removeActivity(ActivityPanel panel) { activities.remove(panel); activityPanel.remove(panel); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/DownloadPanel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/DownloadPanel.java new file mode 100644 index 00000000..27e17f53 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/DownloadPanel.java @@ -0,0 +1,42 @@ +package org.openslx.dozmod.gui.activity; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import org.openslx.dozmod.filetransfer.DownloadTask; +import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.helper.MessageType; + +@SuppressWarnings("serial") +public class DownloadPanel extends TransferPanel { + + private final DownloadPanel panel = this; + + private final DownloadTask download; + + public DownloadPanel(String displayName, String diskFile, DownloadTask download) { + super(download, displayName, diskFile); + btnClose.addActionListener(new ButtonAction()); + this.download = download; + download.addListener(this); + } + + @Override + public boolean wantConfirmQuit() { + return download != null && !download.isCanceled(); + } + + private class ButtonAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + if (!download.isCanceled()) { + if (!Gui.showMessageBox(panel, "Wollen Sie diesen Transfer wirklich abbrechen?", + MessageType.QUESTION_YESNO, null, null)) + return; + download.cancel(); + } + download.removeListener(panel); + close(); + } + } +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java new file mode 100644 index 00000000..f847a8ef --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java @@ -0,0 +1,138 @@ +package org.openslx.dozmod.gui.activity; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridLayout; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openslx.dozmod.filetransfer.TransferEvent; +import org.openslx.dozmod.filetransfer.TransferEventListener; +import org.openslx.dozmod.filetransfer.TransferTask; +import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.control.BlockProgressBar; + +@SuppressWarnings("serial") +public abstract class TransferPanel extends ActivityPanel implements TransferEventListener { + + protected final JLabel lblStatus; + + protected final JLabel lblError; + + protected final JLabel lblSpeed; + + protected final JLabel lblRemaining; + + protected final JButton btnClose; + + protected final BlockProgressBar progress; + + private final TransferTask transfer; + + private final TransferPanel panel = this; + + private final Color defaultLabelColor; + + private int errorCountdown = 0; + + public TransferPanel(TransferTask transfer, String displayName, String fileName) { + setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); + setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + // Header: [status] VM-Name ---- fileName [Button] + JPanel header = new JPanel(); + header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS)); + lblStatus = new JLabel("[init]"); + header.add(lblStatus); + header.add(Box.createHorizontalStrut(10)); + JLabel vmName = new JLabel(displayName); + vmName.setFont(vmName.getFont().deriveFont(Font.BOLD)); + header.add(vmName); + header.add(Box.createHorizontalGlue()); + header.add(new JLabel(fileName)); + header.add(Box.createHorizontalStrut(10)); + btnClose = new JButton("Abbrechen"); + header.add(btnClose); + add(header); + // ProgressBar + JPanel progressWrapper = new JPanel(); + progressWrapper.setLayout(new GridLayout(1, 1)); + progressWrapper.setMinimumSize(new Dimension(0, 50)); + progressWrapper.setPreferredSize(progressWrapper.getMinimumSize()); + progress = new BlockProgressBar(null); + progressWrapper.add(progress); + add(progressWrapper); + // Speed & error + JPanel footer = new JPanel(); + footer.setLayout(new BoxLayout(footer, BoxLayout.LINE_AXIS)); + lblError = new JLabel(); + lblSpeed = new JLabel("-"); + lblRemaining = new JLabel("-"); + lblSpeed.setMinimumSize(new Dimension(50, 0)); + lblRemaining.setMinimumSize(new Dimension(60, 0)); + footer.add(lblError); + footer.add(Box.createGlue()); + footer.add(lblSpeed); + footer.add(Box.createRigidArea(new Dimension(6, 6))); + footer.add(lblRemaining); + add(footer); + this.transfer = transfer; + defaultLabelColor = lblError.getForeground(); + } + + @Override + public void update(final TransferEvent event) { + Gui.asyncExec(new Runnable() { + @Override + public void run() { + // Any error message? + if (event.errorMessage != null && !event.errorMessage.isEmpty()) { + lblError.setText(event.errorMessage); + lblError.setForeground(Color.RED); + errorCountdown = 20; + } else if (errorCountdown > 0) { + errorCountdown--; + if (errorCountdown == 10) { + lblError.setForeground(defaultLabelColor); + } else if (errorCountdown == 0) { + lblError.setText(""); + } + } + // Status? + if (event.state != null) { + switch (event.state) { + case ERROR: + errorCountdown = 20; + break; + case FINISHED: + btnClose.setText("Schließen"); + lblRemaining.setText("-"); + transfer.removeListener(panel); + break; + default: + break; + } + lblStatus.setText(event.state.toString()); + } + // Remaining + Speed + if (event.remainingRaw != 0) { + lblRemaining.setText(event.remaining); + } + if (event.speedRaw != 0) { + lblSpeed.setText(event.speed); + } + // Progress bar + if (event.progress != null) { + progress.setStatus(event.progress); + } + panel.validate(); + } + }); + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/UploadPanel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/UploadPanel.java index 46ffb51c..480a612b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/UploadPanel.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/UploadPanel.java @@ -1,24 +1,10 @@ package org.openslx.dozmod.gui.activity; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; - import org.apache.log4j.Logger; -import org.openslx.dozmod.filetransfer.TransferEvent; -import org.openslx.dozmod.filetransfer.TransferEventListener; import org.openslx.dozmod.gui.Gui; -import org.openslx.dozmod.gui.control.BlockProgressBar; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.state.UploadWizardState; import org.openslx.thrifthelper.ThriftManager; @@ -26,73 +12,18 @@ import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; @SuppressWarnings("serial") -public class UploadPanel extends ActivityPanel implements TransferEventListener { +public class UploadPanel extends TransferPanel { private static final Logger LOGGER = Logger.getLogger(UploadPanel.class); - private final JLabel lblStatus; - - private final JLabel lblError; - - private final JLabel lblSpeed; - - private final JLabel lblRemaining; - - private final BlockProgressBar progress; - private final UploadWizardState state; private final UploadPanel panel = this; - private final Color defaultLabelColor; - - private int errorCountdown = 0; - - private final JButton btnClose; - public UploadPanel(UploadWizardState state) { - this.state = state; - setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); - setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - // Header: [status] VM-Name ---- fileName [Button] - JPanel header = new JPanel(); - header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS)); - lblStatus = new JLabel("[init]"); - header.add(lblStatus); - header.add(Box.createHorizontalStrut(10)); - JLabel vmName = new JLabel(state.name); - vmName.setFont(vmName.getFont().deriveFont(Font.BOLD)); - header.add(vmName); - header.add(Box.createHorizontalGlue()); - header.add(new JLabel(state.diskFile.getName())); - header.add(Box.createHorizontalStrut(10)); - btnClose = new JButton("Abbrechen"); + super(state.uploadTask, state.name, state.diskFile.getName()); btnClose.addActionListener(new ButtonAction()); - header.add(btnClose); - add(header); - // ProgressBar - JPanel progressWrapper = new JPanel(); - progressWrapper.setLayout(new GridLayout(1, 1)); - progressWrapper.setMinimumSize(new Dimension(0, 50)); - progressWrapper.setPreferredSize(progressWrapper.getMinimumSize()); - progress = new BlockProgressBar(null); - progressWrapper.add(progress); - add(progressWrapper); - // Speed & error - JPanel footer = new JPanel(); - footer.setLayout(new BoxLayout(footer, BoxLayout.LINE_AXIS)); - lblError = new JLabel(); - lblSpeed = new JLabel("-"); - lblRemaining = new JLabel("-"); - lblSpeed.setMinimumSize(new Dimension(50, 0)); - lblRemaining.setMinimumSize(new Dimension(60, 0)); - footer.add(lblError); - footer.add(Box.createGlue()); - footer.add(lblSpeed); - footer.add(Box.createRigidArea(new Dimension(6, 6))); - footer.add(lblRemaining); - add(footer); - defaultLabelColor = lblError.getForeground(); + this.state = state; state.uploadTask.addListener(this); } @@ -124,52 +55,4 @@ public class UploadPanel extends ActivityPanel implements TransferEventListener close(); } } - - @Override - public void update(final TransferEvent event) { - Gui.asyncExec(new Runnable() { - @Override - public void run() { - // Any error message? - if (event.errorMessage != null && !event.errorMessage.isEmpty()) { - lblError.setText(event.errorMessage); - lblError.setForeground(Color.RED); - errorCountdown = 20; - } else if (errorCountdown > 0) { - errorCountdown--; - if (errorCountdown == 10) { - lblError.setForeground(defaultLabelColor); - } else if (errorCountdown == 0) { - lblError.setText(""); - } - } - // Status? - if (event.state != null) { - switch (event.state) { - case ERROR: - errorCountdown = 20; - break; - case FINISHED: - btnClose.setText("Schließen"); - lblRemaining.setText("-"); - state.uploadTask.removeListener(panel); - break; - } - lblStatus.setText(event.state.toString()); - } - // Remaining + Speed - if (event.remainingRaw != 0) { - lblRemaining.setText(event.remaining); - } - if (event.speedRaw != 0) { - lblSpeed.setText(event.speed); - } - // Progress bar - if (event.progress != null) { - progress.setStatus(event.progress); - } - panel.validate(); - } - }); - } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java index c8385cd3..1bdf5507 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java @@ -86,7 +86,7 @@ public class ImageListWindow extends ImageListWindowLayout { startLectureWizard(); } if (e.getSource().equals(popupItemDownload)) { - performImageDownload(imageTable.getSelectedItem().getLatestVersionId()); + performImageDownload(imageTable.getSelectedItem()); LOGGER.debug("Download image clicked"); } if (e.getSource().equals(popupItemDelete)) { @@ -156,10 +156,7 @@ public class ImageListWindow extends ImageListWindowLayout { downloadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - ImageSummaryRead item = imageTable.getSelectedItem(); - if (item == null) - return; - performImageDownload(item.latestVersionId); + performImageDownload(imageTable.getSelectedItem()); } }); @@ -255,8 +252,10 @@ public class ImageListWindow extends ImageListWindowLayout { refreshList(false); } - private void performImageDownload(String versionId) { - if (versionId == null) { + private void performImageDownload(ImageSummaryRead image) { + if (image == null) + return; + if (image.latestVersionId == null) { Gui.showMessageBox(this, "Das ausgewählte Image hat keine gültige Version", MessageType.ERROR, null, null); return; @@ -268,7 +267,8 @@ public class ImageListWindow extends ImageListWindowLayout { return; TransferInformation transInf = null; try { - transInf = ThriftManager.getSatClient().requestDownload(Session.getSatelliteToken(), versionId); + transInf = ThriftManager.getSatClient().requestDownload(Session.getSatelliteToken(), + image.latestVersionId); } catch (TException e) { LOGGER.error("Failed to get transfer information: ", e); return; @@ -278,11 +278,13 @@ public class ImageListWindow extends ImageListWindowLayout { try { file.getAbsoluteFile().mkdirs(); + File destFile = new File(file.getAbsolutePath(), "Hans.vmdk"); // TODO: Name sanitized from display name + // TODO: Check if file exists DownloadTask dlTask = new DownloadTask(Session.getSatelliteAddress(), transInf.getPlainPort(), - transInf.getToken(), new File(file.getAbsolutePath(), "Hans"), - imageTable.getSelectedItem().getFileSize(), null); + transInf.getToken(), destFile, image.fileSize, null); new Thread(dlTask).start(); Config.setDownloadPath(file.getAbsolutePath()); + MainWindow.addDownload(image.imageName, destFile.getName(), dlTask); } catch (FileNotFoundException e) { LOGGER.error("Got transfer information but failed to download: ", e); return; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java index 2475b137..eced8813 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java @@ -57,7 +57,6 @@ public class ImageWizard extends Wizard implements UiFeedback { @Override public void performFinish() { - // TODO evaluate table state and create the map of permissions // TODO run the actually request over external threaded class try { // push to sat |
