blob: d880a2a7172dcb4a6f54554139db4a0ffa4bc05b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* jfinis
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.filetransfer;
/**
* Statistics class that can be queried to get detailed information about a file transfer. This information might be
* useful to display pretty progress monitor text for example.
*
* @author jfinis
*/
public class FileTransferStatistics {
private int fileSize;
private int transferredBytes;
private long startTime;
private long stopTime;
private final FileDownloadStatus status;
/**
* Default constructor.
*
* @param status the starting status.
*/
FileTransferStatistics(FileDownloadStatus status) {
fileSize = FileDownloadStatus.NOT_AVAILABLE;
this.status = status;
}
/**
* .
*
* @return the file size
*/
public int getFileSize() {
return fileSize;
}
/**
* .
*
* @return the number of already transferred bytes
*/
public int getTransferredBytes() {
return transferredBytes;
}
/**
* Returns a value between 0 and 1 stating the percentage of already transfered data. If the transfer has not been
* started yet, 0 is returned. If the transfer is finished, 1 is returned.
*
* @return percentage of transfered data
*/
public float getPercentTransferred() {
switch (status.getStatus()) {
case NOT_STARTED:
return 0;
case FINISHED:
return 1;
default:
}
final int fileSize = getFileSize();
// Better not risk a division by zero
if (fileSize <= 0) {
return 0;
}
return getTransferredBytes() / (float) getFileSize();
}
/**
* Returns the average throughput in bytes per second.
*
* @return average throughput
*/
public float getAverageThroughput() {
switch (status.getStatus()) {
case NOT_STARTED:
return 0;
default:
}
final long elapsed = getElapsedMilis();
// No div by zero
if (elapsed == 0) {
return 0;
}
return getTransferredBytes() * 1000f / elapsed;
}
/**
* Gets the number of remaining seconds (estimated). Works only if the transfer is running. If it is finished 0 is
* returned. If it is not yet started or canceled, then NOT_AVAILABLE is returned. If the throughput is 0, then
* NOT_AVAILABLE is returned as well.
*
* @return the number of remaining seconds
*/
public int getEstimatedRemainingTime() {
switch (status.getStatus()) {
case NOT_STARTED:
case CANCELLED:
return FileDownloadStatus.NOT_AVAILABLE;
case FINISHED:
return 0;
default:
}
final int remaining = getRemainingBytes();
final float avgThroughput = getAverageThroughput();
if (avgThroughput == 0) {
return FileDownloadStatus.NOT_AVAILABLE;
}
return (int) (remaining / avgThroughput);
}
/**
* returns the amount of bytes that has not yet been transferred.
*
* @return remaining bytes
*/
public int getRemainingBytes() {
return fileSize - transferredBytes;
}
/**
* Returns the number of seconds the download is already active. If it is not yet active, then 0 is returned. If the
* download is finished or canceled, then the time in which it was active is returned.
*
* @return the elapsed time
*/
public int getElapsedTime() {
return (int) (getElapsedMilis() / 1000);
}
/**
* .
*
* @return the elapsed time since start in milliseconds
*/
private long getElapsedMilis() {
switch (status.getStatus()) {
case NOT_STARTED:
return 0;
case FINISHED:
case CANCELLED:
return stopTime - startTime;
default:
}
return System.currentTimeMillis() - startTime;
}
/**
* Internal method that is called to register the start of the transfer.
*
* @param fileSize the size of the file
*/
void registerStart(int fileSize) {
startTime = System.currentTimeMillis();
this.fileSize = fileSize;
}
/**
* Internal method that is called to register the stop of the transfer.
*/
void registerStop() {
stopTime = System.currentTimeMillis();
}
}