diff --git a/webui/src/main/java/com/muwire/webui/BrowseManager.java b/webui/src/main/java/com/muwire/webui/BrowseManager.java index 3adf6735..9d3e0c7b 100644 --- a/webui/src/main/java/com/muwire/webui/BrowseManager.java +++ b/webui/src/main/java/com/muwire/webui/BrowseManager.java @@ -86,5 +86,9 @@ public class BrowseManager { public long getRevision() { return revision; } + + public Persona getHost() { + return persona; + } } } diff --git a/webui/src/main/java/com/muwire/webui/BrowseServlet.java b/webui/src/main/java/com/muwire/webui/BrowseServlet.java index 2f1031dd..d6568899 100644 --- a/webui/src/main/java/com/muwire/webui/BrowseServlet.java +++ b/webui/src/main/java/com/muwire/webui/BrowseServlet.java @@ -3,6 +3,7 @@ package com.muwire.webui; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -45,11 +46,20 @@ public class BrowseServlet extends HttpServlet { sb.append(""); 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); + sb.append(""); - browseManager.getBrowses().forEach( (persona, browse) -> { + browses.forEach( browse -> { sb.append(""); - sb.append("").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append(""); - sb.append("").append(persona.toBase64()).append(""); + sb.append("").append(Util.escapeHTMLinXML(browse.getHost().getHumanReadableName())).append(""); + sb.append("").append(browse.getHost().toBase64()).append(""); sb.append("").append(browse.getStatus()).append(""); sb.append("").append(browse.getTotalResults()).append(""); sb.append("").append(browse.getResults().size()).append(""); @@ -78,9 +88,7 @@ public class BrowseServlet extends HttpServlet { String key = req.getParameter("key"); String order = req.getParameter("order"); - Comparator comparator = COMPARATORS.get(key); - if (comparator != null && order.equals("ascending")) - comparator = comparator.reversed(); + Comparator comparator = RESULT_COMPARATORS.get(key, order); List wrapped = browse.getResults().stream().map(event -> { return new Result(event, downloadManager.isDownloading(event.getInfohash())); @@ -226,10 +234,29 @@ public class BrowseServlet extends HttpServlet { return Boolean.compare(k.downloading, v.downloading); }; - private static final Map> COMPARATORS = new HashMap<>(); + private static final ColumnComparators RESULT_COMPARATORS = new ColumnComparators<>(); static { - COMPARATORS.put("Name", BY_NAME); - COMPARATORS.put("Size", BY_SIZE); - COMPARATORS.put("Download", BY_DOWNLOADING); + RESULT_COMPARATORS.add("Name", BY_NAME); + RESULT_COMPARATORS.add("Size", BY_SIZE); + RESULT_COMPARATORS.add("Download", BY_DOWNLOADING); + } + + private static final Comparator BY_HOST = (k, v) -> { + return k.getHost().getHumanReadableName().compareTo(v.getHost().getHumanReadableName()); + }; + + private static final Comparator BY_STATUS = (k, v) -> { + return k.getStatus().toString().compareTo(v.getStatus().toString()); + }; + + private static final Comparator BY_RESULTS = (k, v) -> { + return Integer.compare(k.getResults().size(), v.getResults().size()); + }; + + private static final ColumnComparators BROWSE_COMPARATORS = new ColumnComparators<>(); + static { + BROWSE_COMPARATORS.add("Host", BY_HOST); + BROWSE_COMPARATORS.add("Status", BY_STATUS); + BROWSE_COMPARATORS.add("Results", BY_RESULTS); } } diff --git a/webui/src/main/java/com/muwire/webui/ColumnComparators.java b/webui/src/main/java/com/muwire/webui/ColumnComparators.java new file mode 100644 index 00000000..badfc6f8 --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/ColumnComparators.java @@ -0,0 +1,22 @@ +package com.muwire.webui; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +public class ColumnComparators { + + private final Map> comparators = new HashMap<>(); + + void add(String key, Comparator comparator) { + comparators.put(key, comparator); + } + + Comparator get(String key, String order) { + Comparator rv = comparators.get(key); + if (rv != null && order.equals("ascending")) + rv = rv.reversed(); + return rv; + } + +} diff --git a/webui/src/main/js/browse.js b/webui/src/main/js/browse.js index 27ab0063..0ecb11c1 100644 --- a/webui/src/main/js/browse.js +++ b/webui/src/main/js/browse.js @@ -52,6 +52,8 @@ function initBrowse() { var currentHost = null var browsesByHost = new Map() var resultsByInfoHash = new Map() +var browseKey = null +var browseOrder = null function showCertificates(hostB64, infoHash) { var fetch = new CertificateFetch(hostB64, infoHash) @@ -94,11 +96,14 @@ function refreshActive() { xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { + browsesByHost.clear() + var currentBrowse = null if (currentHost != null) currentBrowse = browsesByHost.get(currentHost) var xmlDoc = this.responseXML + var activeBrowses = [] var browses = xmlDoc.getElementsByTagName("Browse") var i for (i = 0;i < browses.length; i++) { @@ -111,25 +116,31 @@ function refreshActive() { var browse = new Browse(host, hostB64, status, totalResults, count, revision) browsesByHost.set(host, browse) + activeBrowses.push(browse) } - var tableHtml = ""; - for (var [host, browse] of browsesByHost) { + var newBrowseOrder + if (browseOrder == "descending") + newBrowseOrder = "ascending" + else + newBrowseOrder = "descending" + var table = new Table(["Host", "Status", "Results"], "sortActive", browseKey, newBrowseOrder) + for (i = 0;i < activeBrowses.length; i++) { + var browse = activeBrowses[i] var browseLink = browse.getBrowseLink() - tableHtml += "" - tableHtml += "" - tableHtml += "" + var mapping = new Map() + mapping.set("Host", browseLink) + mapping.set("Status", browse.status) var percent = browse.receivedResults + "/" + browse.totalResults - tableHtml += "" + mapping.set("Results", percent) - tableHtml += "" + table.addRow(mapping) } - tableHtml += "
" + _t("Host") + "" + _t("Status") + "" + _t("Results") + "
" + browseLink + "" + browse.status + ""+percent+"
" var tableDiv = document.getElementById("activeBrowses") - tableDiv.innerHTML = tableHtml + tableDiv.innerHTML = table.render() if (currentBrowse != null) { var newBrowse = browsesByHost.get(currentHost) @@ -138,7 +149,8 @@ function refreshActive() { } } } - xmlhttp.open("GET", "/MuWire/Browse?section=status", true) + var params = "section=status&key=" + browseKey + "&order=" + browseOrder + xmlhttp.open("GET", "/MuWire/Browse?" + params, true) xmlhttp.send() } @@ -221,6 +233,12 @@ function sort(key, descending) { showResults(currentHost, key, descending) } +function sortActive(key, order) { + browseKey = key + browseOrder = order + refreshActive() +} + function getDownloadLink(host, infoHash) { return "" + _t("Download") + "" }