summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-11 19:19:03 +0200
committerSimon Rettberg2015-08-11 19:19:03 +0200
commit3946cc23a61fdb4bc830a64e5993817abf055b1b (patch)
tree9dbd00563e2e0d55804381217677054116f29476 /dozentenmodul/src/main/java
parent[client] Back off with reconnects for file transfers if it fails too often (diff)
downloadtutor-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')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java13
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/DownloadPanel.java42
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java138
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/UploadPanel.java123
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java22
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java1
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