server-side of downloads sorting support

This commit is contained in:
Zlatin Balevsky
2019-12-12 13:19:25 +00:00
parent e06cb05e2a
commit ca56363438
4 changed files with 114 additions and 57 deletions

View File

@@ -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 -> {

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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());
};