servlet side of uploader page

This commit is contained in:
Zlatin Balevsky
2019-12-15 02:45:14 +00:00
parent 8efd9c2c88
commit daa9e0bafc
4 changed files with 196 additions and 0 deletions

View File

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

View File

@ -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<UploaderWrapper> uploads = new CopyOnWriteArrayList<>();
public UploadManager(Core core) {
this.core = core;
}
public List<UploaderWrapper> 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;
}
}
}

View File

@ -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<UploadEntry> 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("<?xml version='1.0' encoding='UTF-8'?>");
sb.append("<Uploads>");
entries.forEach(e -> e.toXML(sb));
sb.append("</Uploads>");
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("<Upload>");
sb.append("<Name>").append(Util.escapeHTMLinXML(name)).append("</Name>");
sb.append("<Progress>").append(Util._t("{0}% of piece", String.valueOf(progress))).append("</Progress>");
sb.append("<Downloader>").append(Util.escapeHTMLinXML(downloader)).append("</Downloader>");
sb.append("<RemotePieces>").append(remotePieces).append("/").append(totalPieces).append("</RemotePieces>");
sb.append("<Speed>").append(DataHelper.formatSize2Decimal(speed, false)).append("B/sec").append("</Speed>");
sb.append("</Upload>");
}
}
private static final Comparator<UploadEntry> BY_NAME = (l, r) -> {
return Collator.getInstance().compare(l.name, r.name);
};
private static final Comparator<UploadEntry> BY_PROGRESS = (l, r) -> {
return Integer.compare(l.progress, r.progress);
};
private static final Comparator<UploadEntry> BY_DOWNLOADER = (l, r) -> {
return Collator.getInstance().compare(l.downloader, r.downloader);
};
private static final Comparator<UploadEntry> 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<UploadEntry> BY_SPEED = (l, r) -> {
return Integer.compare(l.speed, r.speed);
};
private static final ColumnComparators<UploadEntry> 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);
}
}

View File

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