From daa9e0bafce9d34163db5aa038f3df4a21fa1ce3 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sun, 15 Dec 2019 02:45:14 +0000 Subject: [PATCH] servlet side of uploader page --- .../java/com/muwire/webui/MuWireClient.java | 7 ++ .../java/com/muwire/webui/UploadManager.java | 71 +++++++++++ .../java/com/muwire/webui/UploadServlet.java | 117 ++++++++++++++++++ .../src/main/java/com/muwire/webui/Util.java | 1 + 4 files changed, 196 insertions(+) create mode 100644 webui/src/main/java/com/muwire/webui/UploadManager.java create mode 100644 webui/src/main/java/com/muwire/webui/UploadServlet.java diff --git a/webui/src/main/java/com/muwire/webui/MuWireClient.java b/webui/src/main/java/com/muwire/webui/MuWireClient.java index 9727bf82..e361084d 100644 --- a/webui/src/main/java/com/muwire/webui/MuWireClient.java +++ b/webui/src/main/java/com/muwire/webui/MuWireClient.java @@ -35,6 +35,8 @@ import com.muwire.core.search.UIResultBatchEvent; import com.muwire.core.search.UIResultEvent; import com.muwire.core.trust.TrustEvent; import com.muwire.core.trust.TrustSubscriptionEvent; +import com.muwire.core.upload.UploadEvent; +import com.muwire.core.upload.UploadFinishedEvent; import net.i2p.app.ClientAppManager; import net.i2p.app.ClientAppState; @@ -154,6 +156,10 @@ public class MuWireClient { core.getEventBus().register(CertificateFetchedEvent.class, certificateManager); core.getEventBus().register(CertificateFetchEvent.class, certificateManager); + UploadManager uploadManager = new UploadManager(core); + core.getEventBus().register(UploadEvent.class, uploadManager); + core.getEventBus().register(UploadFinishedEvent.class, uploadManager); + servletContext.setAttribute("searchManager", searchManager); servletContext.setAttribute("downloadManager", downloadManager); servletContext.setAttribute("connectionCounter", connectionCounter); @@ -161,6 +167,7 @@ public class MuWireClient { servletContext.setAttribute("browseManager", browseManager); servletContext.setAttribute("trustManager", trustManager); servletContext.setAttribute("certificateManager", certificateManager); + servletContext.setAttribute("uploadManager", uploadManager); core.getEventBus().publish(new UILoadedEvent()); } diff --git a/webui/src/main/java/com/muwire/webui/UploadManager.java b/webui/src/main/java/com/muwire/webui/UploadManager.java new file mode 100644 index 00000000..6ee3b770 --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/UploadManager.java @@ -0,0 +1,71 @@ +package com.muwire.webui; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import com.muwire.core.Core; +import com.muwire.core.upload.UploadEvent; +import com.muwire.core.upload.UploadFinishedEvent; +import com.muwire.core.upload.Uploader; + +public class UploadManager { + + private final Core core; + private final List uploads = new CopyOnWriteArrayList<>(); + + public UploadManager(Core core) { + this.core = core; + } + + public List getUploads() { + return uploads; + } + + public void onUploadEvent(UploadEvent e) { + UploaderWrapper wrapper = null; + for(UploaderWrapper uw : uploads) { + if (uw.uploader == e.getUploader()) { + wrapper = uw; + break; + } + } + if (wrapper != null) { + wrapper.uploader = e.getUploader(); + wrapper.requests++; + wrapper.finished = false; + } else { + wrapper = new UploaderWrapper(); + wrapper.uploader = e.getUploader(); + uploads.add(wrapper); + } + } + + public void onUploadFinishedEvent(UploadFinishedEvent e) { + UploaderWrapper wrapper = null; + for(UploaderWrapper uw : uploads) { + if (uw.uploader == e.getUploader()) { + wrapper = uw; + break; + } + } + wrapper.finished = true; + } + + public static class UploaderWrapper { + private volatile Uploader uploader; + private volatile int requests; + private volatile boolean finished; + + public Uploader getUploader() { + return uploader; + } + + public int getRequests() { + return requests; + } + + public boolean isFinished() { + return finished; + } + } +} diff --git a/webui/src/main/java/com/muwire/webui/UploadServlet.java b/webui/src/main/java/com/muwire/webui/UploadServlet.java new file mode 100644 index 00000000..53c2ba63 --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/UploadServlet.java @@ -0,0 +1,117 @@ +package com.muwire.webui; + +import java.io.IOException; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.i2p.data.DataHelper; + +public class UploadServlet extends HttpServlet { + + private UploadManager uploadManager; + + @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); + } + COMPARATORS.sort(entries, req); + + StringBuilder sb = new StringBuilder(); + sb.append(""); + sb.append(""); + entries.forEach(e -> e.toXML(sb)); + sb.append(""); + + resp.setContentType("text/xml"); + resp.setCharacterEncoding("UTF-8"); + resp.setDateHeader("Expires", 0); + resp.setHeader("Pragma", "no-cache"); + resp.setHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + byte[] out = sb.toString().getBytes("UTF-8"); + resp.setContentLength(out.length); + resp.getOutputStream().write(out); + } + + @Override + public void init(ServletConfig config) throws ServletException { + uploadManager = (UploadManager) config.getServletContext().getAttribute("uploadManager"); + } + + private static class UploadEntry { + private final String name; + private final int progress; + private final String downloader; + private final int remotePieces; + private final int totalPieces; + private final int speed; + + UploadEntry(String name, int progress, String downloader, int remotePieces, int totalPieces, int speed) { + this.name = name; + this.progress = progress; + this.downloader = downloader; + this.remotePieces = remotePieces; + this.totalPieces = totalPieces; + this.speed = speed; + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(name)).append(""); + sb.append("").append(Util._t("{0}% of piece", String.valueOf(progress))).append(""); + sb.append("").append(Util.escapeHTMLinXML(downloader)).append(""); + sb.append("").append(remotePieces).append("/").append(totalPieces).append(""); + sb.append("").append(DataHelper.formatSize2Decimal(speed, false)).append("B/sec").append(""); + sb.append(""); + } + } + + private static final Comparator BY_NAME = (l, r) -> { + return Collator.getInstance().compare(l.name, r.name); + }; + + private static final Comparator BY_PROGRESS = (l, r) -> { + return Integer.compare(l.progress, r.progress); + }; + + private static final Comparator BY_DOWNLOADER = (l, r) -> { + return Collator.getInstance().compare(l.downloader, r.downloader); + }; + + private static final Comparator BY_REMOTE_PIECES = (l, r) -> { + float lrp = l.remotePieces * 1f / l.totalPieces; + float rrp = r.remotePieces * 1f / r.totalPieces; + return Float.compare(lrp, rrp); + }; + + private static final Comparator BY_SPEED = (l, r) -> { + return Integer.compare(l.speed, r.speed); + }; + + private static final ColumnComparators COMPARATORS = new ColumnComparators<>(); + static { + COMPARATORS.add("Name", BY_NAME); + COMPARATORS.add("Progress", BY_PROGRESS); + COMPARATORS.add("Downloader", BY_DOWNLOADER); + COMPARATORS.add("Remote Pieces", BY_REMOTE_PIECES); + COMPARATORS.add("Speed", BY_SPEED); + } + +} diff --git a/webui/src/main/java/com/muwire/webui/Util.java b/webui/src/main/java/com/muwire/webui/Util.java index 5b05917d..42962c44 100644 --- a/webui/src/main/java/com/muwire/webui/Util.java +++ b/webui/src/main/java/com/muwire/webui/Util.java @@ -99,6 +99,7 @@ public class Util { _x("User"), _x("View {0} Certificates"), _x("Your Trust"), + _x("{0}% of piece") }; private static final String BUNDLE_NAME = "com.muwire.webui.messages";