in src/main/java/com/aliyun/oss/internal/OSSDownloadOperation.java [517:585]
private DownloadResult download(DownloadCheckPoint downloadCheckPoint, DownloadFileRequest downloadFileRequest)
throws Throwable {
DownloadResult downloadResult = new DownloadResult();
ArrayList<PartResult> taskResults = new ArrayList<PartResult>();
ExecutorService service = Executors.newFixedThreadPool(downloadFileRequest.getTaskNum());
ArrayList<Future<PartResult>> futures = new ArrayList<Future<PartResult>>();
List<Task> tasks = new ArrayList<Task>();
ProgressListener listener = downloadFileRequest.getProgressListener();
// Compute the size of data pending download.
long completedLength = 0;
long contentLength = 0;
for (int i = 0; i < downloadCheckPoint.downloadParts.size(); i++) {
long partSize = downloadCheckPoint.downloadParts.get(i).end -
downloadCheckPoint.downloadParts.get(i).start + 1;
contentLength += partSize;
if (downloadCheckPoint.downloadParts.get(i).isCompleted) {
completedLength += partSize;
}
}
ProgressPublisher.publishResponseContentLength(listener, contentLength);
ProgressPublisher.publishResponseBytesTransferred(listener, completedLength);
downloadFileRequest.setProgressListener(null);
// Concurrently download parts.
for (int i = 0; i < downloadCheckPoint.downloadParts.size(); i++) {
if (!downloadCheckPoint.downloadParts.get(i).isCompleted) {
Task task = new Task(i, "download-" + i, downloadCheckPoint, i, downloadFileRequest, objectOperation,
listener);
futures.add(service.submit(task));
tasks.add(task);
} else {
taskResults.add(new PartResult(i + 1, downloadCheckPoint.downloadParts.get(i).start,
downloadCheckPoint.downloadParts.get(i).end, downloadCheckPoint.downloadParts.get(i).length,
downloadCheckPoint.downloadParts.get(i).crc));
}
}
service.shutdown();
// Waiting for all parts download,
service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
for (Future<PartResult> future : futures) {
try {
PartResult tr = future.get();
taskResults.add(tr);
} catch (ExecutionException e) {
downloadFileRequest.setProgressListener(listener);
throw e.getCause();
}
}
// Sorts the download result by the part number.
Collections.sort(taskResults, new Comparator<PartResult>() {
@Override
public int compare(PartResult p1, PartResult p2) {
return p1.getNumber() - p2.getNumber();
}
});
// sets the return value.
downloadResult.setPartResults(taskResults);
if (tasks.size() > 0) {
downloadResult.setObjectMetadata(tasks.get(0).GetobjectMetadata());
}
downloadFileRequest.setProgressListener(listener);
return downloadResult;
}