failedUnknownMIMEType.put(mimeType, list);
}
list.add(download);
} else if(failureCode == FetchExceptionMode.CONTENT_VALIDATION_BAD_MIME) {
mimeType = ContentFilter.stripMIMEType(mimeType);
FilterMIMEType type = ContentFilter.getMIMEType(mimeType);
LinkedList<DownloadRequestStatus> list;
if(type == null) {
Logger.error(this, "Bad MIME failure code yet MIME is "+mimeType+" which does not have a handler!");
list = failedUnknownMIMEType.get(mimeType);
if(list == null) {
list = new LinkedList<DownloadRequestStatus>();
failedUnknownMIMEType.put(mimeType, list);
}
} else {
list = failedBadMIMEType.get(mimeType);
if(list == null) {
list = new LinkedList<DownloadRequestStatus>();
failedBadMIMEType.put(mimeType, list);
}
}
list.add(download);
} else {
failedDownload.add(download);
}
} else {
short prio = download.getPriority();
if(prio < lowestQueuedPrio)
lowestQueuedPrio = prio;
uncompletedDownload.add(download);
long size = download.getDataSize();
if(size > 0)
totalQueuedDownloadSize += size;
}
added = true;
} else if(req instanceof UploadFileRequestStatus && uploads) {
UploadFileRequestStatus upload = (UploadFileRequestStatus)req;
if(upload.hasSucceeded()) {
completedUpload.add(upload);
} else if(upload.hasFinished()) {
failedUpload.add(upload);
} else {
short prio = upload.getPriority();
if(prio < lowestQueuedPrio)
lowestQueuedPrio = prio;
uncompletedUpload.add(upload);
}
long size = upload.getDataSize();
if(size > 0)
totalQueuedUploadSize += size;
added = true;
} else if(req instanceof UploadDirRequestStatus && uploads) {
UploadDirRequestStatus upload = (UploadDirRequestStatus)req;
if(upload.hasSucceeded()) {
completedDirUpload.add(upload);
} else if(upload.hasFinished()) {
failedDirUpload.add(upload);
} else {
short prio = upload.getPriority();
if(prio < lowestQueuedPrio)
lowestQueuedPrio = prio;
uncompletedDirUpload.add(upload);
}
long size = upload.getTotalDataSize();
if(size > 0)
totalQueuedUploadSize += size;
added = true;
}
}
if(!added) {
return sendEmptyQueuePage(ctx, pageMaker);
}
Logger.minor(this, "Total queued downloads: "+SizeUtil.formatSize(totalQueuedDownloadSize));
Logger.minor(this, "Total queued uploads: "+SizeUtil.formatSize(totalQueuedUploadSize));
Comparator<RequestStatus> jobComparator = new Comparator<RequestStatus>() {
@Override
public int compare(RequestStatus firstRequest, RequestStatus secondRequest) {
if(firstRequest == secondRequest) return 0; // Short cut.
int result = 0;
boolean isSet = true;
if(request.isParameterSet("sortBy")){
final String sortBy = request.getParam("sortBy");
if(sortBy.equals("id")){
result = firstRequest.getIdentifier().compareToIgnoreCase(secondRequest.getIdentifier());
if(result == 0)
result = firstRequest.getIdentifier().compareTo(secondRequest.getIdentifier());
}else if(sortBy.equals("size")){
result = Fields.compare(firstRequest.getTotalBlocks(), secondRequest.getTotalBlocks());
}else if(sortBy.equals("progress")){
boolean firstFinalized = firstRequest.isTotalFinalized();
boolean secondFinalized = secondRequest.isTotalFinalized();
if(firstFinalized && !secondFinalized)
result = 1;
else if(secondFinalized && !firstFinalized)
result = -1;
else {
double firstProgress = ((double)firstRequest.getFetchedBlocks()) / ((double)firstRequest.getMinBlocks());
double secondProgress = ((double)secondRequest.getFetchedBlocks()) / ((double)secondRequest.getMinBlocks());
result = Fields.compare(firstProgress, secondProgress);
}
} else if (sortBy.equals("lastActivity")) {
result = Fields.compare(firstRequest.getLastActivity(), secondRequest.getLastActivity());
}else
isSet=false;
}else
isSet=false;
if(!isSet){
result = Fields.compare(firstRequest.getPriority(), secondRequest.getPriority());
if(result == 0)
result = firstRequest.getIdentifier().compareTo(secondRequest.getIdentifier());
}
if(result == 0){
return 0;
}else if(request.isParameterSet("reversed")){
isReversed = true;
return result > 0 ? -1 : 1;
}else{
isReversed = false;
return result < 0 ? -1 : 1;
}
}
};
Collections.sort(completedDownloadToDisk, jobComparator);
Collections.sort(completedDownloadToTemp, jobComparator);
Collections.sort(completedUpload, jobComparator);
Collections.sort(completedDirUpload, jobComparator);
Collections.sort(failedDownload, jobComparator);
Collections.sort(failedUpload, jobComparator);
Collections.sort(failedDirUpload, jobComparator);
Collections.sort(uncompletedDownload, jobComparator);
Collections.sort(uncompletedUpload, jobComparator);
Collections.sort(uncompletedDirUpload, jobComparator);
String pageName;
if(uploads)
pageName =
"(" + (uncompletedDirUpload.size() + uncompletedUpload.size()) +
'/' + (failedDirUpload.size() + failedUpload.size()) +
'/' + (completedDirUpload.size() + completedUpload.size()) +
") "+l10n("titleUploads");
else
pageName =
"(" + uncompletedDownload.size() +
'/' + failedDownload.size() +
'/' + (completedDownloadToDisk.size() + completedDownloadToTemp.size()) +
") "+l10n("titleDownloads");
PageNode page = pageMaker.getPageNode(pageName, ctx);
HTMLNode pageNode = page.outer;
HTMLNode contentNode = page.content;
/* add alert summary box */
if(ctx.isAllowedFullAccess())
contentNode.addChild(ctx.getAlertManager().createSummary());
/* navigation bar */
InfoboxNode infobox = pageMaker.getInfobox("navbar", l10n("requestNavigation"), null, false);
HTMLNode navigationBar = infobox.outer;
HTMLNode navigationContent = infobox.content.addChild("ul");
boolean includeNavigationBar = false;
if (!completedDownloadToTemp.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#completedDownloadToTemp", l10n("completedDtoTemp", new String[]{ "size" }, new String[]{ String.valueOf(completedDownloadToTemp.size()) }));
includeNavigationBar = true;
}
if (!completedDownloadToDisk.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#completedDownloadToDisk", l10n("completedDtoDisk", new String[]{ "size" }, new String[]{ String.valueOf(completedDownloadToDisk.size()) }));
includeNavigationBar = true;
}
if (!completedUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#completedUpload", l10n("completedU", new String[]{ "size" }, new String[]{ String.valueOf(completedUpload.size()) }));
includeNavigationBar = true;
}
if (!completedDirUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#completedDirUpload", l10n("completedDU", new String[]{ "size" }, new String[]{ String.valueOf(completedDirUpload.size()) }));
includeNavigationBar = true;
}
if (!failedDownload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#failedDownload", l10n("failedD", new String[]{ "size" }, new String[]{ String.valueOf(failedDownload.size()) }));
includeNavigationBar = true;
}
if (!failedUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#failedUpload", l10n("failedU", new String[]{ "size" }, new String[]{ String.valueOf(failedUpload.size()) }));
includeNavigationBar = true;
}
if (!failedDirUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#failedDirUpload", l10n("failedDU", new String[]{ "size" }, new String[]{ String.valueOf(failedDirUpload.size()) }));
includeNavigationBar = true;
}
if (failedUnknownMIMEType.size() > 0) {
String[] types = failedUnknownMIMEType.keySet().toArray(new String[failedUnknownMIMEType.size()]);
Arrays.sort(types);
for(String type : types) {
String atype = type.replace("-", "--").replace('/', '-');
navigationContent.addChild("li").addChild("a", "href", "#failedDownload-unknowntype-"+atype, l10n("failedDUnknownMIME", new String[]{ "size", "type" }, new String[]{ String.valueOf(failedUnknownMIMEType.get(type).size()), type }));
}
}
if (failedBadMIMEType.size() > 0) {
String[] types = failedBadMIMEType.keySet().toArray(new String[failedBadMIMEType.size()]);
Arrays.sort(types);
for(String type : types) {
String atype = type.replace("-", "--").replace('/', '-');
navigationContent.addChild("li").addChild("a", "href", "#failedDownload-badtype-"+atype, l10n("failedDBadMIME", new String[]{ "size", "type" }, new String[]{ String.valueOf(failedBadMIMEType.get(type).size()), type }));
}
}
if (!uncompletedDownload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#uncompletedDownload", l10n("DinProgress", new String[]{ "size" }, new String[]{ String.valueOf(uncompletedDownload.size()) }));
includeNavigationBar = true;
}
if (!uncompletedUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#uncompletedUpload", l10n("UinProgress", new String[]{ "size" }, new String[]{ String.valueOf(uncompletedUpload.size()) }));
includeNavigationBar = true;
}
if (!uncompletedDirUpload.isEmpty()) {
navigationContent.addChild("li").addChild("a", "href", "#uncompletedDirUpload", l10n("DUinProgress", new String[]{ "size" }, new String[]{ String.valueOf(uncompletedDirUpload.size()) }));
includeNavigationBar = true;
}
if (totalQueuedDownloadSize > 0) {
navigationContent.addChild("li", l10n("totalQueuedDownloads", "size", SizeUtil.formatSize(totalQueuedDownloadSize)));
includeNavigationBar = true;
}
if (totalQueuedUploadSize > 0) {
navigationContent.addChild("li", l10n("totalQueuedUploads", "size", SizeUtil.formatSize(totalQueuedUploadSize)));
includeNavigationBar = true;
}
navigationContent.addChild("li").addChild("a", "href", FETCH_KEY_LIST_LOCATION,
l10n("openKeyList"));
if (includeNavigationBar) {
contentNode.addChild(navigationBar);
}
final String[] priorityClasses = new String[] {
l10n("priority0"),
l10n("priority1"),
l10n("priority2"),
l10n("priority3"),
l10n("priority4"),
l10n("priority5"),
l10n("priority6")
};
boolean advancedModeEnabled = pageMaker.advancedMode(request, this.container);
HTMLNode legendContent = pageMaker.getInfobox("legend", l10n("legend"), contentNode, "queue-legend", true);
HTMLNode legendTable = legendContent.addChild("table", "class", "queue");
HTMLNode legendRow = legendTable.addChild("tr");
for(int i=0; i<7; i++){
if(i > RequestStarter.INTERACTIVE_PRIORITY_CLASS || advancedModeEnabled || i <= lowestQueuedPrio)
legendRow.addChild("td", "class", "priority" + i, priorityClasses[i]);
}
if (SimpleToadletServer.isPanicButtonToBeShown) {
// There may be persistent downloads etc under other PersistentRequestClient's, so still show it.
contentNode.addChild(createPanicBox(pageMaker, ctx));
}
final QueueColumn[] advancedModeFailure = new QueueColumn[] {
QueueColumn.IDENTIFIER,
QueueColumn.FILENAME,
QueueColumn.SIZE,
QueueColumn.MIME_TYPE,
QueueColumn.PROGRESS,
QueueColumn.REASON,
QueueColumn.PERSISTENCE,
QueueColumn.KEY };
final QueueColumn[] simpleModeFailure = new QueueColumn[] {
QueueColumn.FILENAME,
QueueColumn.SIZE,
QueueColumn.PROGRESS,
QueueColumn.REASON,
QueueColumn.KEY };
if (!completedDownloadToTemp.isEmpty()) {
contentNode.addChild("a", "id", "completedDownloadToTemp");
HTMLNode completedDownloadsToTempContent = pageMaker.getInfobox("completed_requests", l10n("completedDinTempDirectory", new String[]{ "size" }, new String[]{ String.valueOf(completedDownloadToTemp.size()) }), contentNode, "request-completed", false);
if (advancedModeEnabled) {
completedDownloadsToTempContent.addChild(createRequestTable(pageMaker, ctx, completedDownloadToTemp, new QueueColumn[] { QueueColumn.IDENTIFIER, QueueColumn.SIZE, QueueColumn.MIME_TYPE, QueueColumn.PERSISTENCE, QueueColumn.KEY, QueueColumn.COMPAT_MODE }, priorityClasses, advancedModeEnabled, false, "completed-temp", true, true));
} else {
completedDownloadsToTempContent.addChild(createRequestTable(pageMaker, ctx, completedDownloadToTemp, new QueueColumn[] { QueueColumn.SIZE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, false, "completed-temp", true, true));
}
}
if (!completedDownloadToDisk.isEmpty()) {
contentNode.addChild("a", "id", "completedDownloadToDisk");
HTMLNode completedToDiskInfoboxContent = pageMaker.getInfobox("completed_requests", l10n("completedDinDownloadDirectory", new String[]{ "size" }, new String[]{ String.valueOf(completedDownloadToDisk.size()) }), contentNode, "request-completed", false);
if (advancedModeEnabled) {
completedToDiskInfoboxContent.addChild(createRequestTable(pageMaker, ctx, completedDownloadToDisk, new QueueColumn[] { QueueColumn.IDENTIFIER, QueueColumn.FILENAME, QueueColumn.SIZE, QueueColumn.MIME_TYPE, QueueColumn.PERSISTENCE, QueueColumn.KEY, QueueColumn.COMPAT_MODE }, priorityClasses, advancedModeEnabled, false, "completed-disk", false, true));
} else {
completedToDiskInfoboxContent.addChild(createRequestTable(pageMaker, ctx, completedDownloadToDisk, new QueueColumn[] { QueueColumn.FILENAME, QueueColumn.SIZE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, false, "completed-disk", false, true));
}
}
if (!completedUpload.isEmpty()) {
contentNode.addChild("a", "id", "completedUpload");
HTMLNode completedUploadInfoboxContent = pageMaker.getInfobox("completed_requests", l10n("completedU", new String[]{ "size" }, new String[]{ String.valueOf(completedUpload.size()) }), contentNode, "download-completed", false);
if (advancedModeEnabled) {
completedUploadInfoboxContent.addChild(createRequestTable(pageMaker, ctx, completedUpload, new QueueColumn[] { QueueColumn.IDENTIFIER, QueueColumn.FILENAME, QueueColumn.SIZE, QueueColumn.MIME_TYPE, QueueColumn.PERSISTENCE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "completed-upload-file", false, true));
} else {
completedUploadInfoboxContent.addChild(createRequestTable(pageMaker, ctx, completedUpload, new QueueColumn[] { QueueColumn.FILENAME, QueueColumn.SIZE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "completed-upload-file", false, true));
}
}
if (!completedDirUpload.isEmpty()) {
contentNode.addChild("a", "id", "completedDirUpload");
HTMLNode completedUploadDirContent = pageMaker.getInfobox("completed_requests", l10n("completedUDirectory", new String[]{ "size" }, new String[]{ String.valueOf(completedDirUpload.size()) }), contentNode, "download-completed", false);
if (advancedModeEnabled) {
completedUploadDirContent.addChild(createRequestTable(pageMaker, ctx, completedDirUpload, new QueueColumn[] { QueueColumn.IDENTIFIER, QueueColumn.FILES, QueueColumn.TOTAL_SIZE, QueueColumn.PERSISTENCE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "completed-upload-dir", false, true));
} else {
completedUploadDirContent.addChild(createRequestTable(pageMaker, ctx, completedDirUpload, new QueueColumn[] { QueueColumn.FILES, QueueColumn.TOTAL_SIZE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "completed-upload-dir", false, true));
}
}
if (!failedDownload.isEmpty()) {
contentNode.addChild("a", "id", "failedDownload");
HTMLNode failedContent = pageMaker.getInfobox("failed_requests", l10n("failedD", new String[]{ "size" }, new String[]{ String.valueOf(failedDownload.size()) }), contentNode, "download-failed", false);
if (advancedModeEnabled) {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedDownload, advancedModeFailure, priorityClasses, advancedModeEnabled, false, "failed-download", false, true, false, false, null));
} else {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedDownload, simpleModeFailure, priorityClasses, advancedModeEnabled, false, "failed-download", false, true, false, false, null));
}
}
if (!failedUpload.isEmpty()) {
contentNode.addChild("a", "id", "failedUpload");
HTMLNode failedContent = pageMaker.getInfobox("failed_requests", l10n("failedU", new String[]{ "size" }, new String[]{ String.valueOf(failedUpload.size()) }), contentNode, "upload-failed", false);
if (advancedModeEnabled) {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedUpload, advancedModeFailure, priorityClasses, advancedModeEnabled, true, "failed-upload-file", false, true, false, false, null));
} else {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedUpload, simpleModeFailure, priorityClasses, advancedModeEnabled, true, "failed-upload-file", false, true, false, false, null));
}
}
if (!failedDirUpload.isEmpty()) {
contentNode.addChild("a", "id", "failedDirUpload");
HTMLNode failedContent = pageMaker.getInfobox("failed_requests", l10n("failedU", new String[]{ "size" }, new String[]{ String.valueOf(failedDirUpload.size()) }), contentNode, "upload-failed", false);
if (advancedModeEnabled) {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedDirUpload, new QueueColumn[] { QueueColumn.IDENTIFIER, QueueColumn.FILES, QueueColumn.TOTAL_SIZE, QueueColumn.PROGRESS, QueueColumn.REASON, QueueColumn.PERSISTENCE, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "failed-upload-dir", false, true, false, false, null));
} else {
failedContent.addChild(createRequestTable(pageMaker, ctx, failedDirUpload, new QueueColumn[] { QueueColumn.FILES, QueueColumn.TOTAL_SIZE, QueueColumn.PROGRESS, QueueColumn.REASON, QueueColumn.KEY }, priorityClasses, advancedModeEnabled, true, "failed-upload-dir", false, true, false, false, null));
}
}
if(!failedBadMIMEType.isEmpty()) {
String[] types = failedBadMIMEType.keySet().toArray(new String[failedBadMIMEType.size()]);
Arrays.sort(types);
for(String type : types) {
LinkedList<DownloadRequestStatus> getters = failedBadMIMEType.get(type);
String atype = type.replace("-", "--").replace('/', '-');
contentNode.addChild("a", "id", "failedDownload-badtype-"+atype);
FilterMIMEType typeHandler = ContentFilter.getMIMEType(type);
HTMLNode failedContent = pageMaker.getInfobox("failed_requests", l10n("failedDBadMIME", new String[]{ "size", "type" }, new String[]{ String.valueOf(getters.size()), type }), contentNode, "download-failed-"+atype, false);
// FIXME add a class for easier styling.
KnownUnsafeContentTypeException e = new KnownUnsafeContentTypeException(typeHandler);
failedContent.addChild("p", l10n("badMIMETypeIntro", "type", type));
List<String> detail = e.details();