diff options
author | Simon Rettberg | 2016-04-18 18:03:01 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-04-18 18:03:01 +0200 |
commit | e0e6b82b54bef667d077efe933d1b7b35983a2cd (patch) | |
tree | d94bb33d5a9f931cf643f4f4acbdcf4e982578aa | |
parent | [server] added 'hasusbaccess' field updater to Updater class (diff) | |
download | tutor-module-e0e6b82b54bef667d077efe933d1b7b35983a2cd.tar.gz tutor-module-e0e6b82b54bef667d077efe933d1b7b35983a2cd.tar.xz tutor-module-e0e6b82b54bef667d077efe933d1b7b35983a2cd.zip |
[*] Display sat->master progress in client
10 files changed, 175 insertions, 22 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java new file mode 100644 index 00000000..c4f030f3 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java @@ -0,0 +1,96 @@ +package org.openslx.dozmod.filetransfer; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.apache.thrift.TException; +import org.openslx.bwlp.thrift.iface.TInvalidTokenException; +import org.openslx.bwlp.thrift.iface.TransferState; +import org.openslx.bwlp.thrift.iface.TransferStatus; +import org.openslx.thrifthelper.ThriftManager; +import org.openslx.util.QuickTimer; +import org.openslx.util.QuickTimer.Task; + +/** + * Used to "watch" a transfer between a satellite server and the master server. + * We simply query the status of the upload from the master server. + */ +public class PassiveTransfer implements TransferEventEmitter { + + private static final Logger LOGGER = Logger.getLogger(PassiveTransfer.class); + + private static final long THRIFT_INTERVAL_MS = 2000; + + /** + * List of listeners that want to get status updates about the transfer. + */ + private final List<TransferEventListener> listeners = new ArrayList<>(); + + private final String uploadToken; + + private long lastThriftUpdate = 0; + + private boolean isCancelled = false; + + public PassiveTransfer(String token) { + this.uploadToken = token; + QuickTimer.scheduleAtFixedDelay(new Task() { + @Override + public void fire() { + update(); + if (isCancelled) { + this.cancel(); + } + } + }, 1, THRIFT_INTERVAL_MS + 1); + } + + @Override + public void addListener(TransferEventListener listener) { + synchronized (listeners) { + listeners.add(listener); + } + } + + @Override + public void removeListener(TransferEventListener listener) { + synchronized (listeners) { + while (listeners.remove(listener)) { + } + } + } + + @Override + public boolean isCanceled() { + return isCancelled; + } + + private void update() { + final long now = System.currentTimeMillis(); + if (lastThriftUpdate + THRIFT_INTERVAL_MS > now) + return; + TransferState state = null; + byte[] blocks = null; + String error = null; + lastThriftUpdate = now; + try { + TransferStatus uploadStatus = ThriftManager.getMasterClient().queryUploadStatus(uploadToken); + state = uploadStatus.getState(); + blocks = uploadStatus.getBlockStatus(); + } catch (TInvalidTokenException e) { + error = "Upload token unknown!?"; + state = TransferState.ERROR; + } catch (TException e) { + error = "Exception quering upload status: " + e.toString(); + } + TransferEvent event = new TransferEvent(state, blocks, 0, 0, error); + isCancelled = state == null || state == TransferState.ERROR || state == TransferState.FINISHED; + synchronized (listeners) { + for (int i = listeners.size() - 1; i >= 0; --i) { + listeners.get(i).update(event); + } + } + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEventEmitter.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEventEmitter.java new file mode 100644 index 00000000..0b1e8d33 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEventEmitter.java @@ -0,0 +1,11 @@ +package org.openslx.dozmod.filetransfer; + +public interface TransferEventEmitter { + + public void addListener(TransferEventListener listener); + + public void removeListener(TransferEventListener listener); + + public boolean isCanceled(); + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java index 53d8f436..59508f4f 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java @@ -12,7 +12,7 @@ import org.openslx.dozmod.thrift.Session; import org.openslx.filetransfer.Transfer; import org.openslx.util.Util; -public abstract class TransferTask implements Runnable { +public abstract class TransferTask implements Runnable, TransferEventEmitter { private static final Logger LOGGER = Logger.getLogger(TransferTask.class); @@ -93,6 +93,7 @@ public abstract class TransferTask implements Runnable { return isComplete; } + @Override public boolean isCanceled() { return isCancelled; } @@ -124,12 +125,14 @@ public abstract class TransferTask implements Runnable { } } + @Override public void addListener(TransferEventListener listener) { synchronized (listeners) { listeners.add(listener); } } + @Override public void removeListener(TransferEventListener listener) { synchronized (listeners) { while (listeners.remove(listener)) { 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 0c90d60b..6ca0a4d0 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java @@ -33,12 +33,14 @@ import org.openslx.bwlp.thrift.iface.TransferState; import org.openslx.dozmod.App; import org.openslx.dozmod.Config; import org.openslx.dozmod.filetransfer.DownloadTask; +import org.openslx.dozmod.filetransfer.PassiveTransfer; import org.openslx.dozmod.filetransfer.TransferEvent; import org.openslx.dozmod.filetransfer.TransferEventListener; import org.openslx.dozmod.filetransfer.UploadTask; 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.PassiveUploadPanel; import org.openslx.dozmod.gui.activity.UpdatePanel; import org.openslx.dozmod.gui.activity.UploadPanel; import org.openslx.dozmod.gui.control.QLabel; @@ -356,6 +358,23 @@ public abstract class MainWindow { }); } + public static void addUpload(String masterTransferToken, String name) { + final PassiveTransfer transfer = new PassiveTransfer(masterTransferToken); + addPanel(new PassiveUploadPanel(transfer, name)); + transfer.addListener(new TransferEventListener() { + @Override + public void update(TransferEvent event) { + if (event.state == TransferState.FINISHED) { + ImageListWindow page = getPage(ImageListWindow.class); + if (page != null) { + page.refresh(true); + } + transfer.removeListener(this); + } + } + }); + } + public static void addDownload(String imageName, String diskFile, DownloadTask dlTask) { addPanel(new DownloadPanel(imageName, diskFile, dlTask)); } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/PassiveUploadPanel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/PassiveUploadPanel.java new file mode 100644 index 00000000..a889e7b6 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/PassiveUploadPanel.java @@ -0,0 +1,33 @@ +package org.openslx.dozmod.gui.activity; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import org.apache.log4j.Logger; +import org.openslx.dozmod.filetransfer.TransferEventEmitter; + +@SuppressWarnings("serial") +public class PassiveUploadPanel extends TransferPanel { + + private static final Logger LOGGER = Logger.getLogger(PassiveUploadPanel.class); + + private final TransferEventEmitter state; + + private final PassiveUploadPanel panel = this; + + public PassiveUploadPanel(TransferEventEmitter state, String name) { + super(state, name, ""); + btnClose.addActionListener(new ButtonAction()); + this.state = state; + state.addListener(this); + btnClose.setText("Ausblenden"); + } + + private class ButtonAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + state.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 index 6e2e38ec..7a3582df 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java @@ -5,17 +5,15 @@ 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.JPanel; -import javax.swing.JSeparator; import org.apache.log4j.Logger; import org.openslx.dozmod.filetransfer.TransferEvent; +import org.openslx.dozmod.filetransfer.TransferEventEmitter; 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; import org.openslx.dozmod.gui.control.QLabel; @@ -37,7 +35,7 @@ public abstract class TransferPanel extends ActivityPanel implements TransferEve protected final BlockProgressBar progress; - private final TransferTask transfer; + private final TransferEventEmitter transfer; private final TransferPanel panel = this; @@ -53,7 +51,7 @@ public abstract class TransferPanel extends ActivityPanel implements TransferEve private JPanel footer; - public TransferPanel(TransferTask transfer, String displayName, String fileName) { + public TransferPanel(TransferEventEmitter transfer, String displayName, String fileName) { setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); // Header: [status] VM-Name ---- fileName [Button] header = new JPanel(); 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 e8313120..d71a4a1c 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 @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.state.UploadWizardState; +import org.openslx.dozmod.thrift.UploadInitiator; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; @@ -15,32 +16,32 @@ public class UploadPanel extends TransferPanel { private static final Logger LOGGER = Logger.getLogger(UploadPanel.class); - private final UploadWizardState state; + private final UploadInitiator state; private final UploadPanel panel = this; public UploadPanel(UploadWizardState state) { super(state.upload.getUploadTask(), state.name, state.diskFile.getName()); btnClose.addActionListener(new ButtonAction()); - this.state = state; + this.state = state.upload; state.upload.getUploadTask().addListener(this); } private class ButtonAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (!state.upload.getUploadTask().isCanceled()) { + if (!state.getUploadTask().isCanceled()) { if (!Gui.showMessageBox(panel, "Wollen Sie diesen Transfer wirklich abbrechen?", MessageType.QUESTION_YESNO, null, null)) return; QuickTimer.scheduleOnce(new Task() { @Override public void fire() { - state.upload.cancelError(); + state.cancelError(); } }); } - state.upload.getUploadTask().removeListener(panel); + state.getUploadTask().removeListener(panel); close(); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java index a3541c0a..6c08dff8 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java @@ -414,16 +414,14 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe @Override public void fire() { try { - String transferId = ThriftManager.getSatClient().publishImageVersion( + final String transferId = ThriftManager.getSatClient().publishImageVersion( Session.getSatelliteToken(), image.latestVersionId); - /* Gui.asyncExec(new Runnable() { @Override public void run() { - MainWindow.addUpload(transferId, ); + MainWindow.addUpload(transferId, image.imageName); } }); - */ Gui.asyncMessageBox("Läuft: " + transferId, MessageType.INFO, null, null); } catch (TException e1) { ThriftError.showMessage(me, LOGGER, e1, diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java index 0276e0cd..3530a8fd 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java @@ -22,7 +22,6 @@ import org.openslx.bwlp.thrift.iface.ImagePublishData; import org.openslx.bwlp.thrift.iface.ImageVersionWrite; import org.openslx.bwlp.thrift.iface.TransferInformation; import org.openslx.bwlp.thrift.iface.TransferState; -import org.openslx.bwlp.thrift.iface.TransferStatus; import org.openslx.bwlp.thrift.iface.UserInfo; import org.openslx.filetransfer.Downloader; import org.openslx.filetransfer.util.FileChunk; @@ -250,10 +249,6 @@ public class IncomingDataTransfer extends IncomingTransferBase { return this.owner; } - public synchronized TransferStatus getStatus() { - return new TransferStatus(getChunks().getStatusArray(), getState()); - } - @Override public boolean isActive() { return getState() == TransferState.IDLE || getState() == TransferState.WORKING; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java index 581d7ba5..e2276908 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java @@ -6,7 +6,6 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import java.util.concurrent.ExecutorService; import org.apache.log4j.Logger; @@ -50,7 +49,7 @@ public class OutgoingDataTransfer extends AbstractTransfer { * @param absFile file to send to master server */ public OutgoingDataTransfer(TransferInformation transferInfo, File absFile) { - super(UUID.randomUUID().toString()); + super(transferInfo.token); this.masterTransferInfo = transferInfo; this.sourceFile = absFile; } |