import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javafx.concurrent.Task;
import javafx.beans.property.StringProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleDoubleProperty;
public class DownloadUnit extends Task<Void> {
public enum TableField {
FILENAME,ORIGIN,URL,FOLDER,SIZE,TYPE,STATUS,
TRANSFER_RATE,PROGRESS,PERCENTAGE,SEGMENTS,
RESUME,START,SCHEDULED,FINISH,DOWNLOADED,
}
public enum Status{
QUEUED, SCHEDULED, PAUSED,
DOWNLOADING, COMPLETED, ERROR,
RESUMED, MERGING, NET_ERROR
}
/* download related static information */
private long uid;
public long sizeLong;
public boolean resumable;
private SimpleStringProperty filename;
private SimpleStringProperty origin;
private SimpleStringProperty url;
private SimpleStringProperty folder;
private SimpleStringProperty size;
private SimpleStringProperty type;
private SimpleLongProperty segments;
private SimpleStringProperty resumeCap;
//private SimpleObjectProperty<LocalDateTime> start, scheduled, finish;
/* download related dynamic information */
public Status statusEnum;
public List<Long> chunks; /* current downloaded bytes in each segment */
private SimpleStringProperty status;
private SimpleStringProperty transferRate;
private SimpleStringProperty downloaded;
private SimpleDoubleProperty progress;
private SimpleStringProperty percentage;
public DownloadUnit (String uri){
/* setting default static elements */
filename = new SimpleStringProperty(uri);
origin = new SimpleStringProperty(uri);
url = new SimpleStringProperty(uri);
folder = new SimpleStringProperty(System.getProperty("user.home")+File.separator+"/Downloads");
size = new SimpleStringProperty("--");
type = new SimpleStringProperty("--");
segments = new SimpleLongProperty(1);
resumeCap = new SimpleStringProperty("No");
/* setting default dynamic elements */
statusEnum = Status.QUEUED;
resumable = false;
chunks = new ArrayList<Long>();
status = new SimpleStringProperty("Queued");
transferRate = new SimpleStringProperty("--");
progress = new SimpleDoubleProperty(0);
percentage = new SimpleStringProperty("0.0 %");
downloaded = new SimpleStringProperty("0 B");
/*
start = new SimpleObjectProperty<LocalDateTime>();
scheduled = new SimpleObjectProperty<LocalDateTime>();
finish = new SimpleObjectProperty<LocalDateTime>();
*/
}
public void setUID(long uid){
this.uid = uid;
}
public long getUID(){
return uid;
}
public Object getProperty(TableField tf){
switch(tf){
case FILENAME:
return filename.get();
case ORIGIN:
return origin.get();
case URL:
return url.get();
case FOLDER:
return folder.get();
case SIZE:
return size.get();
case TYPE:
return type.get();
case STATUS:
return status.get();
case TRANSFER_RATE:
return transferRate.get();
case PROGRESS:
return progress.get();
case PERCENTAGE:
return percentage.get();
case SEGMENTS:
return segments.get();
case RESUME:
return resumeCap.get();
case DOWNLOADED:
return downloaded.get();
/*
case START:
return start.get();
case SCHEDULED:
return scheduled.get();
case FINISH:
return finish.get();
*/
default:
return null;
}
}
public void setProperty(TableField tf, Object value){
switch(tf){
case FILENAME:
filename.set((String)value);
break;
case ORIGIN:
origin.set((String)value);
break;
case URL:
url.set((String)value);
break;
case FOLDER:
folder.set((String)value);
break;
case SIZE:
size.set((String)value);
break;
case TYPE:
type.set((String)value);
break;
case STATUS:
status.set((String)value);
break;
case TRANSFER_RATE:
transferRate.set((String)value);
break;
case DOWNLOADED:
downloaded.set((String)value);
break;
case PROGRESS:
progress.set((Double)value);
updateProgress((Double)value, 1);
break;
case PERCENTAGE:
percentage.set((String)value);
break;
case SEGMENTS:
segments.set((Long)value);
break;
case RESUME:
resumeCap.set((String)value);
break;
/*
case START:
start.set((LocalDateTime)value);
break;
case SCHEDULED:
scheduled.set((LocalDateTime)value);
break;
case FINISH:
finish.set((LocalDateTime)value);
break;
*/
default:
break;
}
}
public StringProperty filenameProperty(){
return filename;
}
public StringProperty sizeProperty(){
return size;
}
public StringProperty statusProperty(){
return status;
}
public StringProperty transferRateProperty(){
return transferRate;
}
public StringProperty resumeCapProperty(){
return resumeCap;
}
public StringProperty downloadedProperty(){
return downloaded;
}
public StringProperty percentageProperty(){
return percentage;
}
@Override
protected Void call() throws Exception {
return null;
}
}