summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod
diff options
context:
space:
mode:
authorSimon Rettberg2018-05-09 13:53:32 +0200
committerSimon Rettberg2018-05-09 13:53:32 +0200
commitf0c3c1a90c1b93719acaf4730abaab53ec9e0757 (patch)
tree74b4efafee64226412558e144122b191bc2c1b8e /dozentenmodul/src/main/java/org/openslx/dozmod
parent[server] Fix CRC32 generation (diff)
downloadtutor-module-f0c3c1a90c1b93719acaf4730abaab53ec9e0757.tar.gz
tutor-module-f0c3c1a90c1b93719acaf4730abaab53ec9e0757.tar.xz
tutor-module-f0c3c1a90c1b93719acaf4730abaab53ec9e0757.zip
[client] Show server side progress and estimated virtual speed
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/PassiveTransfer.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferEvent.java12
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java22
7 files changed, 43 insertions, 13 deletions
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
@@ -23,6 +23,14 @@ public class TransferEvent {
*/
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
*/
public final long remainingRaw;
@@ -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);
}
}