Author: saces
Date: 2008-04-14 20:01:40 +0000 (Mon, 14 Apr 2008)
New Revision: 19337
Modified:
trunk/plugins/KeyExplorer/KeyExplorer.java
Log:
...and use it.
Modified: trunk/plugins/KeyExplorer/KeyExplorer.java
===================================================================
--- trunk/plugins/KeyExplorer/KeyExplorer.java 2008-04-14 20:01:15 UTC (rev
19336)
+++ trunk/plugins/KeyExplorer/KeyExplorer.java 2008-04-14 20:01:40 UTC (rev
19337)
@@ -2,6 +2,7 @@
import java.io.IOException;
import java.net.MalformedURLException;
+import java.util.HashMap;
import freenet.client.Metadata;
import freenet.client.MetadataParseException;
@@ -12,25 +13,28 @@
import freenet.keys.ClientKey;
import freenet.keys.ClientKeyBlock;
import freenet.keys.FreenetURI;
-import freenet.keys.KeyDecodeException;
import freenet.node.LowLevelGetException;
import freenet.pluginmanager.FredPlugin;
+import freenet.pluginmanager.FredPluginFCP;
import freenet.pluginmanager.FredPluginHTTP;
import freenet.pluginmanager.FredPluginThreadless;
import freenet.pluginmanager.PluginHTTPException;
+import freenet.pluginmanager.PluginReplySender;
import freenet.pluginmanager.PluginRespirator;
import freenet.support.HTMLNode;
import freenet.support.HexUtil;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.Bucket;
import freenet.support.api.HTTPRequest;
-import freenet.support.io.ArrayBucket;
-import freenet.support.io.ArrayBucketFactory;
import freenet.support.io.BucketTools;
-public class KeyExplorer implements FredPlugin, FredPluginHTTP,
FredPluginThreadless {
+public class KeyExplorer implements FredPlugin, FredPluginHTTP, FredPluginFCP,
FredPluginThreadless {
private PluginRespirator m_pr;
private PageMaker m_pm;
+ private HashMap getters = new HashMap();
+
public String handleHTTPGet(HTTPRequest request) throws
PluginHTTPException {
String uri = request.getParam("key");
return makeMainPage(uri);
@@ -45,6 +49,55 @@
return makeMainPage();
}
+ public void handle(PluginReplySender replysender, SimpleFieldSet
params, Bucket data, int accesstype) {
+
+ String command = params.get("Command");
+
+ if (command == null || command.trim().length() == 0) {
+ sendError(replysender, 1, "Invalid Command name");
+ return;
+ }
+
+ if ("Ping".equals(command)) {
+ SimpleFieldSet sfs = new SimpleFieldSet(true);
+ sfs.put("Pong", System.currentTimeMillis());
+ replysender.send(sfs);
+ return;
+ } else if ("Get".equals(command)) {
+
+ final String identifier = params.get("Identifier");
+ if (identifier == null || identifier.trim().length() ==
0) {
+ sendError(replysender, 3, "Missing identifier");
+ return;
+ }
+
+ final String uri = params.get("URI");
+ if (uri == null || uri.trim().length() == 0) {
+ sendError(replysender, 4, "missing freenet
uri");
+ return;
+ }
+
+ try {
+ FreenetURI furi = new FreenetURI(uri);
+ GetResult getresult = simpleGet(furi);
+
+ SimpleFieldSet sfs = new SimpleFieldSet(true);
+ sfs.putSingle("Identifier", identifier);
+ sfs.put("IsMetadata", getresult.isMetaData);
+ replysender.send(sfs, getresult.data);
+ return;
+
+ } catch (MalformedURLException e) {
+ sendError(replysender, 5, "malformed freenet
uri");
+ return;
+ } catch (LowLevelGetException e) {
+ sendError(replysender, 6, "get failed" +
e.toString());
+ return;
+ }
+ } else
+ replysender.send(params);
+ }
+
public void runPlugin(PluginRespirator pr) {
Config nc = pr.getNode().config;
SubConfig fc = nc.get("fproxy");
@@ -57,6 +110,33 @@
public void terminate() {
}
+ private class GetResult {
+ final Bucket data;
+ final boolean isMetaData;
+
+ GetResult(Bucket data2, boolean isMetaData2) {
+ data = data2;
+ isMetaData = isMetaData2;
+ }
+ }
+
+ private GetResult simpleGet(FreenetURI uri) throws
MalformedURLException, LowLevelGetException {
+ ClientKey ck = (ClientKey) BaseClientKey.getBaseKey(uri);
+ VerySimpleGetter vsg = new VerySimpleGetter((short) 1,
m_pr.getNode().clientCore.requestStarters.chkFetchScheduler, m_pr
+
.getNode().clientCore.requestStarters.sskFetchScheduler, uri, null);
+ VerySimpleGet vs = new VerySimpleGet(ck, 3,
m_pr.getHLSimpleClient().getFetchContext(), vsg);
+ vs.schedule();
+ return new GetResult(vs.waitForCompletion(), vs.isMetadata());
+ }
+
+ private void sendError(PluginReplySender replysender, int code, String
description) {
+ SimpleFieldSet sfs = new SimpleFieldSet(true);
+ sfs.putOverwrite("Status", "Error");
+ sfs.put("Code", code);
+ sfs.putOverwrite("Description", description);
+ replysender.send(sfs);
+ }
+
private String makeMainPage() {
return makeMainPage(null);
}
@@ -67,22 +147,18 @@
String error = null;
byte[] data = null;
- ClientKeyBlock ckb = null;
+ GetResult getresult = null;
try {
if (key != null && (key.trim().length() > 0)) {
FreenetURI furi = new FreenetURI(key);
- ClientKey ck = (ClientKey)
BaseClientKey.getBaseKey(furi);
- ckb = m_pr.getNode().clientCore.realGetKey(ck,
true, true, false);
- ArrayBucket a = (ArrayBucket) ckb.decode(new
ArrayBucketFactory(), 32 * 1024, false);
- data = BucketTools.toByteArray(a);
+ getresult = simpleGet(furi);
+ data = BucketTools.toByteArray(getresult.data);
}
} catch (MalformedURLException e) {
error = "MalformedURL";
} catch (LowLevelGetException e) {
error = "get failed";
- } catch (KeyDecodeException e) {
- error = "decode error";
} catch (IOException e) {
error = "io error";
}
@@ -95,15 +171,15 @@
if (data != null) {
String title = "Key: " + key;
- if (ckb.isMetadata())
+ if (getresult.isMetaData)
title = title + "\u00a0(MetaData)";
HTMLNode dataBox2 = m_pm.getInfobox(title);
-
+
char[] asciibuf = new char[16];
-
- for (int j = 0; j < 16; j++)
+
+ for (int j = 0; j < 16; j++)
asciibuf[j] = ' ';
-
+
dataBox2.addChild("%", "<PRE>\n");
StringBuffer sb = new StringBuffer();
int offset = 0;
@@ -113,22 +189,22 @@
HexUtil.bytesToHexAppend(data, i, 1, sb);
sb.append(' ');
if ((data[i] > 31) && (data[i] < 127)) {
- //int j = data[i];
- //sb.append((char) j);
- asciibuf[offset] =(char) data[i];
- }
-
+ // int j = data[i];
+ // sb.append((char) j);
+ asciibuf[offset] = (char) data[i];
+ }
+
if ((i > 1) && ((i + 1) % 16 == 0)) {
sb.append(' ');
sb.append(asciibuf);
sb.append('\n');
- for (int k = 0; k < 16; k++)
+ for (int k = 0; k < 16; k++)
asciibuf[k] = ' ';
}
}
if (offset > 0) {
- int n = (15-offset)*3;
- for (int m = 0; m < n; m++)
+ int n = (15 - offset) * 3;
+ for (int m = 0; m < n; m++)
sb.append(' ');
sb.append(' ');
sb.append(asciibuf);
@@ -141,7 +217,7 @@
error = null;
- if (ckb.isMetadata()) {
+ if (getresult.isMetaData) {
Metadata md = null;
try {
@@ -183,9 +259,10 @@
String sfrUri =
md.getSingleTarget().toString();
metaBox.addChild("#",
sfrUri);
metaBox.addChild("#",
"\u00a0");
- metaBox.addChild(new
HTMLNode("a", "href", "/?key="+sfrUri, "open"));
+ metaBox.addChild(new
HTMLNode("a", "href", "/?key=" + sfrUri, "open"));
metaBox.addChild("#",
"\u00a0");
- metaBox.addChild(new
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?key="+sfrUri,
"explore"));
+ metaBox.addChild(new
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?key=" + sfrUri,
+
"explore"));
metaBox.addChild("%",
"<BR />");
}
}
@@ -243,5 +320,4 @@
errorBox.addChild("#", errmsg);
return errorBox;
}
-
}