final DownloadImpl download = new DownloadImpl(description, transferProgress, listenerChain, s3Object, stateListener);
// null is returned when constraints aren't met
if (s3Object == null) {
download.setState(TransferState.Canceled);
download.setMonitor(new DownloadMonitor(download, null));
return download;
}
long contentLength = s3Object.getObjectMetadata().getContentLength();
if (getObjectRequest.getRange() != null && getObjectRequest.getRange().length == 2) {
long startingByte = getObjectRequest.getRange()[0];
long lastByte = getObjectRequest.getRange()[1];
contentLength = lastByte - startingByte;
}
transferProgress.setTotalBytesToTransfer(contentLength);
Future<?> future = threadPool.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
try {
download.setState(TransferState.InProgress);
ServiceUtils.downloadObjectToFile(s3Object, file);
download.setState(TransferState.Completed);
return true;
} catch (Exception e) {
// Downloads aren't allowed to move from canceled to failed
if (download.getState() != TransferState.Canceled) {
download.setState(TransferState.Failed);
}
throw e;
}
}
});
download.setMonitor(new DownloadMonitor(download, future));
return download;
}