diff --git a/webui/src/main/java/com/muwire/webui/BrowseServlet.java b/webui/src/main/java/com/muwire/webui/BrowseServlet.java index d6568899..1a578531 100644 --- a/webui/src/main/java/com/muwire/webui/BrowseServlet.java +++ b/webui/src/main/java/com/muwire/webui/BrowseServlet.java @@ -47,13 +47,8 @@ public class BrowseServlet extends HttpServlet { if (section.equals("status")) { - String key = req.getParameter("key"); - String order = req.getParameter("order"); - Comparator comparator = BROWSE_COMPARATORS.get(key, order); - List browses = new ArrayList<>(browseManager.getBrowses().values()); - if (comparator != null) - Collections.sort(browses, comparator); + BROWSE_COMPARATORS.sort(browses, req); sb.append(""); 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 comparator = RESULT_COMPARATORS.get(key, order); - List 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(""); wrapped.stream().map(Result::getEvent).forEach(result -> { diff --git a/webui/src/main/java/com/muwire/webui/ColumnComparators.java b/webui/src/main/java/com/muwire/webui/ColumnComparators.java index badfc6f8..987dab97 100644 --- a/webui/src/main/java/com/muwire/webui/ColumnComparators.java +++ b/webui/src/main/java/com/muwire/webui/ColumnComparators.java @@ -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 { private final Map> comparators = new HashMap<>(); @@ -12,11 +16,18 @@ public class ColumnComparators { comparators.put(key, comparator); } - Comparator get(String key, String order) { + private Comparator get(String key, String order) { Comparator rv = comparators.get(key); if (rv != null && order.equals("ascending")) rv = rv.reversed(); return rv; } + void sort(List items, HttpServletRequest req) { + String key = req.getParameter("key"); + String order = req.getParameter("order"); + Comparator comparator = get(key, order); + if (comparator != null) + Collections.sort(items, comparator); + } } diff --git a/webui/src/main/java/com/muwire/webui/DownloadServlet.java b/webui/src/main/java/com/muwire/webui/DownloadServlet.java index d6e85da9..c4d57b0e 100644 --- a/webui/src/main/java/com/muwire/webui/DownloadServlet.java +++ b/webui/src/main/java/com/muwire/webui/DownloadServlet.java @@ -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(""); - sb.append(""); + + List downloads = new ArrayList<>(); downloadManager.getDownloaders().forEach(d -> { - sb.append(""); - sb.append("").append(Base64.encode(d.getInfoHash().getRoot())).append(""); - sb.append("").append(Util.escapeHTMLinXML(d.getFile().getName())).append(""); - sb.append("").append(d.getCurrentState().toString()).append(""); + int speed = d.speed(); - sb.append("").append(DataHelper.formatSize2Decimal(speed)).append("B/sec").append(""); - - 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("").append(ETA).append(""); + 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("").append(progress).append(""); - // TODO: more details for the downloader details view - sb.append(""); + 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(""); + sb.append(""); + downloads.forEach(d -> d.toXML(sb)); sb.append(""); + + 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(""); + sb.append("").append(Base64.encode(infoHash.getRoot())).append(""); + sb.append("").append(name).append(""); + sb.append("").append(state.toString()).append(""); + sb.append("").append(DataHelper.formatSize2Decimal(speed, false)).append("B/sec").append(""); + String ETAString; + if (ETA == Long.MAX_VALUE) + ETAString = Util._t("Unknown"); + else + ETAString = DataHelper.formatDate(ETA); + sb.append("").append(ETAString).append(""); + String progress = String.format("%2d", percent) + "% of "+totalSize; + sb.append("").append(progress).append(""); + sb.append(""); + } + } + + private static final Comparator BY_NAME = (l, r) -> { + return l.name.compareTo(r.name); + }; + + private static final Comparator BY_STATE = (l, r) -> { + return l.state.toString().compareTo(r.state.toString()); + }; + + private static final Comparator BY_SPEED = (l, r) -> { + return Integer.compare(l.speed, r.speed); + }; + + private static final Comparator BY_ETA = (l, r) -> { + return Long.compare(l.ETA, r.ETA); + }; + + private static final Comparator BY_PROGRESS = (l, r) -> { + return Integer.compare(l.percent, r.percent); + }; + + private static final ColumnComparators 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); + } } diff --git a/webui/src/main/java/com/muwire/webui/SearchServlet.java b/webui/src/main/java/com/muwire/webui/SearchServlet.java index 60207387..471235ba 100644 --- a/webui/src/main/java/com/muwire/webui/SearchServlet.java +++ b/webui/src/main/java/com/muwire/webui/SearchServlet.java @@ -61,14 +61,8 @@ public class SearchServlet extends HttpServlet { return; } - String key = req.getParameter("key"); - String order = req.getParameter("order"); - Comparator comparator = SEARCH_COMPARATORS.get(key, order); - List searchResults = new ArrayList<>(searchManager.getResults().values()); - if (comparator != null) - Collections.sort(searchResults, comparator); - + SEARCH_COMPARATORS.sort(searchResults, req); sb.append(""); for (SearchResults results : searchResults) { sb.append(""); @@ -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.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.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.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(""); sendersForResult.forEach(sender -> sender.toXML(sb)); @@ -377,14 +371,6 @@ public class SearchServlet extends HttpServlet { } - private static void sort(List items, HttpServletRequest req, ColumnComparators comparators) { - String key = req.getParameter("key"); - String order = req.getParameter("order"); - Comparator comparator = comparators.get(key, order); - if (comparator != null) - Collections.sort(items, comparator); - } - private static final Comparator SEARCH_BY_NAME = (k, v) -> { return k.getSearch().compareTo(v.getSearch()); };