diff options
| author | Simon Rettberg | 2015-07-21 17:08:35 +0200 |
|---|---|---|
| committer | Simon Rettberg | 2015-07-21 17:08:35 +0200 |
| commit | 183729494952f55bbd5a7e28fd59289d8eb3cc35 (patch) | |
| tree | 7508a7abc9779396398090b7f588a87d1815182e | |
| parent | [client] Continue refactoring Upload and Download Task (diff) | |
| download | tutor-module-183729494952f55bbd5a7e28fd59289d8eb3cc35.tar.gz tutor-module-183729494952f55bbd5a7e28fd59289d8eb3cc35.tar.xz tutor-module-183729494952f55bbd5a7e28fd59289d8eb3cc35.zip | |
[client] Fixes and improvements related to file transfer; rename bytesToGigabytes to just bytes
5 files changed, 67 insertions, 32 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java index 890b4193..4206da81 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java @@ -39,7 +39,7 @@ public class TransferEvent { this.state = state; this.progress = progress; this.speedRaw = speedRaw; - this.speed = FormatHelper.byteToGigabyte(speedRaw, false) + "/s"; + this.speed = FormatHelper.bytes(speedRaw, false) + "/s"; this.remainingRaw = remainingRaw; if (remainingRaw == 0) { this.remaining = null; 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 3bb8fa94..355d7393 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java @@ -10,7 +10,7 @@ import org.openslx.filetransfer.Transfer; import org.openslx.util.Util; public abstract class TransferTask implements Runnable { - + protected static final double BYTES_PER_MIB = 1024 * 1024; protected static final long CHUNK_SIZE = 16 * 1024 * 1024; @@ -33,10 +33,10 @@ public abstract class TransferTask implements Runnable { private boolean endgame = false; private int minConnectionCount = 1; private int failCount = 0; - + protected final File localFile; protected final long fileSize; - + protected TransferTask(File localFile, long fileSize) { this.localFile = localFile; this.fileSize = fileSize; @@ -54,19 +54,21 @@ public abstract class TransferTask implements Runnable { ensureActivity(); Util.sleep(UPDATE_INTERVAL_MS); } - for (TransferThread t : transfers) { - t.getTransfer().cancel(); - t.interrupt(); - Util.joinThread(t); + isRunning = false; + List<TransferThread> joinList = new ArrayList<>(); + synchronized (transfers) { + isCancelled = true; + joinList.addAll(transfers); + joinList.addAll(connectingTransfers); } - for (TransferThread t : connectingTransfers) { - if (t.getTransfer() != null) { - t.getTransfer().cancel(); + for (TransferThread t : joinList) { + Transfer transfer = t.getTransfer(); + if (transfer != null) { + transfer.cancel(); } t.interrupt(); Util.joinThread(t); } - isRunning = false; cleanup(); } @@ -77,6 +79,10 @@ public abstract class TransferTask implements Runnable { public boolean isRunning() { return isRunning; } + + public boolean isCanceled() { + return isCancelled; + } private void fireEvent(TransferEvent event) { synchronized (listeners) { @@ -113,21 +119,26 @@ public abstract class TransferTask implements Runnable { } public void cancel() { + final List<TransferThread> joiners; synchronized (transfers) { - for (TransferThread t : transfers) { + if (isCancelled) + return; + isCancelled = true; + joiners = new ArrayList<>(); + joiners.addAll(transfers); + joiners.addAll(connectingTransfers); + } + for (TransferThread t : joiners) { + if (t.getTransfer() != null) { t.getTransfer().cancel(); } - for (TransferThread t : connectingTransfers) { - if (t.getTransfer() != null) { - t.getTransfer().cancel(); - } - } - isCancelled = true; } } private final void ensureActivity() { synchronized (transfers) { + if (isCancelled) + return; if (endgame && (!transfers.isEmpty() || !connectingTransfers.isEmpty())) return; Iterator<TransferThread> it = transfers.iterator(); @@ -162,9 +173,14 @@ public abstract class TransferTask implements Runnable { protected final void connectSucceeded(TransferThread thread) { synchronized (transfers) { connectingTransfers.remove(thread); - transfers.add(thread); - failCount = 0; + if (!isCancelled) { + transfers.add(thread); + failCount = 0; + return; + } } + thread.getTransfer().cancel(); + thread.interrupt(); } protected final void transferEnded(TransferThread thread, boolean success) { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/TableHelper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/TableHelper.java index bb6a848b..f868c574 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/TableHelper.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/TableHelper.java @@ -119,7 +119,9 @@ public final class TableHelper { @Override public String getText(Object element) { ImageSummaryRead image = (ImageSummaryRead) element; - return FormatHelper.byteToGigabyte(image.getFileSize(), false); + if (image.getCurrentVersionId() == null) + return "-"; + return FormatHelper.bytes(image.getFileSize(), false); } }); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java index 5374e370..4f9ed944 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java @@ -328,6 +328,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { // TODO: Maybe only display percentage in the wizard pages once we have the status bar in mainwindow blockProgressBar.setStatus(event.progress); } + if (event.state == null) + return; // TODO: Move user interaction to central listener when we have it switch (event.state) { case FINISHED: @@ -335,6 +337,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { MainWindow.showMessageBox("Upload abgeschlossen.", MessageType.INFO, LOGGER, null); break; case ERROR: + if (uploadWizardState.uploadTask != null && uploadWizardState.uploadTask.isCanceled()) + return; if (MainWindow.showMessageBox("Fehler beim Upload: " + event.errorMessage + "\nNochmal versuchen?", MessageType.ERROR_RETRY, LOGGER, null)) { // user wants to try again, just reset transferInformation ... @@ -355,14 +359,27 @@ public class ImageUploadPage extends ImageUploadPageLayout { private void cancelUpload() { LOGGER.debug("Cancelling upload ..."); // first tell the server about this - try { - ThriftManager.getSatClient().cancelUpload(uploadWizardState.transferInformation.getToken()); - } catch (Exception e) { - LOGGER.debug("Remote error while canceling upload for " + uploadWizardState.uuid, e); - } - // Then cancel the task - uploadWizardState.uploadTask.cancel(); + QuickTimer.scheduleOnce(new Task() { + @Override + public void fire() { + try { + ThriftManager.getSatClient().cancelUpload( + uploadWizardState.transferInformation.getToken()); + } catch (Exception e) { + LOGGER.debug("Remote error while canceling upload for " + uploadWizardState.uuid, e); + } + // Then cancel the task + uploadWizardState.uploadTask.cancel(); + Gui.asyncExec(new Runnable() { + @Override + public void run() { + cancelUpload.setVisible(false); + } + }); + } + }); cancelUpload.setEnabled(false); + setPageComplete(false); blockProgressBar.setVisible(false); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/FormatHelper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/FormatHelper.java index 68b90661..c3251276 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/util/FormatHelper.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/FormatHelper.java @@ -55,10 +55,10 @@ public class FormatHelper { * (1024B = 1KiB) * @return Formatted string, i.e. <code>54.6 GiB</code> */ - public static String byteToGigabyte(long bytes, boolean si) { - int unit = si ? 1000 : 1024; + public static String bytes(long bytes, boolean si) { + final int unit = si ? 1000 : 1024; if (bytes < unit) - return bytes + THIN_SP + "B"; + return String.valueOf(bytes) + THIN_SP + "B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPEZY" : "KMGTPEZY").charAt(exp - 1) + (si ? "" : "i"); return String.format("%.1f" + THIN_SP + "%sB", bytes / Math.pow(unit, exp), pre); |
