Also, metadata is recursive: you probably want to decompose it recursively,
maybe as a tree. E.g. simple manifest -> simple manifest -> redirect.
On Friday 14 December 2007 20:56, you wrote:
> Author: saces
> Date: 2007-12-14 20:56:13 +0000 (Fri, 14 Dec 2007)
> New Revision: 16548
>
> Added:
> trunk/plugins/KeyExplorer/
> trunk/plugins/KeyExplorer/KeyExplorer.java
> Log:
> new plugin: key info and debug tool
>
> Added: trunk/plugins/KeyExplorer/KeyExplorer.java
> ===================================================================
> --- trunk/plugins/KeyExplorer/KeyExplorer.java
> (rev
0)
> +++ trunk/plugins/KeyExplorer/KeyExplorer.java 2007-12-14 20:56:13 UTC
> (rev
16548)
> @@ -0,0 +1,243 @@
> +package plugins.KeyExplorer;
> +
> +import java.io.IOException;
> +import java.net.MalformedURLException;
> +
> +import freenet.client.Metadata;
> +import freenet.client.MetadataParseException;
> +import freenet.clients.http.PageMaker;
> +import freenet.config.Config;
> +import freenet.config.SubConfig;
> +import freenet.keys.BaseClientKey;
> +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.FredPluginHTTP;
> +import freenet.pluginmanager.FredPluginThreadless;
> +import freenet.pluginmanager.PluginHTTPException;
> +import freenet.pluginmanager.PluginRespirator;
> +import freenet.support.HTMLNode;
> +import freenet.support.HexUtil;
> +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 {
> +
> + private PluginRespirator m_pr;
> + private PageMaker m_pm;
> +
> + public String handleHTTPGet(HTTPRequest request) throws
PluginHTTPException {
> + String uri = request.getParam("key");
> + return makeMainPage(uri);
> + }
> +
> + public String handleHTTPPost(HTTPRequest request) throws
PluginHTTPException {
> + String uri = request.getPartAsString("key", 1024);
> + return makeMainPage(uri);
> + }
> +
> + public String handleHTTPPut(HTTPRequest request) throws
PluginHTTPException {
> + return makeMainPage();
> + }
> +
> + public void runPlugin(PluginRespirator pr) {
> + Config nc = pr.getNode().config;
> + SubConfig fc = nc.get("fproxy");
> + String cssName = fc.getString("css");
> +
> + m_pm = new PageMaker(cssName);
> + m_pr = pr;
> + }
> +
> + public void terminate() {
> + }
> +
> + private String makeMainPage() {
> + return makeMainPage(null);
> + }
> +
> + private String makeMainPage(String key) {
> + HTMLNode pageNode = m_pm.getPageNode("KeyExplorer", null);
> + HTMLNode contentNode = m_pm.getContentNode(pageNode);
> +
> + String error = null;
> + byte[] data = null;
> + ClientKeyBlock ckb = 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,
> false, true, false);
> + ArrayBucket a = (ArrayBucket) ckb.decode(new
> ArrayBucketFactory(), 32 *
1024, false);
> + data = BucketTools.toByteArray(a);
> + }
> + } catch (MalformedURLException e) {
> + error = "MalformedURL";
> + } catch (LowLevelGetException e) {
> + error = "get failed";
> + } catch (KeyDecodeException e) {
> + error = "decode error";
> + } catch (IOException e) {
> + error = "io error";
> + }
> +
> + if (error != null) {
> + contentNode.addChild(createErrorBox(error));
> + }
> +
> + contentNode.addChild(createUriBox());
> +
> + if (data != null) {
> + String title = "Key: " + key;
> + if (ckb.isMetadata())
> + title = title + "\u00a0(MetaData)";
> + HTMLNode dataBox2 = m_pm.getInfobox(title);
> +
> + char[] asciibuf = new char[16];
> +
> + for (int j = 0; j < 16; j++)
> + asciibuf[j] = ' ';
> +
> + dataBox2.addChild("%", "<PRE>\n");
> + StringBuffer sb = new StringBuffer();
> + int offset = 0;
> +
> + for (int i = 0; i < data.length; i++) {
> + offset = (i) % 16;
> + 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];
> + }
> +
> + if ((i > 1) && ((i + 1) % 16 == 0)) {
> + sb.append(' ');
> + sb.append(asciibuf);
> + sb.append('\n');
> + for (int k = 0; k < 16; k++)
> + asciibuf[k] = ' ';
> + }
> + }
> + if (offset > 0) {
> + int n = (15-offset)*3;
> + for (int m = 0; m < n; m++)
> + sb.append(' ');
> + sb.append(' ');
> + sb.append(asciibuf);
> + }
> +
> + dataBox2.addChild("#", sb.toString());
> + dataBox2.addChild("%", "\n</PRE>");
> +
> + contentNode.addChild(dataBox2);
> +
> + error = null;
> +
> + if (ckb.isMetadata()) {
> +
> + Metadata md = null;
> + try {
> + md = Metadata.construct(data);
> + } catch (MetadataParseException e) {
> + error = "Metadata parse error";
> + }
> +
> + if (error != null)
> +
> contentNode.addChild(createErrorBox(error));
> +
> + if (md != null) {
> + HTMLNode metaBox =
> m_pm.getInfobox("Decomposed metadata");
> +
> + metaBox.addChild("#", "Document type:");
> + metaBox.addChild("%", "<BR />");
> +
> + if (md.isSimpleManifest()) {
> + metaBox.addChild("#", "Document
> type: SimpleManifest");
> + metaBox.addChild("%", "<BR />");
> + }
> +
> + if (md.isSplitfile()) {
> + metaBox.addChild("#", "Document
> type: Splitfile");
> + metaBox.addChild("%", "<BR />");
> + }
> +
> + if (md.isSimpleSplitfile()) {
> + metaBox.addChild("#", "Document
> type: SimpleSplitfile");
> + metaBox.addChild("%", "<BR />");
> + }
> +
> + if (md.isSingleFileRedirect()) {
> + metaBox.addChild("#", "Document
> type: SingleFileRedirect");
> + metaBox.addChild("%", "<BR />");
> + String sfrUri =
> md.getSingleTarget().toString();
> + metaBox.addChild("#", sfrUri);
> + metaBox.addChild("#", "\u00a0");
> + 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("%", "<BR />");
> + }
> +
> + if (md.isArchiveInternalRedirect()) {
> + metaBox.addChild("#", "Document
> type: ArchiveInternalRedirect");
> + metaBox.addChild("%", "<BR />");
> + }
> +
> + if (md.isArchiveManifest()) {
> + metaBox.addChild("#", "Document
> type: ArchiveManifest");
> + metaBox.addChild("%", "<BR />");
> + }
> +
> + if (!md.isCompressed()) {
> + metaBox.addChild("#",
> "Uncompressed");
> + } else {
> + metaBox.addChild("#",
> "Compressed (codec " + md.getCompressionCodec()
+ ")");
> + metaBox.addChild("%", "<BR />");
> + metaBox.addChild("#",
> "Decompressed size: " +
md.uncompressedDataLength() + " bytes");
> + }
> + metaBox.addChild("%", "<BR />");
> +
> + metaBox.addChild("#", "Data
> size\u00a0=\u00a0" + md.dataLength());
> + metaBox.addChild("%", "<BR />");
> +
> + if (md.isResolved()) {
> + metaBox.addChild("#", "Resolved
> URI:\u00a0=\u00a0" +
md.getResolvedURI());
> + metaBox.addChild("%", "<BR />");
> + }
> + contentNode.addChild(metaBox);
> + }
> +
> + }
> +
> + }
> +
> + return pageNode.generate();
> + }
> +
> + private HTMLNode createUriBox() {
> + HTMLNode browseBox = m_pm.getInfobox("Explore a freenet key");
> + HTMLNode browseContent = m_pm.getContentNode(browseBox);
> + browseContent.addChild("#", "Display the top level chunk as
> hexprint");
> + HTMLNode browseForm =
m_pr.addFormChild(browseContent, "/plugins/plugins.KeyExplorer.KeyExplorer/",
"uriForm");
> + browseForm.addChild("#", "Freenetkey to explore: \u00a0 ");
> + browseForm.addChild("input", new String[] { "type", "name",
> "size" }, new
String[] { "text", "key", "70" });
> + browseForm.addChild("#", "\u00a0");
> + browseForm.addChild("input", new String[] { "type", "name",
> "value" },
new String[] { "submit", "debug", "Explore!" });
> + return browseBox;
> + }
> +
> + private HTMLNode createErrorBox(String errmsg) {
> + HTMLNode errorBox = m_pm.getInfobox("infobox-alert", "ERROR");
> + errorBox.addChild("#", errmsg);
> + return errorBox;
> + }
> +
> +}
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20071215/766e0a97/attachment.pgp>