server-side of downloads sorting support
This commit is contained in:
@@ -47,13 +47,8 @@ public class BrowseServlet extends HttpServlet {
|
||||
|
||||
if (section.equals("status")) {
|
||||
|
||||
String key = req.getParameter("key");
|
||||
String order = req.getParameter("order");
|
||||
Comparator<Browse> comparator = BROWSE_COMPARATORS.get(key, order);
|
||||
|
||||
List<Browse> browses = new ArrayList<>(browseManager.getBrowses().values());
|
||||
if (comparator != null)
|
||||
Collections.sort(browses, comparator);
|
||||
BROWSE_COMPARATORS.sort(browses, req);
|
||||
|
||||
sb.append("<Status>");
|
||||
browses.forEach( browse -> {
|
||||
@@ -85,17 +80,11 @@ public class BrowseServlet extends HttpServlet {
|
||||
if (browse == null)
|
||||
return; // hmm
|
||||
|
||||
String key = req.getParameter("key");
|
||||
String order = req.getParameter("order");
|
||||
|
||||
Comparator<Result> comparator = RESULT_COMPARATORS.get(key, order);
|
||||
|
||||
List<Result> wrapped = browse.getResults().stream().map(event -> {
|
||||
return new Result(event, downloadManager.isDownloading(event.getInfohash()));
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
if (comparator != null)
|
||||
Collections.sort(wrapped, comparator);
|
||||
|
||||
RESULT_COMPARATORS.sort(wrapped, req);
|
||||
|
||||
sb.append("<Results>");
|
||||
wrapped.stream().map(Result::getEvent).forEach(result -> {
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package com.muwire.webui;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
public class ColumnComparators<T> {
|
||||
|
||||
private final Map<String, Comparator<T>> comparators = new HashMap<>();
|
||||
@@ -12,11 +16,18 @@ public class ColumnComparators<T> {
|
||||
comparators.put(key, comparator);
|
||||
}
|
||||
|
||||
Comparator<T> get(String key, String order) {
|
||||
private Comparator<T> get(String key, String order) {
|
||||
Comparator<T> rv = comparators.get(key);
|
||||
if (rv != null && order.equals("ascending"))
|
||||
rv = rv.reversed();
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sort(List<T> items, HttpServletRequest req) {
|
||||
String key = req.getParameter("key");
|
||||
String order = req.getParameter("order");
|
||||
Comparator<T> comparator = get(key, order);
|
||||
if (comparator != null)
|
||||
Collections.sort(items, comparator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,10 @@ package com.muwire.webui;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -42,38 +45,39 @@ public class DownloadServlet extends HttpServlet {
|
||||
resp.sendError(403, "Not initialized");
|
||||
return;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<?xml version='1.0' encoding='UTF-8'?>");
|
||||
sb.append("<Downloads>");
|
||||
|
||||
List<Download> downloads = new ArrayList<>();
|
||||
downloadManager.getDownloaders().forEach(d -> {
|
||||
sb.append("<Download>");
|
||||
sb.append("<InfoHash>").append(Base64.encode(d.getInfoHash().getRoot())).append("</InfoHash>");
|
||||
sb.append("<Name>").append(Util.escapeHTMLinXML(d.getFile().getName())).append("</Name>");
|
||||
sb.append("<State>").append(d.getCurrentState().toString()).append("</State>");
|
||||
|
||||
int speed = d.speed();
|
||||
sb.append("<Speed>").append(DataHelper.formatSize2Decimal(speed)).append("B/sec").append("</Speed>");
|
||||
|
||||
String ETA;
|
||||
if (speed == 0)
|
||||
ETA = Util._t("Unknown");
|
||||
else {
|
||||
long remaining = (d.getNPieces() - d.donePieces()) * d.getPieceSize() / speed;
|
||||
ETA = DataHelper.formatDuration(remaining * 1000);
|
||||
}
|
||||
sb.append("<ETA>").append(ETA).append("</ETA>");
|
||||
long ETA = Long.MAX_VALUE;
|
||||
if (speed > 0)
|
||||
ETA = (d.getNPieces() - d.donePieces()) * d.getPieceSize() * 1000 / speed;
|
||||
|
||||
int percent = -1;
|
||||
if (d.getNPieces() != 0)
|
||||
percent = (int)(d.donePieces() * 100 / d.getNPieces());
|
||||
String totalSize = DataHelper.formatSize2Decimal(d.getLength(), false) + "B";
|
||||
// FIXME translate
|
||||
String progress = String.format("%2d", percent) + "% of "+totalSize;
|
||||
sb.append("<Progress>").append(progress).append("</Progress>");
|
||||
|
||||
// TODO: more details for the downloader details view
|
||||
sb.append("</Download>");
|
||||
Download download = new Download(d.getInfoHash(),
|
||||
d.getFile().getName(),
|
||||
d.getCurrentState(),
|
||||
speed,
|
||||
ETA,
|
||||
percent,
|
||||
d.getLength());
|
||||
|
||||
downloads.add(download);
|
||||
});
|
||||
COMPARATORS.sort(downloads, req);
|
||||
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<?xml version='1.0' encoding='UTF-8'?>");
|
||||
sb.append("<Downloads>");
|
||||
downloads.forEach(d -> d.toXML(sb));
|
||||
sb.append("</Downloads>");
|
||||
|
||||
|
||||
resp.setContentType("text/xml");
|
||||
resp.setCharacterEncoding("UTF-8");
|
||||
resp.setDateHeader("Expires", 0);
|
||||
@@ -131,4 +135,71 @@ public class DownloadServlet extends HttpServlet {
|
||||
// P-R-G
|
||||
resp.sendRedirect("/MuWire/Downloads");
|
||||
}
|
||||
|
||||
private static class Download {
|
||||
private final InfoHash infoHash;
|
||||
private final String name;
|
||||
private final Downloader.DownloadState state;
|
||||
private final int speed;
|
||||
private final long ETA;
|
||||
private final int percent;
|
||||
private final long totalSize;
|
||||
|
||||
Download(InfoHash infoHash, String name, Downloader.DownloadState state,
|
||||
int speed, long ETA, int percent, long totalSize) {
|
||||
this.infoHash = infoHash;
|
||||
this.name = name;
|
||||
this.state = state;
|
||||
this.speed = speed;
|
||||
this.ETA = ETA;
|
||||
this.percent = percent;
|
||||
this.totalSize = totalSize;
|
||||
}
|
||||
|
||||
void toXML(StringBuilder sb) {
|
||||
sb.append("<Download>");
|
||||
sb.append("<InfoHash>").append(Base64.encode(infoHash.getRoot())).append("</InfoHash>");
|
||||
sb.append("<Name>").append(name).append("</Name>");
|
||||
sb.append("<State>").append(state.toString()).append("</State>");
|
||||
sb.append("<Speed>").append(DataHelper.formatSize2Decimal(speed, false)).append("B/sec").append("</Speed>");
|
||||
String ETAString;
|
||||
if (ETA == Long.MAX_VALUE)
|
||||
ETAString = Util._t("Unknown");
|
||||
else
|
||||
ETAString = DataHelper.formatDate(ETA);
|
||||
sb.append("<ETA>").append(ETAString).append("</ETA>");
|
||||
String progress = String.format("%2d", percent) + "% of "+totalSize;
|
||||
sb.append("<Progress>").append(progress).append("</Progress>");
|
||||
sb.append("</Download>");
|
||||
}
|
||||
}
|
||||
|
||||
private static final Comparator<Download> BY_NAME = (l, r) -> {
|
||||
return l.name.compareTo(r.name);
|
||||
};
|
||||
|
||||
private static final Comparator<Download> BY_STATE = (l, r) -> {
|
||||
return l.state.toString().compareTo(r.state.toString());
|
||||
};
|
||||
|
||||
private static final Comparator<Download> BY_SPEED = (l, r) -> {
|
||||
return Integer.compare(l.speed, r.speed);
|
||||
};
|
||||
|
||||
private static final Comparator<Download> BY_ETA = (l, r) -> {
|
||||
return Long.compare(l.ETA, r.ETA);
|
||||
};
|
||||
|
||||
private static final Comparator<Download> BY_PROGRESS = (l, r) -> {
|
||||
return Integer.compare(l.percent, r.percent);
|
||||
};
|
||||
|
||||
private static final ColumnComparators<Download> COMPARATORS = new ColumnComparators<>();
|
||||
static {
|
||||
COMPARATORS.add("Name", BY_NAME);
|
||||
COMPARATORS.add("State", BY_STATE);
|
||||
COMPARATORS.add("Speed", BY_SPEED);
|
||||
COMPARATORS.add("ETA", BY_ETA);
|
||||
COMPARATORS.add("Progress", BY_PROGRESS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,14 +61,8 @@ public class SearchServlet extends HttpServlet {
|
||||
return;
|
||||
}
|
||||
|
||||
String key = req.getParameter("key");
|
||||
String order = req.getParameter("order");
|
||||
Comparator<SearchResults> comparator = SEARCH_COMPARATORS.get(key, order);
|
||||
|
||||
List<SearchResults> searchResults = new ArrayList<>(searchManager.getResults().values());
|
||||
if (comparator != null)
|
||||
Collections.sort(searchResults, comparator);
|
||||
|
||||
SEARCH_COMPARATORS.sort(searchResults, req);
|
||||
sb.append("<Searches>");
|
||||
for (SearchResults results : searchResults) {
|
||||
sb.append("<Search>");
|
||||
@@ -108,7 +102,7 @@ public class SearchServlet extends HttpServlet {
|
||||
senders.add(sender);
|
||||
});
|
||||
|
||||
sort(senders, req, SENDER_COMPARATORS);
|
||||
SENDER_COMPARATORS.sort(senders, req);
|
||||
|
||||
sb.append("<Senders>");
|
||||
senders.forEach(sender -> sender.toXML(sb));
|
||||
@@ -145,7 +139,7 @@ public class SearchServlet extends HttpServlet {
|
||||
resultsFromSender.add(resultFromSender);
|
||||
});
|
||||
|
||||
sort(resultsFromSender, req, RESULT_FROM_SENDER_COMPARATORS);
|
||||
RESULT_FROM_SENDER_COMPARATORS.sort(resultsFromSender, req);
|
||||
|
||||
sb.append("<ResultsFromSender>");
|
||||
resultsFromSender.forEach(result -> result.toXML(sb));
|
||||
@@ -178,7 +172,7 @@ public class SearchServlet extends HttpServlet {
|
||||
results.add(result);
|
||||
});
|
||||
|
||||
sort(results, req, RESULT_COMPARATORS);
|
||||
RESULT_COMPARATORS.sort(results, req);
|
||||
|
||||
sb.append("<Results>");
|
||||
results.forEach(result -> result.toXML(sb));
|
||||
@@ -224,7 +218,7 @@ public class SearchServlet extends HttpServlet {
|
||||
sendersForResult.add(senderForResult);
|
||||
});
|
||||
|
||||
sort(sendersForResult, req, SENDER_FOR_RESULT_COMPARATORS);
|
||||
SENDER_FOR_RESULT_COMPARATORS.sort(sendersForResult, req);
|
||||
|
||||
sb.append("<Senders>");
|
||||
sendersForResult.forEach(sender -> sender.toXML(sb));
|
||||
@@ -377,14 +371,6 @@ public class SearchServlet extends HttpServlet {
|
||||
|
||||
}
|
||||
|
||||
private static <T> void sort(List<T> items, HttpServletRequest req, ColumnComparators<T> comparators) {
|
||||
String key = req.getParameter("key");
|
||||
String order = req.getParameter("order");
|
||||
Comparator<T> comparator = comparators.get(key, order);
|
||||
if (comparator != null)
|
||||
Collections.sort(items, comparator);
|
||||
}
|
||||
|
||||
private static final Comparator<SearchResults> SEARCH_BY_NAME = (k, v) -> {
|
||||
return k.getSearch().compareTo(v.getSearch());
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user