servlet side of uploader page
This commit is contained in:
@ -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());
|
||||
}
|
||||
|
71
webui/src/main/java/com/muwire/webui/UploadManager.java
Normal file
71
webui/src/main/java/com/muwire/webui/UploadManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
117
webui/src/main/java/com/muwire/webui/UploadServlet.java
Normal file
117
webui/src/main/java/com/muwire/webui/UploadServlet.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -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";
|
||||
|
Reference in New Issue
Block a user