sortable certificate table, add extra parameter to Table object
This commit is contained in:
@@ -3,6 +3,9 @@ package com.muwire.webui;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletException;
|
||||
@@ -50,23 +53,29 @@ public class CertificateServlet extends HttpServlet {
|
||||
return;
|
||||
}
|
||||
|
||||
List<CertificateEntry> entries = new ArrayList<>();
|
||||
for(Certificate certificate : request.getCertificates()) {
|
||||
String comment = certificate.getComment() != null ? certificate.getComment().getName() : null;
|
||||
CertificateEntry entry = new CertificateEntry(
|
||||
certificate.getIssuer(),
|
||||
certificate.toBase64(),
|
||||
certificate.getName().getName(),
|
||||
certificate.getTimestamp(),
|
||||
comment,
|
||||
core.getCertificateManager().isImported(certificate));
|
||||
entries.add(entry);
|
||||
}
|
||||
|
||||
COMPARATORS.sort(entries, req);
|
||||
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<?xml version='1.0' encoding='UTF-8'?>");
|
||||
sb.append("<CertificateRequest>");
|
||||
sb.append("<Status>").append(request.getStatus().toString()).append("</Status>");
|
||||
sb.append("<Total>").append(request.totalCertificates()).append("</Total>");
|
||||
sb.append("<Certificates>");
|
||||
for (Certificate certificate : request.getCertificates()) {
|
||||
sb.append("<Certificate>");
|
||||
sb.append("<Issuer>").append(certificate.getIssuer().getHumanReadableName()).append("</Issuer>");
|
||||
sb.append("<Name>").append(Util.escapeHTMLinXML(certificate.getName().getName())).append("</Name>");
|
||||
if (certificate.getComment() != null)
|
||||
sb.append("<Comment>").append(Util.escapeHTMLinXML(certificate.getComment().getName())).append("</Comment>");
|
||||
sb.append("<Timestamp>").append(DataHelper.formatTime(certificate.getTimestamp())).append("</Timestamp>");
|
||||
sb.append("<Base64>").append(certificate.toBase64()).append("</Base64>");
|
||||
sb.append("<Imported>").append(core.getCertificateManager().isImported(certificate)).append("</Imported>");
|
||||
sb.append("</Certificate>");
|
||||
}
|
||||
entries.forEach(entry -> entry.toXML(sb));
|
||||
sb.append("</Certificates>");
|
||||
sb.append("</CertificateRequest>");
|
||||
|
||||
@@ -135,6 +144,57 @@ public class CertificateServlet extends HttpServlet {
|
||||
core = (Core) config.getServletContext().getAttribute("core");
|
||||
}
|
||||
|
||||
|
||||
private static class CertificateEntry {
|
||||
private final Persona persona;
|
||||
private final String b64;
|
||||
private final String name;
|
||||
private final long timestamp;
|
||||
private final String comment;
|
||||
private final boolean imported;
|
||||
|
||||
CertificateEntry(Persona persona, String b64, String name, long timestamp, String comment, boolean imported) {
|
||||
this.persona = persona;
|
||||
this.b64 = b64;
|
||||
this.name = name;
|
||||
this.timestamp = timestamp;
|
||||
this.comment = comment;
|
||||
this.imported = imported;
|
||||
}
|
||||
|
||||
void toXML(StringBuilder sb) {
|
||||
sb.append("<Certificate>");
|
||||
sb.append("<Issuer>").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append("</Issuer>");
|
||||
sb.append("<Name>").append(Util.escapeHTMLinXML(name)).append("</Name>");
|
||||
if (comment != null)
|
||||
sb.append("<Comment>").append(Util.escapeHTMLinXML(comment)).append("</Comment>");
|
||||
sb.append("<Base64>").append(b64).append("</Base64>");
|
||||
sb.append("<Timestamp>").append(DataHelper.formatTime(timestamp)).append("</Timestamp>");
|
||||
sb.append("<Imported>").append(imported).append("</Imported>");
|
||||
sb.append("</Certificate>");
|
||||
}
|
||||
}
|
||||
|
||||
private static final Comparator<CertificateEntry> BY_ISSUER = (l, r) -> {
|
||||
return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName());
|
||||
};
|
||||
|
||||
private static final Comparator<CertificateEntry> BY_NAME = (l, r) -> {
|
||||
return l.name.compareTo(r.name);
|
||||
};
|
||||
|
||||
private static final Comparator<CertificateEntry> BY_TIMESTAMP = (l, r) -> {
|
||||
return Long.compare(l.timestamp, r.timestamp);
|
||||
};
|
||||
|
||||
private static final Comparator<CertificateEntry> BY_IMPORTED = (l, r) -> {
|
||||
return Boolean.compare(l.imported, r.imported);
|
||||
};
|
||||
|
||||
private static final ColumnComparators<CertificateEntry> COMPARATORS = new ColumnComparators<>();
|
||||
static {
|
||||
COMPARATORS.add("Issuer", BY_ISSUER);
|
||||
COMPARATORS.add("Name", BY_NAME);
|
||||
COMPARATORS.add("Timestamp", BY_TIMESTAMP);
|
||||
COMPARATORS.add("Import", BY_IMPORTED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
var certificateFetches = new Map()
|
||||
var expandedCertificateComments = new Map()
|
||||
var sortParams = new Map()
|
||||
|
||||
class SortParams {
|
||||
constructor(key, order) {
|
||||
this.key = key
|
||||
this.order = order
|
||||
}
|
||||
}
|
||||
|
||||
class Certificate {
|
||||
constructor(xmlNode, divId) {
|
||||
@@ -15,6 +23,18 @@ class Certificate {
|
||||
this.imported = xmlNode.getElementsByTagName("Imported")[0].childNodes[0].nodeValue
|
||||
}
|
||||
|
||||
getMapping() {
|
||||
var mapping = new Map()
|
||||
mapping.set("Issuer", this.issuer + this.getViewCommentBlock())
|
||||
mapping.set("Name", this.name)
|
||||
mapping.set("Timestamp", this.timestamp)
|
||||
if (this.imported == "true")
|
||||
mapping.set("Import", _t("Imported"))
|
||||
else
|
||||
mapping.set("Import", this.getImportLink())
|
||||
return mapping
|
||||
}
|
||||
|
||||
getViewCommentBlock() {
|
||||
if (this.comment == null)
|
||||
return ""
|
||||
@@ -42,25 +62,6 @@ class Certificate {
|
||||
var link = "<a href='#' onclick='window.importCertificate(\"" + this.base64 + "\"); return false;'>" + linkText + "</a>"
|
||||
return link
|
||||
}
|
||||
|
||||
renderRow() {
|
||||
var commentPresent = "false"
|
||||
if (this.comment != null)
|
||||
commentPresent = "true"
|
||||
|
||||
var html = "<tr>"
|
||||
html += "<td>" + this.issuer + this.getViewCommentBlock() + "</td>"
|
||||
html += "<td>" + this.name + "</td>"
|
||||
html += "<td>" + this.timestamp + "</td>"
|
||||
|
||||
if (this.imported == "true")
|
||||
html += "<td>" + _t("Imported") + "</td>"
|
||||
else
|
||||
html += "<td>" + this.getImportLink() + "</td>"
|
||||
|
||||
html += "</tr>"
|
||||
return html
|
||||
}
|
||||
}
|
||||
|
||||
class CertificateResponse {
|
||||
@@ -85,17 +86,28 @@ class CertificateResponse {
|
||||
if (this.certificates.length == 0)
|
||||
return html
|
||||
|
||||
var params = sortParams.get(this.divId)
|
||||
if (params == null) {
|
||||
params = new SortParams(null, null)
|
||||
sortParams.set(this.divId, params)
|
||||
}
|
||||
|
||||
var newOrder
|
||||
if (params.order == "descending")
|
||||
newOrder = "ascending"
|
||||
else if (params.order == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Issuer", "Name", "Timestamp", "Import"], "sort", params.key, newOrder, this.divId)
|
||||
|
||||
var i
|
||||
for (i = 0; i < this.certificates.length; i++) {
|
||||
table.addRow(this.certificates[i].getMapping())
|
||||
}
|
||||
|
||||
html += " "
|
||||
html += _t("Certificates") + " " + this.certificates.length + "/" + this.total
|
||||
|
||||
var headers = [_t("Issuer"), _t("Name"), _t("Timestamp"), _t("Import")]
|
||||
html += "<br/>"
|
||||
html += "<table><thead><tr><th>" + headers.join("</th><th>") + "</th></thead><tbody>"
|
||||
var i
|
||||
for(i = 0; i < this.certificates.length; i++) {
|
||||
html += this.certificates[i].renderRow()
|
||||
}
|
||||
html += "</tbody></table>"
|
||||
html += table.render()
|
||||
|
||||
return html
|
||||
}
|
||||
@@ -126,11 +138,23 @@ class CertificateFetch {
|
||||
block.innerHTML = fetch.lastResponse.renderTable()
|
||||
}
|
||||
}
|
||||
xmlhttp.open("GET", "/MuWire/Certificate?user=" + this.senderB64 + "&infoHash=" + this.fileInfoHash, true)
|
||||
var queryParams = ""
|
||||
var params = sortParams.get(this.divId)
|
||||
if (params != null) {
|
||||
queryParams = "&key=" + params.key + "&order=" + params.order
|
||||
}
|
||||
xmlhttp.open("GET", "/MuWire/Certificate?user=" + this.senderB64 + "&infoHash=" + this.fileInfoHash + queryParams, true)
|
||||
xmlhttp.send()
|
||||
}
|
||||
}
|
||||
|
||||
function sort(key, order, id) {
|
||||
var params = sortParams.get(id)
|
||||
params.key = key
|
||||
params.order = order
|
||||
refreshCertificates()
|
||||
}
|
||||
|
||||
function importCertificate(b64) {
|
||||
var xmlhttp = new XMLHttpRequest()
|
||||
xmlhttp.onreadystatechange = function() {
|
||||
|
||||
@@ -78,7 +78,7 @@ function refreshDownloader() {
|
||||
newOrder = "ascending"
|
||||
else if (downloadsSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Name","State","Speed","ETA","Progress","Cancel"], "sortDownloads", downloadsSortKey, newOrder)
|
||||
var table = new Table(["Name","State","Speed","ETA","Progress","Cancel"], "sortDownloads", downloadsSortKey, newOrder, null)
|
||||
|
||||
for(i = 0; i < downloaderList.length; i++) {
|
||||
table.addRow(downloaderList[i].getMapping())
|
||||
|
||||
@@ -95,7 +95,7 @@ function refreshTable() {
|
||||
newOrder = "ascending"
|
||||
else if (sortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["File","Size"], "sort", sortKey, newOrder)
|
||||
var table = new Table(["File","Size"], "sort", sortKey, newOrder, null)
|
||||
|
||||
for (i = 0; i < filesList.length; i++) {
|
||||
table.addRow(filesList[i].getMapping())
|
||||
|
||||
@@ -93,7 +93,7 @@ class Senders {
|
||||
newOrder = "ascending"
|
||||
else if (sendersSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Sender", "Browse", "Results", "Trust"], "sortSendersTable", sendersSortKey, newOrder)
|
||||
var table = new Table(["Sender", "Browse", "Results", "Trust"], "sortSendersTable", sendersSortKey, newOrder, null)
|
||||
var i
|
||||
for (i = 0; i < this.senders.length; i++) {
|
||||
table.addRow(this.senders[i].getMapping())
|
||||
@@ -191,7 +191,7 @@ class ResultsFromSender {
|
||||
newOrder = "ascending"
|
||||
else if (resultsFromSenderSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Name","Size","Download"], "sortResultsFromSenderTable", resultsFromSenderSortKey, newOrder)
|
||||
var table = new Table(["Name","Size","Download"], "sortResultsFromSenderTable", resultsFromSenderSortKey, newOrder, null)
|
||||
var i
|
||||
for (i = 0 ; i < this.resultsFromSender.length; i++) {
|
||||
table.addRow(this.resultsFromSender[i].getMapping())
|
||||
@@ -247,7 +247,7 @@ class Results {
|
||||
newOrder = "ascending"
|
||||
else if (resultsSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Name","Size","Download"], "sortResultsTable", resultsSortKey, newOrder)
|
||||
var table = new Table(["Name","Size","Download"], "sortResultsTable", resultsSortKey, newOrder, null)
|
||||
var i
|
||||
for (i = 0; i < this.results.length; i++) {
|
||||
table.addRow(this.results[i].getMapping())
|
||||
@@ -375,7 +375,7 @@ class SendersForResult {
|
||||
newOrder = "ascending"
|
||||
else if (sendersForResultSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Sender", "Browse", "Trust"], "sortSendersForResultTable", sendersForResultSortKey, newOrder)
|
||||
var table = new Table(["Sender", "Browse", "Trust"], "sortSendersForResultTable", sendersForResultSortKey, newOrder, null)
|
||||
var i
|
||||
for (i = 0; i < this.sendersForResult.length; i++) {
|
||||
table.addRow(this.sendersForResult[i].getMapping())
|
||||
@@ -762,7 +762,7 @@ function refreshStatus() {
|
||||
newOrder = "ascending"
|
||||
else
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Query", "Senders", "Results"], "sortStatuses", statusKey, newOrder)
|
||||
var table = new Table(["Query", "Senders", "Results"], "sortStatuses", statusKey, newOrder, null)
|
||||
for (i = 0; i < statuses.length; i++) {
|
||||
var status = statuses[i]
|
||||
|
||||
|
||||
@@ -11,22 +11,30 @@ class Link {
|
||||
}
|
||||
|
||||
class Column {
|
||||
constructor(key) {
|
||||
|
||||
constructor(key, parameter) {
|
||||
this.key = key
|
||||
this.parameter = parameter
|
||||
}
|
||||
|
||||
render(descending, callback) {
|
||||
var html = "<th>"
|
||||
var linkText = _t(this.key)
|
||||
var link = new Link(linkText, callback, [this.key, descending])
|
||||
var parameters
|
||||
if (this.parameter == null)
|
||||
parameters = [this.key, descending]
|
||||
else
|
||||
parameters = [this.key, descending, this.parameter]
|
||||
var link = new Link(linkText, callback, parameters)
|
||||
html += link.render() + "</th>"
|
||||
return html
|
||||
}
|
||||
}
|
||||
|
||||
class Table {
|
||||
constructor(columns, callback, key, descending) {
|
||||
this.columns = columns.map(x => new Column(x))
|
||||
|
||||
constructor(columns, callback, key, descending, parameter) {
|
||||
this.columns = columns.map(x => new Column(x, parameter))
|
||||
this.callback = callback
|
||||
this.rows = []
|
||||
this.key = key
|
||||
|
||||
@@ -224,7 +224,7 @@ function displayTrustedList(user) {
|
||||
else if (trustedSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
|
||||
var table = new Table(["User", "Reason", "Your Trust"], "sortTrustedList", trustedSortKey, newOrder)
|
||||
var table = new Table(["User", "Reason", "Your Trust"], "sortTrustedList", trustedSortKey, newOrder, null)
|
||||
var i
|
||||
for(i = 0; i < trusted.length; i++) {
|
||||
table.addRow(trusted[i].getMapping())
|
||||
@@ -253,7 +253,7 @@ function displayDistrustedList(user) {
|
||||
else if (distrustedSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
|
||||
var table = new Table(["User", "Reason", "Your Trust"], "sortDistrustedList", distrustedSortKey, newOrder)
|
||||
var table = new Table(["User", "Reason", "Your Trust"], "sortDistrustedList", distrustedSortKey, newOrder, null)
|
||||
var i
|
||||
for(i = 0; i < distrusted.length; i++) {
|
||||
table.addRow(distrusted[i].getMapping())
|
||||
@@ -300,7 +300,7 @@ function refreshLists() {
|
||||
newOrder = "ascending"
|
||||
else if (listsSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["Name","Trusted","Distrusted","Status","Last Updated"], "sortSubscriptions", listsSortKey, newOrder)
|
||||
var table = new Table(["Name","Trusted","Distrusted","Status","Last Updated"], "sortSubscriptions", listsSortKey, newOrder, null)
|
||||
|
||||
for (i = 0; i < listOfLists.length; i++) {
|
||||
table.addRow(listOfLists[i].getMapping())
|
||||
|
||||
@@ -184,7 +184,7 @@ function refreshDistrustedUsers() {
|
||||
newOrder = "ascending"
|
||||
else if (distrustedUsersSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["User", "Reason"], "sortDistrustedUsers", distrustedUsersSortKey, newOrder)
|
||||
var table = new Table(["User", "Reason"], "sortDistrustedUsers", distrustedUsersSortKey, newOrder, null)
|
||||
|
||||
for (i = 0; i < distrustedList.length; i++) {
|
||||
table.addRow(distrustedList[i].getMapping(false))
|
||||
@@ -219,7 +219,7 @@ function refreshTrustedUsers() {
|
||||
newOrder = "ascending"
|
||||
else if (trustedUsersSortOrder == "ascending")
|
||||
newOrder = "descending"
|
||||
var table = new Table(["User" , "Reason", "Subscribe"], "sortTrustedUsers", trustedUsersSortKey, newOrder)
|
||||
var table = new Table(["User" , "Reason", "Subscribe"], "sortTrustedUsers", trustedUsersSortKey, newOrder, null)
|
||||
|
||||
for (i = 0; i < trustedList.length; i++) {
|
||||
table.addRow(trustedList[i].getMapping(true))
|
||||
|
||||
Reference in New Issue
Block a user