sortable certificate table, add extra parameter to Table object

This commit is contained in:
Zlatin Balevsky
2019-12-13 11:27:29 +00:00
parent e075bfac55
commit 570616951a
8 changed files with 148 additions and 56 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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