Author: toad
Date: 2006-04-27 19:40:38 +0000 (Thu, 27 Apr 2006)
New Revision: 8587
Added:
trunk/freenet/src/freenet/clients/http/QueueToadlet.java
trunk/freenet/src/freenet/support/SizeUtil.java
Modified:
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
trunk/freenet/src/freenet/clients/http/PageMaker.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/node/fcp/ClientGet.java
trunk/freenet/src/freenet/node/fcp/ClientPut.java
trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
trunk/freenet/src/freenet/node/fcp/ClientRequest.java
trunk/freenet/src/freenet/node/fcp/FCPClient.java
trunk/freenet/src/freenet/node/fcp/FCPServer.java
trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
Log:
662: Add global queue display page to Fproxy.
At the moment it is read-only.
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-04-27 15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-04-27 19:40:38 UTC (rev 8587)
@@ -167,6 +167,8 @@
private boolean insertedManifest;
private ClientPutState currentMetadataInserterState;
private final String defaultName;
+ private int numberOfFiles;
+ private long totalSize;
private final static String[] defaultDefaultNames =
new String[] { "index.html", "index.htm", "default.html",
"default.htm" };
@@ -232,6 +234,8 @@
}
runningPutHandlers.add(ph);
putHandlersWaitingForMetadata.add(ph);
+ numberOfFiles++;
+ totalSize += data.size();
}
putHandlersByName.put(name, ph);
}
@@ -459,4 +463,12 @@
add(e, after, hm);
}
}
+
+ public int countFiles() {
+ return numberOfFiles;
+ }
+
+ public long totalSize() {
+ return totalSize;
+ }
}
Modified: trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FproxyToadlet.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/FproxyToadlet.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -244,6 +244,9 @@
DarknetConnectionsToadlet darknetToadlet = new
DarknetConnectionsToadlet(node, client);
server.register(darknetToadlet, "/darknet/", true);
+
+ QueueToadlet queueToadlet = new
QueueToadlet(node.getFCPServer(), client);
+ server.register(queueToadlet, "/queue/", true);
} catch (IOException ioe) {
Logger.error(node,"Failed to start fproxy: "+ioe, ioe);
Modified: trunk/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/PageMaker.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/PageMaker.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -82,6 +82,7 @@
+ "<li><a href=\"/plugins/\" title=\"Configure
Plugins\">Plugins</a></li>\n"
+ "<li><a href=\"/config/\" title=\"Configure
your node\">Configuration</a></li>\n"
+ "<li><a href=\"/darknet/\" title=\"Manage
darknet connections\">Darknet</a></li>\n"
+ + "<li><a href=\"/queue/\" title=\"Manage
queued requests\">Queue</a></li>\n"
+ "</ul>\n"
+ "</div>\n");
}
Added: trunk/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/QueueToadlet.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/QueueToadlet.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -0,0 +1,432 @@
+package freenet.clients.http;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import freenet.client.HighLevelSimpleClient;
+import freenet.keys.FreenetURI;
+import freenet.node.fcp.ClientGet;
+import freenet.node.fcp.ClientPut;
+import freenet.node.fcp.ClientPutBase;
+import freenet.node.fcp.ClientPutDir;
+import freenet.node.fcp.ClientRequest;
+import freenet.node.fcp.FCPServer;
+import freenet.support.Fields;
+import freenet.support.HTMLEncoder;
+import freenet.support.Logger;
+import freenet.support.SizeUtil;
+import freenet.support.URLEncoder;
+
+public class QueueToadlet extends Toadlet {
+
+ final FCPServer fcp;
+
+ public QueueToadlet(FCPServer fcp, HighLevelSimpleClient client) {
+ super(client);
+ this.fcp = fcp;
+ if(fcp == null) throw new NullPointerException();
+ }
+
+ public void handleGet(URI uri, ToadletContext ctx)
+ throws ToadletContextClosedException, IOException, RedirectException {
+
+ StringBuffer buf = new StringBuffer(2048);
+
+ ctx.getPageMaker().makeHead(buf, "Queued Requests");
+
+ // First, get the queued requests, and separate them into
different types.
+
+ LinkedList completedDownloadToDisk = new LinkedList();
+ LinkedList completedDownloadToTemp = new LinkedList();
+ LinkedList completedUpload = new LinkedList();
+ LinkedList completedDirUpload = new LinkedList();
+
+ LinkedList failedDownload = new LinkedList();
+ LinkedList failedUpload = new LinkedList();
+ LinkedList failedDirUpload = new LinkedList();
+
+ LinkedList uncompletedDownload = new LinkedList();
+ LinkedList uncompletedUpload = new LinkedList();
+ LinkedList uncompletedDirUpload = new LinkedList();
+
+ ClientRequest[] reqs = fcp.getGlobalRequests();
+ Logger.minor(this, "Request count: "+reqs.length);
+
+ for(int i=0;i<reqs.length;i++) {
+ ClientRequest req = reqs[i];
+ if(req instanceof ClientGet) {
+ ClientGet cg = (ClientGet) req;
+ if(cg.hasSucceeded()) {
+ if(cg.isDirect())
+ completedDownloadToTemp.add(cg);
+ else if(cg.isToDisk())
+ completedDownloadToDisk.add(cg);
+ else
+ // FIXME
+ Logger.error(this, "Don't know
what to do with "+cg);
+ } else if(cg.hasFinished()) {
+ failedDownload.add(cg);
+ } else {
+ uncompletedDownload.add(cg);
+ }
+ } else if(req instanceof ClientPut) {
+ ClientPut cp = (ClientPut) req;
+ if(cp.hasSucceeded()) {
+ completedUpload.add(cp);
+ } else if(cp.hasFinished()) {
+ failedUpload.add(cp);
+ } else {
+ uncompletedUpload.add(cp);
+ }
+ } else if(req instanceof ClientPutDir) {
+ ClientPutDir cp = (ClientPutDir) req;
+ if(cp.hasSucceeded()) {
+ completedDirUpload.add(cp);
+ } else if(cp.hasFinished()) {
+ failedDirUpload.add(cp);
+ } else {
+ uncompletedDirUpload.add(cp);
+ }
+ }
+ }
+
+ if(!(completedDownloadToTemp.isEmpty() &&
completedDownloadToDisk.isEmpty() &&
+ completedUpload.isEmpty() &&
completedDirUpload.isEmpty())) {
+ writeBigHeading("Completed requests", buf);
+
+ if(!completedDownloadToTemp.isEmpty()) {
+ writeTableHead("Completed downloads to
temporary space", new String[] { "Key", "Size", "Type", "Download",
"Persistence", "Identifier" }, buf );
+ for(Iterator i =
completedDownloadToTemp.iterator();i.hasNext();) {
+ ClientGet p = (ClientGet) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getURI(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeDownloadCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!completedDownloadToDisk.isEmpty()) {
+ writeTableHead("Completed downloads to disk",
new String[] { "Key", "Filename", "Size", "Type", "Download", "Persistence",
"Identifier" }, buf);
+ for(Iterator
i=completedDownloadToDisk.iterator();i.hasNext();) {
+ ClientGet p = (ClientGet) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getURI(), buf);
+ writeFilenameCell(p.getDestFilename(),
buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeDownloadCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!completedUpload.isEmpty()) {
+ writeTableHead("Completed uploads", new
String[] { "Key", "Filename", "Size", "Type", "Persistence", "Identifier" },
buf);
+ for(Iterator
i=completedUpload.iterator();i.hasNext();) {
+ ClientPut p = (ClientPut) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ if(p.isDirect())
+ writeDirectCell(buf);
+ else
+
writeFilenameCell(p.getOrigFilename(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!completedDirUpload.isEmpty()) {
+ // FIXME include filename??
+ writeTableHead("Completed directory uploads",
new String[] { "Key", "Files", "Total Size", "Persistence", "Identifier" },
buf);
+ for(Iterator
i=completedUpload.iterator();i.hasNext();) {
+ ClientPutDir p = (ClientPutDir)
i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ writeNumberCell(p.getNumberOfFiles(),
buf);
+ writeSizeCell(p.getTotalDataSize(),
buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+ }
+
+ /* FIXME color-coded progress bars.
+ * It would be really nice to have a color-coded progress bar.
+ * We can then show what part is successful, what part isn't
tried yet,
+ * what part has each different well known error code...
+ */
+
+ if(!(failedDownload.isEmpty() && failedUpload.isEmpty())) {
+ writeBigHeading("Failed requests", buf);
+ if(!failedDownload.isEmpty()) {
+ writeTableHead("Failed downloads", new String[]
{ "Key", "Filename", "Size", "Type", "Success", "Reason", "Persistence",
"Identifier" }, buf);
+ for(Iterator
i=failedDownload.iterator();i.hasNext();) {
+ ClientGet p = (ClientGet) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getURI(), buf);
+ if(p.isDirect())
+ writeDirectCell(buf);
+ else
+
writeFilenameCell(p.getDestFilename(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeSuccessFractionCell(p, buf);
+ writeFailureReasonCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!failedUpload.isEmpty()) {
+ writeTableHead("Failed uploads", new String[] {
"Key", "Filename", "Size", "Type", "Success", "Reason", "Persistence",
"Identifier" }, buf);
+ for(Iterator
i=failedUpload.iterator();i.hasNext();) {
+ ClientPut p = (ClientPut) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ if(p.isDirect())
+ writeDirectCell(buf);
+ else
+
writeFilenameCell(p.getOrigFilename(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeSuccessFractionCell(p, buf);
+ writeFailureReasonCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!failedDirUpload.isEmpty()) {
+ writeTableHead("Failed directory uploads", new
String[] { "Key", "Files", "Total Size", "Success", "Reason", "Persistence",
"Identifier" }, buf);
+ for(Iterator
i=failedDirUpload.iterator();i.hasNext();) {
+ ClientPutDir p = (ClientPutDir)
i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ writeNumberCell(p.getNumberOfFiles(),
buf);
+ writeSizeCell(p.getTotalDataSize(),
buf);
+ writeSuccessFractionCell(p, buf);
+ writeFailureReasonCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+ }
+
+ if(!(uncompletedDownload.isEmpty() &&
uncompletedUpload.isEmpty() &&
+ uncompletedDirUpload.isEmpty())) {
+ writeBigHeading("Requests in progress", buf);
+ if(!uncompletedDownload.isEmpty()) {
+ writeTableHead("Downloads in progress", new
String[] { "Key", "Filename", "Size", "Type", "Success", "Persistence",
"Identifier" }, buf);
+ for(Iterator i =
uncompletedDownload.iterator();i.hasNext();) {
+ ClientGet p = (ClientGet) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getURI(), buf);
+ if(p.isDirect())
+ writeDirectCell(buf);
+ else
+
writeFilenameCell(p.getDestFilename(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeSuccessFractionCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!uncompletedUpload.isEmpty()) {
+ writeTableHead("Uploads in progress", new
String[] { "Key", "Filename", "Size", "Type", "Success", "Persistence",
"Identifier" }, buf);
+ for(Iterator i =
uncompletedDownload.iterator();i.hasNext();) {
+ ClientPut p = (ClientPut) i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ if(p.isDirect())
+ writeDirectCell(buf);
+ else
+
writeFilenameCell(p.getOrigFilename(), buf);
+ writeSizeCell(p.getDataSize(), buf);
+ writeTypeCell(p.getMIMEType(), buf);
+ writeSuccessFractionCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+
+ if(!uncompletedDirUpload.isEmpty()) {
+ writeTableHead("Directory uploads in progress",
new String[] { "Key", "Files", "Total Size", "Success", "Persistence",
"Identifier" }, buf);
+ for(Iterator
i=completedUpload.iterator();i.hasNext();) {
+ ClientPutDir p = (ClientPutDir)
i.next();
+ writeRowStart(buf);
+ writeKeyCell(p.getFinalURI(), buf);
+ writeNumberCell(p.getNumberOfFiles(),
buf);
+ writeSizeCell(p.getTotalDataSize(),
buf);
+ writeSuccessFractionCell(p, buf);
+ writePersistenceCell(p, buf);
+ writeIdentifierCell(p, buf);
+ writeRowEnd(buf);
+ }
+ writeTableEnd(buf);
+ }
+ }
+
+ ctx.getPageMaker().makeTail(buf);
+
+ this.writeReply(ctx, 200, "text/html", "OK", buf.toString());
+ }
+
+
+ private void writeFailureReasonCell(ClientRequest p, StringBuffer buf) {
+ buf.append("<td>");
+ String s = p.getFailureReason();
+ if(s == null)
+ buf.append("UNKNOWN");
+ else
+ buf.append(s);
+ buf.append("</td>\n");
+ }
+
+ private void writeSuccessFractionCell(ClientRequest p, StringBuffer
buf) {
+ double frac = p.getSuccessFraction();
+ if(frac < 0) {
+ buf.append("<td>UNKNOWN</td>\n");
+ } else {
+ buf.append("<td>");
+ buf.append(frac * 100);
+ buf.append("%</td>\n");
+ }
+ }
+
+ private void writeNumberCell(int numberOfFiles, StringBuffer buf) {
+ buf.append("<td>");
+ buf.append(numberOfFiles);
+ buf.append("</td>\n");
+ }
+
+ private void writeDirectCell(StringBuffer buf) {
+ buf.append("<td>DIRECT</td>\n");
+ }
+
+ private void writeFilenameCell(File destFilename, StringBuffer buf) {
+ buf.append("<td>");
+ if(destFilename == null)
+ buf.append("NONE");
+ else
+ buf.append(HTMLEncoder.encode(destFilename.toString()));
+ buf.append("</td>\n");
+ }
+
+ private void writeTableEnd(StringBuffer buf) {
+ buf.append("</table>");
+ }
+
+ private void writeRowEnd(StringBuffer buf) {
+ buf.append("</tr>\n");
+ }
+
+ private void writeIdentifierCell(ClientRequest p, StringBuffer buf) {
+ buf.append("<td>");
+ buf.append(HTMLEncoder.encode(p.getIdentifier()));
+ buf.append("</td>\n");
+ }
+
+ private void writePersistenceCell(ClientRequest p, StringBuffer buf) {
+ buf.append("<td>");
+ if(!p.isPersistent())
+ buf.append("<font color=\"black\">NONE</font>");
+ else if(!p.isPersistentForever())
+ buf.append("<font color=\"blue\">REBOOT</font>");
+ else
+ buf.append("<font color=\"green\">FOREVER</font>");
+ buf.append("</td>\n");
+ }
+
+ private void writeDownloadCell(ClientGet p, StringBuffer buf) {
+ buf.append("<td>");
+ buf.append("FIXME");
+ buf.append("</td>");
+ }
+
+ private void writeTypeCell(String type, StringBuffer buf) {
+ buf.append("<td>");
+ if(type != null)
+ buf.append(type);
+ else
+ buf.append("UNKNOWN");
+ buf.append("</td>\n");
+ }
+
+ private void writeSizeCell(long dataSize, StringBuffer buf) {
+ buf.append("<td>");
+ if(dataSize >= 0)
+ buf.append(SizeUtil.formatSize(dataSize));
+ else
+ buf.append("UNKNOWN");
+ buf.append("</td>\n");
+ }
+
+ private void writeKeyCell(FreenetURI uri, StringBuffer buf) {
+ buf.append("<td>");
+ buf.append("<a href=\"/");
+ String u = uri.toString(false);
+ buf.append(URLEncoder.encode(u));
+ buf.append("\">");
+ // FIXME too long? maybe only show the human readable bit?
+ buf.append(HTMLEncoder.encode(u));
+ buf.append("</a></td>\n");
+ }
+
+ private void writeRowStart(StringBuffer buf) {
+ buf.append("<tr>");
+ }
+
+ private void writeTableHead(String string, String[] strings,
StringBuffer buf) {
+ buf.append("<h2>");
+ buf.append(string);
+ buf.append("</h2>\n");
+ buf.append("<table border=\"0\">\n");
+ buf.append("<tr>");
+ for(int i=0;i<strings.length;i++) {
+ buf.append("<th>");
+ buf.append(strings[i]);
+ buf.append("</th>");
+ }
+ buf.append("\n");
+ }
+
+ private void writeBigHeading(String string, StringBuffer buf) {
+ buf.append("<h1>");
+ buf.append(string);
+ buf.append("</h1>\n");
+ }
+
+ public String supportedMethods() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-04-27 15:45:46 UTC (rev
8586)
+++ trunk/freenet/src/freenet/node/Node.java 2006-04-27 19:40:38 UTC (rev
8587)
@@ -1024,6 +1024,15 @@
throw new NodeInitException(EXIT_COULD_NOT_START_TMCI,
"Could not start TMCI: "+e);
}
+ // FCP (including persistent requests so needs to start before Fproxy)
+ try {
+ fcpServer = FCPServer.maybeCreate(this, config);
+ } catch (IOException e) {
+ throw new NodeInitException(EXIT_COULD_NOT_START_FCP,
"Could not start FCP: "+e);
+ } catch (InvalidConfigValueException e) {
+ throw new NodeInitException(EXIT_COULD_NOT_START_FCP,
"Could not start FCP: "+e);
+ }
+
// Fproxy
// FIXME this is a hack, the real way to do this is plugins
try {
@@ -1043,15 +1052,6 @@
server.register(pproxy, "/plugins/", true);
* */
- // FCP
- try {
- fcpServer = FCPServer.maybeCreate(this, config);
- } catch (IOException e) {
- throw new NodeInitException(EXIT_COULD_NOT_START_FCP,
"Could not start FCP: "+e);
- } catch (InvalidConfigValueException e) {
- throw new NodeInitException(EXIT_COULD_NOT_START_FCP,
"Could not start FCP: "+e);
- }
-
// SNMP
SNMPStarter.maybeCreate(this, config);
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-04-27 15:45:46 UTC (rev
8586)
+++ trunk/freenet/src/freenet/node/Version.java 2006-04-27 19:40:38 UTC (rev
8587)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 661;
+ private static final int buildNumber = 662;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 591;
Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java 2006-04-27 15:45:46 UTC
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java 2006-04-27 19:40:38 UTC
(rev 8587)
@@ -48,9 +48,9 @@
/** Did the request succeed? Valid if finished. */
private boolean succeeded;
/** Length of the found data */
- private long foundDataLength;
+ private long foundDataLength = -1;
/** MIME type of the found data */
- private String foundDataMimeType;
+ private String foundDataMimeType = null;
/** Details of request failure */
private GetFailedMessage getFailedMessage;
/** Succeeded but failed to return data e.g. couldn't write to file */
@@ -398,4 +398,48 @@
returnBucket.free();
}
+ public boolean hasSucceeded() {
+ return succeeded;
+ }
+
+ public boolean isDirect() {
+ return this.returnType == ClientGetMessage.RETURN_TYPE_DIRECT;
+ }
+
+ public boolean isToDisk() {
+ return this.returnType == ClientGetMessage.RETURN_TYPE_DISK;
+ }
+
+ public FreenetURI getURI() {
+ return uri;
+ }
+
+ public long getDataSize() {
+ return foundDataLength;
+ }
+
+ public String getMIMEType() {
+ return foundDataMimeType;
+ }
+
+ public File getDestFilename() {
+ return targetFile;
+ }
+
+ public double getSuccessFraction() {
+ if(progressPending != null) {
+ return progressPending.getFraction();
+ } else
+ return -1;
+ }
+
+ public String getFailureReason() {
+ if(getFailedMessage == null)
+ return null;
+ String s = getFailedMessage.shortCodeDescription;
+ if(getFailedMessage.extraDescription != null)
+ s += ": "+getFailedMessage.extraDescription;
+ return s;
+ }
+
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java 2006-04-27 15:45:46 UTC
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java 2006-04-27 19:40:38 UTC
(rev 8587)
@@ -172,5 +172,31 @@
protected String getTypeName() {
return "PUT";
}
-
+
+ public boolean hasSucceeded() {
+ return succeeded;
+ }
+
+ public FreenetURI getFinalURI() {
+ return generatedURI;
+ }
+
+ public boolean isDirect() {
+ return uploadFrom == ClientPutMessage.UPLOAD_FROM_DIRECT;
+ }
+
+ public File getOrigFilename() {
+ if(uploadFrom != ClientPutMessage.UPLOAD_FROM_DISK)
+ return null;
+ return origFilename;
+ }
+
+ public long getDataSize() {
+ return data.size();
+ }
+
+ public String getMIMEType() {
+ return clientMetadata.getMIMEType();
+ }
+
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -41,7 +41,7 @@
*/
private PutFailedMessage putFailedMessage;
/** URI generated for the insert. */
- private FreenetURI generatedURI;
+ protected FreenetURI generatedURI;
// This could be a SimpleProgress, or it could be started/finished
compression.
// Not that important, so not saved on persistence.
// Probably saving it would conflict with later changes (full
persistence at
@@ -228,4 +228,22 @@
protected abstract String getTypeName();
+ public double getSuccessFraction() {
+ if(progressMessage != null) {
+ if(progressMessage instanceof SimpleProgressMessage)
+ return
((SimpleProgressMessage)progressMessage).getFraction();
+ else return 0;
+ } else
+ return -1;
+ }
+
+ public String getFailureReason() {
+ if(putFailedMessage == null)
+ return null;
+ String s = putFailedMessage.shortCodeDescription;
+ if(putFailedMessage.extraDescription != null)
+ s += ": "+putFailedMessage.extraDescription;
+ return s;
+ }
+
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -25,6 +25,8 @@
private final HashMap manifestElements;
private final SimpleManifestPutter putter;
private final String defaultName;
+ private final long totalSize;
+ private final int numberOfFiles;
public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage
message,
HashMap manifestElements) throws
IdentifierCollisionException {
@@ -40,7 +42,14 @@
} catch (InserterException e) {
onFailure(e, null);
p = null;
- }
+ }
+ if(p != null) {
+ numberOfFiles = p.countFiles();
+ totalSize = p.totalSize();
+ } else {
+ numberOfFiles = -1;
+ totalSize = -1;
+ }
putter = p;
if(persistenceType != PERSIST_CONNECTION)
client.register(this);
@@ -51,6 +60,8 @@
SimpleFieldSet files = fs.subset("Files");
defaultName = fs.get("DefaultName");
// Flattened for disk, sort out afterwards
+ int fileCount = 0;
+ long size = 0;
Vector v = new Vector();
for(int i=0;;i++) {
String num = Integer.toString(i);
@@ -62,7 +73,7 @@
throw new PersistenceParseException("No Name on
"+i);
String contentTypeOverride =
subset.get("Metadata.ContentType");
String uploadFrom = subset.get("UploadFrom");
- Bucket data;
+ Bucket data = null;
Logger.minor(this, "Parsing "+i);
Logger.minor(this, "UploadFrom="+uploadFrom);
ManifestElement me;
@@ -79,6 +90,7 @@
data = null;
}
me = new ManifestElement(name, data,
contentTypeOverride, sz);
+ fileCount++;
} else if(uploadFrom.equalsIgnoreCase("disk")) {
long sz =
Long.parseLong(subset.get("DataLength"));
// Disk
@@ -92,12 +104,15 @@
}
data = new FileBucket(ff, true, false, false,
false);
me = new ManifestElement(name, data,
contentTypeOverride, sz);
+ fileCount++;
} else if(uploadFrom.equalsIgnoreCase("redirect")) {
FreenetURI targetURI = new
FreenetURI(subset.get("TargetURI"));
me = new ManifestElement(name, targetURI,
contentTypeOverride);
} else
throw new PersistenceParseException("Don't know
UploadFrom="+uploadFrom);
v.add(me);
+ if(data != null && data.size() > 0)
+ size += data.size();
}
manifestElements = SimpleManifestPutter.unflatten(v);
SimpleManifestPutter p = null;
@@ -110,6 +125,8 @@
p = null;
}
putter = p;
+ numberOfFiles = fileCount;
+ totalSize = size;
if(!finished)
start();
}
@@ -206,4 +223,25 @@
return "PUTDIR";
}
+ public boolean hasSucceeded() {
+ return succeeded;
+ }
+
+ public FreenetURI getFinalURI() {
+ return generatedURI;
+ }
+
+ public boolean isDirect() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public int getNumberOfFiles() {
+ return numberOfFiles;
+ }
+
+ public long getTotalDataSize() {
+ return totalSize;
+ }
+
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java 2006-04-27
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java 2006-04-27
19:40:38 UTC (rev 8587)
@@ -214,4 +214,8 @@
* Get a SimpleFieldSet representing this request.
*/
public abstract SimpleFieldSet getFieldSet() throws IOException;
+
+ public abstract double getSuccessFraction();
+
+ public abstract String getFailureReason();
}
Modified: trunk/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPClient.java 2006-04-27 15:45:46 UTC
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/FCPClient.java 2006-04-27 19:40:38 UTC
(rev 8587)
@@ -163,12 +163,12 @@
return !(runningPersistentRequests.isEmpty() &&
completedUnackedRequests.isEmpty());
}
- public void addPersistentRequests(Vector v) {
+ public void addPersistentRequests(Vector v, boolean onlyForever) {
synchronized(this) {
Iterator i = runningPersistentRequests.iterator();
while(i.hasNext()) {
ClientRequest req = (ClientRequest) i.next();
- if(req.isPersistentForever())
+ if(req.isPersistentForever() || !onlyForever)
v.add(req);
}
Object[] unacked = completedUnackedRequests.toArray();
Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java 2006-04-27 15:45:46 UTC
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java 2006-04-27 19:40:38 UTC
(rev 8587)
@@ -502,11 +502,17 @@
Iterator i = clientsByName.values().iterator();
while(i.hasNext()) {
FCPClient client = (FCPClient) (i.next());
- client.addPersistentRequests(v);
+ client.addPersistentRequests(v, true);
}
- globalClient.addPersistentRequests(v);
+ globalClient.addPersistentRequests(v, true);
}
return (ClientRequest[]) v.toArray(new ClientRequest[v.size()]);
}
+ public ClientRequest[] getGlobalRequests() {
+ Vector v = new Vector();
+ globalClient.addPersistentRequests(v, false);
+ return (ClientRequest[]) v.toArray(new ClientRequest[v.size()]);
+ }
+
}
Modified: trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
2006-04-27 15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
2006-04-27 19:40:38 UTC (rev 8587)
@@ -34,4 +34,8 @@
throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "SimpleProgress
goes from server to client not the other way around", ident);
}
+ public double getFraction() {
+ return (double) event.fetchedBlocks / (double)
event.totalBlocks;
+ }
+
}
Added: trunk/freenet/src/freenet/support/SizeUtil.java
===================================================================
--- trunk/freenet/src/freenet/support/SizeUtil.java 2006-04-27 15:45:46 UTC
(rev 8586)
+++ trunk/freenet/src/freenet/support/SizeUtil.java 2006-04-27 19:40:38 UTC
(rev 8587)
@@ -0,0 +1,32 @@
+package freenet.support;
+
+/**
+ * Size formatting utility.
+ */
+public class SizeUtil {
+
+ public static String formatSize(long sz) {
+ // First determine suffix
+
+ String suffixes = "kMGTPEZY";
+ long s = 1;
+ int i;
+ for(i=0;i<suffixes.length();i++) {
+ s *= 1000;
+ if(s > sz) {
+ break;
+ // Smaller than multiplier [i] - use the
previous one
+ }
+ }
+
+ s /= 1000; // we use the previous unit
+ double mantissa = (double)sz / (double)s;
+ String o = Double.toString(mantissa);
+ if(o.indexOf('.') > -1 && o.indexOf('E') == -1 && o.length() >
4)
+ o = o.substring(0, 4);
+ if(i > 0) o += suffixes.charAt(i-1);
+ o += "B";
+ return o;
+ }
+
+}