From 62ab957892fc4bf7618e8b64535a363aff9ed895 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sun, 15 Dec 2019 08:57:14 +0000 Subject: [PATCH] clear finished uploads link --- .../java/com/muwire/webui/UploadManager.java | 35 ++++++++++++++----- .../java/com/muwire/webui/UploadServlet.java | 34 ++++++++++++------ webui/src/main/js/upload.js | 21 ++++++++++- webui/src/main/webapp/Uploads.jsp | 1 + 4 files changed, 71 insertions(+), 20 deletions(-) diff --git a/webui/src/main/java/com/muwire/webui/UploadManager.java b/webui/src/main/java/com/muwire/webui/UploadManager.java index 6ee3b770..f1a4b35a 100644 --- a/webui/src/main/java/com/muwire/webui/UploadManager.java +++ b/webui/src/main/java/com/muwire/webui/UploadManager.java @@ -1,5 +1,8 @@ package com.muwire.webui; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -11,7 +14,7 @@ import com.muwire.core.upload.Uploader; public class UploadManager { private final Core core; - private final List uploads = new CopyOnWriteArrayList<>(); + private final List uploads = Collections.synchronizedList(new ArrayList<>()); public UploadManager(Core core) { this.core = core; @@ -23,10 +26,12 @@ public class UploadManager { public void onUploadEvent(UploadEvent e) { UploaderWrapper wrapper = null; - for(UploaderWrapper uw : uploads) { - if (uw.uploader == e.getUploader()) { - wrapper = uw; - break; + synchronized(uploads) { + for(UploaderWrapper uw : uploads) { + if (uw.uploader == e.getUploader()) { + wrapper = uw; + break; + } } } if (wrapper != null) { @@ -42,15 +47,27 @@ public class UploadManager { public void onUploadFinishedEvent(UploadFinishedEvent e) { UploaderWrapper wrapper = null; - for(UploaderWrapper uw : uploads) { - if (uw.uploader == e.getUploader()) { - wrapper = uw; - break; + synchronized(uploads) { + for(UploaderWrapper uw : uploads) { + if (uw.uploader == e.getUploader()) { + wrapper = uw; + break; + } } } wrapper.finished = true; } + public void clearFinished() { + synchronized(uploads) { + for(Iterator iter = uploads.iterator(); iter.hasNext();) { + UploaderWrapper wrapper = iter.next(); + if (wrapper.finished) + iter.remove(); + } + } + } + public static class UploaderWrapper { private volatile Uploader uploader; private volatile int requests; diff --git a/webui/src/main/java/com/muwire/webui/UploadServlet.java b/webui/src/main/java/com/muwire/webui/UploadServlet.java index b6bd3f83..c990517a 100644 --- a/webui/src/main/java/com/muwire/webui/UploadServlet.java +++ b/webui/src/main/java/com/muwire/webui/UploadServlet.java @@ -21,16 +21,18 @@ public class UploadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List entries = new ArrayList<>(); - for(UploadManager.UploaderWrapper wrapper : uploadManager.getUploads()) { - UploadEntry entry = new UploadEntry( - wrapper.getUploader().getName(), - wrapper.getUploader().getProgress(), - wrapper.getUploader().getDownloader(), - wrapper.getUploader().getDonePieces(), - wrapper.getUploader().getTotalPieces(), - wrapper.getUploader().speed() - ); - entries.add(entry); + synchronized(uploadManager.getUploads()) { + for(UploadManager.UploaderWrapper wrapper : uploadManager.getUploads()) { + UploadEntry entry = new UploadEntry( + wrapper.getUploader().getName(), + wrapper.getUploader().getProgress(), + wrapper.getUploader().getDownloader(), + wrapper.getUploader().getDonePieces(), + wrapper.getUploader().getTotalPieces(), + wrapper.getUploader().speed() + ); + entries.add(entry); + } } COMPARATORS.sort(entries, req); @@ -55,6 +57,18 @@ public class UploadServlet extends HttpServlet { uploadManager = (UploadManager) config.getServletContext().getAttribute("uploadManager"); } + + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String action = req.getParameter("action"); + if (action.equals("clear")) { + uploadManager.clearFinished(); + } + } + + + private static class UploadEntry { private final String name; private final int progress; diff --git a/webui/src/main/js/upload.js b/webui/src/main/js/upload.js index 3a9dad58..6af722e3 100644 --- a/webui/src/main/js/upload.js +++ b/webui/src/main/js/upload.js @@ -44,8 +44,15 @@ function refreshUploads() { } var uploadsDiv = document.getElementById("uploads"); - if (uploaderList.length > 0) + var clearDiv = document.getElementById("clearFinished") + if (uploaderList.length > 0) { uploadsDiv.innerHTML = table.render(); + var clearLink = new Link(_t("Clear Finished"), "clear", ["ignored"]) + clearDiv.innerHTML = clearLink.render() + } else { + uploadsDiv.innerHTML = "" + clearDiv.innerHTML = "" + } } } var sortParam = "key=" + uploadsSortKey + "&order=" + uploadsSortOrder @@ -53,6 +60,18 @@ function refreshUploads() { xmlhttp.send(); } +function clear(ignored) { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + refreshUploads() + } + } + xmlhttp.open("POST", "/MuWire/Upload") + xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xmlhttp.send(encodeURI("action=clear")); +} + var uploadsSortKey var uploadsSortOrder diff --git a/webui/src/main/webapp/Uploads.jsp b/webui/src/main/webapp/Uploads.jsp index 3ca663cb..aa8cae8c 100644 --- a/webui/src/main/webapp/Uploads.jsp +++ b/webui/src/main/webapp/Uploads.jsp @@ -30,6 +30,7 @@
+