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>