From ce293cbda8c343808788d2a39c82a696a0ef4457 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 17 Dec 2019 15:28:49 +0000 Subject: [PATCH] sort file tree servlet side --- .../java/com/muwire/webui/FilesServlet.java | 87 +++++++++++++------ 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/webui/src/main/java/com/muwire/webui/FilesServlet.java b/webui/src/main/java/com/muwire/webui/FilesServlet.java index d25625b8..5f037fd9 100644 --- a/webui/src/main/java/com/muwire/webui/FilesServlet.java +++ b/webui/src/main/java/com/muwire/webui/FilesServlet.java @@ -7,6 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.Collator; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -52,7 +53,7 @@ public class FilesServlet extends HttpServlet { sb.append(""); sb.append("").append(fileManager.getRevision()).append(""); - ListCallback cb = new ListCallback(sb); + ListCallback cb = new ListCallback(); String encodedPath = req.getParameter("path"); File current = null; if (encodedPath != null && encodedPath.length() > 0) { @@ -72,6 +73,14 @@ public class FilesServlet extends HttpServlet { } } fileManager.list(current, cb); + + Comparator comparator = (l, r) -> { + return Collator.getInstance().compare(l.file.getName(), r.file.getName()); + }; + + Collections.sort(cb.treeEntries, comparator); + + cb.treeEntries.forEach(e -> e.toXML(sb)); sb.append(""); } else if (section.equals("fileTable")) { @@ -113,39 +122,17 @@ public class FilesServlet extends HttpServlet { } private class ListCallback implements FileListCallback { - private final StringBuilder sb; - ListCallback(StringBuilder sb) { - this.sb = sb; - } + private final List treeEntries = new ArrayList<>(); + @Override public void onFile(File f, SharedFile value) { - sharedFileToXML(value, sb, core.getCertificateManager()); + treeEntries.add(new FileTreeEntry(f, value)); } @Override public void onDirectory(File f) { - String name = f.getName().isEmpty() ? f.toString() : f.getName(); - boolean shared = core.getMuOptions().getWatchedDirectories().contains(f.getAbsolutePath()); - sb.append(""); - sb.append("").append(Util.escapeHTMLinXML(name)).append(""); - sb.append("").append(shared).append(""); - sb.append(""); + treeEntries.add(new DirectoryTreeEntry(f)); } } - - private static void sharedFileToXML(SharedFile sf, StringBuilder sb, CertificateManager certificateManager) { - sb.append(""); - sb.append("").append(Util.escapeHTMLinXML(sf.getFile().getName())).append(""); - sb.append("").append(Util.escapeHTMLinXML(sf.getCachedPath())).append(""); - sb.append("").append(DataHelper.formatSize2Decimal(sf.getCachedLength())).append("B").append(""); - sb.append("").append(Base64.encode(sf.getInfoHash().getRoot())).append(""); - if (sf.getComment() != null) { - String comment = DataUtil.readi18nString(Base64.decode(sf.getComment())); - sb.append("").append(Util.escapeHTMLinXML(comment)).append(""); - } - sb.append("").append(certificateManager.hasLocalCertificate(sf.getInfoHash())).append(""); - // TODO: other stuff - sb.append(""); - } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { @@ -237,4 +224,50 @@ public class FilesServlet extends HttpServlet { COMPARATORS.add("Size", BY_SIZE); } + private abstract class TreeEntry { + protected final File file; + TreeEntry(File file) { + this.file = file; + } + + abstract void toXML(StringBuilder sb); + } + + private class DirectoryTreeEntry extends TreeEntry { + DirectoryTreeEntry(File file) { + super(file); + } + + void toXML(StringBuilder sb) { + String name = file.getName().isEmpty() ? file.toString() : file.getName(); + boolean shared = core.getMuOptions().getWatchedDirectories().contains(file.getAbsolutePath()); + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(name)).append(""); + sb.append("").append(shared).append(""); + sb.append(""); + } + } + + private class FileTreeEntry extends TreeEntry { + private SharedFile sf; + FileTreeEntry(File file, SharedFile sf) { + super(file); + this.sf = sf; + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(sf.getFile().getName())).append(""); + sb.append("").append(Util.escapeHTMLinXML(sf.getCachedPath())).append(""); + sb.append("").append(DataHelper.formatSize2Decimal(sf.getCachedLength())).append("B").append(""); + sb.append("").append(Base64.encode(sf.getInfoHash().getRoot())).append(""); + if (sf.getComment() != null) { + String comment = DataUtil.readi18nString(Base64.decode(sf.getComment())); + sb.append("").append(Util.escapeHTMLinXML(comment)).append(""); + } + sb.append("").append(core.getCertificateManager().hasLocalCertificate(sf.getInfoHash())).append(""); + // TODO: other stuff + sb.append(""); + } + } }