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>

Reply via email to