From f0c3c1a90c1b93719acaf4730abaab53ec9e0757 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 9 May 2018 13:53:32 +0200 Subject: [client] Show server side progress and estimated virtual speed --- .../openslx/dozmod/filetransfer/DownloadTask.java | 6 +++++- .../dozmod/filetransfer/PassiveTransfer.java | 2 +- .../openslx/dozmod/filetransfer/TransferEvent.java | 12 +++++++++++- .../openslx/dozmod/filetransfer/TransferTask.java | 2 +- .../openslx/dozmod/filetransfer/UploadTask.java | 6 +++++- .../openslx/dozmod/gui/activity/TransferPanel.java | 6 +++++- .../dozmod/gui/control/BlockProgressBar.java | 22 +++++++++++++++------- 7 files changed, 43 insertions(+), 13 deletions(-) (limited to 'dozentenmodul/src') diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java index 346928de..29f74459 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java @@ -32,6 +32,7 @@ public class DownloadTask extends TransferTask { private final String downloadToken; private final RandomAccessFile fileHandle; private final ChunkList chunks; + private final long startTime; private boolean fileWritable = true; public DownloadTask(String host, int port, String downloadToken, File destinationFile, long fileSize, @@ -42,6 +43,7 @@ public class DownloadTask extends TransferTask { this.downloadToken = downloadToken; this.fileHandle = new RandomAccessFile(destinationFile, "rw"); this.chunks = new ChunkList(fileSize, sha1Sums); + this.startTime = System.currentTimeMillis(); } private class DownloadHandler implements WantRangeCallback, DataReceivedCallback { @@ -176,6 +178,7 @@ public class DownloadTask extends TransferTask { } long speed = 0; long timeRemaining = 0; + long virtualSpeed = 0; synchronized (transfers) { for (TransferThread thread : transfers) { speed += thread.getCurrentSpeed(); @@ -191,8 +194,9 @@ public class DownloadTask extends TransferTask { } final long bytesRemaining = CHUNK_SIZE * (long) missing; timeRemaining = (1000 * bytesRemaining) / (speed + 1); + virtualSpeed = ((progress.length - missing) * CHUNK_SIZE * 1000) / (System.currentTimeMillis() - startTime + 1); } - return new TransferEvent(state, progress, speed, timeRemaining, error); + return new TransferEvent(state, progress, speed, virtualSpeed, timeRemaining, error); } @Override diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java index 3ec33f49..910d0056 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java @@ -95,7 +95,7 @@ public class PassiveTransfer implements TransferEventEmitter { if (error != null) { error = queryMaster ? "Master: " : "Satellite: " + error; } - TransferEvent event = new TransferEvent(state, blocks, 0, 0, error); + TransferEvent event = new TransferEvent(state, blocks, 0, 0, 0, error); isCancelled = state == null || state == TransferState.ERROR || state == TransferState.FINISHED; synchronized (listeners) { for (int i = listeners.size() - 1; i >= 0; --i) { 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 af63b0c6..bc75cad8 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java @@ -22,6 +22,14 @@ public class TransferEvent { * Speed of transfer, in bytes per second */ public final long speedRaw; + /** + * Speed of transfer, human readable, including server side copying + */ + public final String virtualSpeed; + /** + * Speed of transfer, in bytes per second, including server side copying + */ + public final long virtualSpeedRaw; /** * Estimated remaining time, in milliseconds. 0 == not updated */ @@ -35,12 +43,14 @@ public class TransferEvent { */ public final String errorMessage; - public TransferEvent(TransferState state, byte[] progress, long speedRaw, long remainingRaw, + public TransferEvent(TransferState state, byte[] progress, long speedRaw, long virtualSpeedRaw, long remainingRaw, String errorMessage) { this.state = state; this.progress = progress; this.speedRaw = speedRaw; this.speed = FormatHelper.bytes(speedRaw, false) + "/s"; + this.virtualSpeedRaw = virtualSpeedRaw; + this.virtualSpeed = FormatHelper.bytes(virtualSpeedRaw, 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 59508f4f..d61075eb 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java @@ -107,7 +107,7 @@ public abstract class TransferTask implements Runnable, TransferEventEmitter { } protected void fireErrorMessage(String message) { - TransferEvent event = new TransferEvent(null, null, 0, 0, message); + TransferEvent event = new TransferEvent(null, null, 0, 0, 0, message); fireEvent(event); } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java index 6eb8a988..7396d1d2 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java @@ -34,6 +34,7 @@ public class UploadTask extends TransferTask { private final String host; private final int port; private final String uploadToken; + private final long startTime; private String remoteError = null; /** @@ -59,6 +60,7 @@ public class UploadTask extends TransferTask { this.host = host; this.port = port; this.uploadToken = uploadToken; + this.startTime = System.currentTimeMillis(); } private class UploadThread extends TransferThread { @@ -143,6 +145,7 @@ public class UploadTask extends TransferTask { } private long lastThriftUpdate = 0; + private long virtualSpeed = 0; @Override protected TransferEvent getTransferEvent() { @@ -181,12 +184,13 @@ public class UploadTask extends TransferTask { } final long bytesRemaining = CHUNK_SIZE * (long) missing; timeRemaining = (1000 * bytesRemaining) / (speed + 1); + virtualSpeed = ((blocks.length - missing) * CHUNK_SIZE * 1000) / (System.currentTimeMillis() - startTime + 1); } } if (remoteError != null && (error == null || remoteError.equals("Out of disk space"))) { error = remoteError; } - TransferEvent event = new TransferEvent(state, blocks, speed, timeRemaining, error); + TransferEvent event = new TransferEvent(state, blocks, speed, virtualSpeed, timeRemaining, error); return event; } 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 9b11f0d5..4d3155e2 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 @@ -150,7 +150,11 @@ public abstract class TransferPanel extends ActivityPanel implements TransferEve lblRemaining.setText(event.remaining); } if (event.speedRaw != 0) { - lblSpeed.setText(event.speed); + if (event.virtualSpeedRaw != 0) { + lblSpeed.setText(event.speed + " (" + event.virtualSpeed + ")"); + } else { + lblSpeed.setText(event.speed); + } } // Progress bar if (event.progress != null) { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java index a80cf2b9..2b26b397 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java @@ -17,8 +17,12 @@ import org.openslx.thrifthelper.TransferStatusWrapper; public class BlockProgressBar extends JPanel { private final Color[] blockColors = new Color[6]; + + private static final Color potentialCompleteColor = new Color(200, 220, 255, 255); private final TransferStatusWrapper blocks = new TransferStatusWrapper(null); + + private final TransferStatusWrapper.Progress progress = new TransferStatusWrapper.Progress(); private boolean simpleMode = true; @@ -78,14 +82,18 @@ public class BlockProgressBar extends JPanel { } final int width = getWidth(); final int height = getHeight(); - final float complete = blocks.getComplete(); - final int doneWidth = (int) ((float) width * complete); + blocks.getCompleteEx(progress); + final int doneWidth = (int) ((float) width * progress.done); + final int potentialWidth = (int) ((float) width * progress.potentiallyDone); + final int sumWidth = doneWidth + potentialWidth; g.setColor(Color.BLUE); g.fillRect(0, 0, doneWidth, height); + g.setColor(potentialCompleteColor); + g.fillRect(doneWidth, 0, potentialWidth, height); g.setColor(Color.WHITE); - g.fillRect(doneWidth, 0, width - doneWidth, height); - final String progress = (int) (complete * 100) + "%"; - Rectangle2D textExtent = g.getFontMetrics().getStringBounds(progress, g); + g.fillRect(sumWidth, 0, width - sumWidth, height); + final String percentDisplay = (int) (progress.done * 100) + "%"; + Rectangle2D textExtent = g.getFontMetrics().getStringBounds(percentDisplay, g); final double tw = textExtent.getWidth(); final int textX = (int) ((width - tw) / 2); final int textXEnd = (int) ((width + tw) / 2); @@ -93,12 +101,12 @@ public class BlockProgressBar extends JPanel { if (doneWidth >= textX) { g.setColor(Color.WHITE); g.setClip(0, 0, doneWidth, height); - g.drawString(progress, textX, textY); + g.drawString(percentDisplay, textX, textY); } if (doneWidth <= textXEnd) { g.setColor(Color.BLACK); g.setClip(doneWidth, 0, width - doneWidth, height); - g.drawString(progress, textX, textY); + g.drawString(percentDisplay, textX, textY); } } -- cgit v1.2.3-55-g7522