Author: saces
Date: 2009-04-11 18:51:18 +0000 (Sat, 11 Apr 2009)
New Revision: 26742

Modified:
   trunk/plugins/KeyExplorer/KeyExplorer.java
Log:
KeyExlorer 0.4 alpha
- ability to display all kind of manifests
- better look of hex dump (thanks SDiZ), configurable with
- can parse site-manifests rekursive and display the hole site content like a 
filesystem browser
- a lot TODOs and bugs.

Modified: trunk/plugins/KeyExplorer/KeyExplorer.java
===================================================================
--- trunk/plugins/KeyExplorer/KeyExplorer.java  2009-04-11 18:19:00 UTC (rev 
26741)
+++ trunk/plugins/KeyExplorer/KeyExplorer.java  2009-04-11 18:51:18 UTC (rev 
26742)
@@ -9,6 +9,8 @@
 import java.util.Formatter;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.zip.ZipEntry;
@@ -17,6 +19,10 @@
 import org.apache.tools.tar.TarEntry;
 import org.apache.tools.tar.TarInputStream;
 
+import com.db4o.ObjectContainer;
+
+import freenet.client.ArchiveContext;
+import freenet.client.ClientMetadata;
 import freenet.client.FetchContext;
 import freenet.client.FetchException;
 import freenet.client.FetchResult;
@@ -24,6 +30,12 @@
 import freenet.client.HighLevelSimpleClient;
 import freenet.client.Metadata;
 import freenet.client.MetadataParseException;
+import freenet.client.ArchiveManager.ARCHIVE_TYPE;
+import freenet.client.async.ClientContext;
+import freenet.client.async.ClientGetState;
+import freenet.client.async.GetCompletionCallback;
+import freenet.client.async.KeyListenerConstructionException;
+import freenet.client.async.SplitFileFetcher;
 import freenet.clients.http.PageMaker;
 import freenet.keys.BaseClientKey;
 import freenet.keys.ClientKey;
@@ -43,16 +55,18 @@
 import freenet.pluginmanager.PluginNotFoundException;
 import freenet.pluginmanager.PluginReplySender;
 import freenet.pluginmanager.PluginRespirator;
+import freenet.pluginmanager.RedirectPluginHTTPException;
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
 import freenet.support.api.HTTPRequest;
+import freenet.support.compress.Compressor.COMPRESSOR_TYPE;
 import freenet.support.io.BucketTools;
 
 /**
  * @author saces
- *
+ * 
  */
 public class KeyExplorer implements FredPlugin, FredPluginHTTP, 
FredPluginL10n, FredPluginFCP, FredPluginThreadless, FredPluginVersioned, 
FredPluginRealVersioned {
 
@@ -60,23 +74,54 @@
        private PageMaker m_pm;
 
        public String handleHTTPGet(HTTPRequest request) throws 
PluginHTTPException {
-               String uri = request.getParam("key");
-               String type = request.getParam("type");
+               String uri;
+               String type;
+               boolean automf;
+               boolean deep;
+               int hexWidth;
+
+               if (request.isParameterSet("key")) {
+                       uri = request.getParam("key");
+                       type = request.getParam("mftype");
+                       automf = request.getParam("automf").length() > 0;
+                       deep = request.getParam("deep").length() > 0;
+                       hexWidth = request.getIntParam("hexWidth", 32);
+               } else {
+                       uri = null;
+                       type = null;
+                       automf = true;
+                       deep = true;
+                       hexWidth = 32;
+               }
+
+               List<String> errors = new LinkedList<String>();
+               if (hexWidth < 1 || hexWidth > 1024) {
+                       errors.add("Hex display columns out of range. (1-1024). 
Set to 32 (default).");
+                       hexWidth = 32;
+               }
                if ("ZIPmanifest".equals(type)) {
-                       return makeManifestPage(uri, true, false);
+                       return makeManifestPage(errors, uri, true, false, 
hexWidth, automf, deep);
                }
                if ("TARmanifest".equals(type)) {
-                       return makeManifestPage(uri, false, true);
+                       return makeManifestPage(errors, uri, false, true, 
hexWidth, automf, deep);
                }
                if ("simplemanifest".equals(type)) {
-                       return makeManifestPage(uri, false, false);
+                       return makeManifestPage(errors, uri, false, false, 
hexWidth, automf, deep);
                }
-               return makeMainPage(uri);
+               return makeMainPage(errors, uri, hexWidth, automf, deep);
        }
 
        public String handleHTTPPost(HTTPRequest request) throws 
PluginHTTPException {
                String uri = request.getPartAsString("key", 1024);
-               return makeMainPage(uri);
+               int hexWidth = request.getIntPart("hexWidth", 32);
+               boolean automf = request.getPartAsString("automf", 
128).length() > 0;
+               boolean deep = request.getPartAsString("deep", 128).length() > 
0;
+               List<String> errors = new LinkedList<String>();
+               if (hexWidth < 1 || hexWidth > 1024) {
+                       errors.add("Hex display columns out of range. (1-1024). 
Set to 32 (default).");
+                       hexWidth = 32;
+               }
+               return makeMainPage(errors, uri, hexWidth, automf, deep);
        }
 
        public void handle(PluginReplySender replysender, SimpleFieldSet 
params, Bucket data, int accesstype) {
@@ -87,60 +132,98 @@
                }
        }
 
-       private void realHandle(PluginReplySender replysender, SimpleFieldSet 
params, Bucket data, int accesstype) throws PluginNotFoundException {
-               if (params == null) {
-                       sendError(replysender, 0, "Got void message");
-                       return;
-               }
-               
-               String command = params.get("Command");
+       /**
+        * @param accesstype  
+        */
+       public void realHandle(PluginReplySender replysender, SimpleFieldSet 
params, Bucket data, int accesstype) throws PluginNotFoundException {
+                       if (params == null) {
+                               sendError(replysender, 0, "Got void message");
+                               return;
+                       }
+                       
+                       if (data != null) {
+                               sendError(replysender, 0, "Got a diatribe piece 
of writing. Data not allowed!");
+                               return;
+                       }
 
-               if (command == null || command.trim().length() == 0) {
-                       sendError(replysender, 1, "Invalid Command name");
-                       return;
-               }
+                       String command = params.get("Command");
 
-               if ("Ping".equals(command)) {
-                       SimpleFieldSet sfs = new SimpleFieldSet(true);
-                       sfs.put("Pong", System.currentTimeMillis());
-                       replysender.send(sfs);
-                       return;
-               } 
-               
-               if ("Get".equals(command)) {
-
-                       final String identifier = params.get("Identifier");
-                       if (identifier == null || identifier.trim().length() == 
0) {
-                               sendError(replysender, 3, "Missing identifier");
+                       if (command == null || command.trim().length() == 0) {
+                               sendError(replysender, 1, "Invalid Command 
name");
                                return;
                        }
 
-                       final String uri = params.get("URI");
-                       if (uri == null || uri.trim().length() == 0) {
-                               sendError(replysender, 4, "missing freenet 
uri");
+                       if ("Ping".equals(command)) {
+                               SimpleFieldSet sfs = new SimpleFieldSet(true);
+                               sfs.put("Pong", System.currentTimeMillis());
+                               replysender.send(sfs);
                                return;
                        }
 
-                       try {
-                               FreenetURI furi = new FreenetURI(uri);
-                               GetResult getResult = simpleGet(m_pr, furi);
+                       if ("Get".equals(command)) {
 
-                               SimpleFieldSet sfs = new SimpleFieldSet(true);
-                               sfs.putSingle("Identifier", identifier);
-                               sfs.put("IsMetadata", getResult.isMetaData());
-                               sfs.putSingle("Status", "DataFound");
-                               replysender.send(sfs, getResult.getData());
-                               return;
+                               final String identifier = 
params.get("Identifier");
+                               if (identifier == null || 
identifier.trim().length() == 0) {
+                                       sendError(replysender, 3, "Missing 
identifier");
+                                       return;
+                               }
 
-                       } catch (MalformedURLException e) {
-                               sendError(replysender, 5, "Malformed freenet 
uri: "+e.getMessage());
-                               return;
-                       } catch (LowLevelGetException e) {
-                               sendError(replysender, 6, "Get failed: " + 
e.toString());
-                               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(m_pr, 
furi);
+                                       SimpleFieldSet sfs = new 
SimpleFieldSet(true);
+                                       sfs.putSingle("Identifier", identifier);
+                                       sfs.put("IsMetadata", 
getResult.isMetaData());
+                                       sfs.putSingle("Status", "DataFound");
+                                       replysender.send(sfs, 
getResult.getData());
+                                       return;
+                               } catch (MalformedURLException e) {
+                                       sendError(replysender, 5, "Malformed 
freenet uri: " + e.getMessage());
+                                       return;
+                               } catch (LowLevelGetException e) {
+                                       sendError(replysender, 6, "Get failed: 
" + e.toString());
+                                       return;
+                               }
                        }
-               } else
-                       replysender.send(params);
+
+                       if ("ListSiteManifest".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(m_pr, 
furi);
+                                       SimpleFieldSet sfs = new 
SimpleFieldSet(true);
+                                       sfs.putSingle("Identifier", identifier);
+                                       sfs.put("IsMetadata", 
getResult.isMetaData());
+                                       sfs.putSingle("Status", "DataFound");
+                                       replysender.send(sfs, 
getResult.getData());
+                                       return;
+                               } catch (MalformedURLException e) {
+                                       sendError(replysender, 5, "Malformed 
freenet uri: " + e.getMessage());
+                                       return;
+                               } catch (LowLevelGetException e) {
+                                       sendError(replysender, 6, "Get failed: 
" + e.toString());
+                                       return;
+                               }
+                       }
+                       sendError(replysender, 1, "Unknown command: " + 
command);
        }
 
        public void runPlugin(PluginRespirator pr) {
@@ -164,6 +247,72 @@
                return new GetResult(vs.waitForCompletion(), vs.isMetadata());
        }
 
+       private FetchResult splitGet(Metadata metadata) throws 
MalformedURLException, LowLevelGetException, FetchException, 
MetadataParseException,
+                       KeyListenerConstructionException {
+
+               final FetchWaiter fw = new FetchWaiter();
+
+               GetCompletionCallback cb = new GetCompletionCallback() {
+
+                       public void onBlockSetFinished(ClientGetState state, 
ObjectContainer container, ClientContext context) {
+                               // TODO Auto-generated method stub
+                       }
+
+                       public void onExpectedMIME(String mime, ObjectContainer 
container) {
+                               // TODO Auto-generated method stub
+                       }
+
+                       public void onExpectedSize(long size, ObjectContainer 
container) {
+                               // TODO Auto-generated method stub
+                       }
+
+                       public void onFailure(FetchException e, ClientGetState 
state, ObjectContainer container, ClientContext context) {
+                               // TODO Auto-generated method stub
+                               fw.onFailure(e, null, container);
+                       }
+
+                       public void onFinalizedMetadata(ObjectContainer 
container) {
+                               // TODO Auto-generated method stub
+                       }
+
+                       public void onSuccess(FetchResult result, 
ClientGetState state, ObjectContainer container, ClientContext context) {
+                               // meta = Metadata.construct(result.asBucket());
+                               // System.out.println("HEHEHE!!!YEAH!!!");
+                               fw.onSuccess(result, null, container);
+                               // fresult = result;
+                       }
+
+                       public void onTransition(ClientGetState oldState, 
ClientGetState newState, ObjectContainer container) {
+                               // TODO Auto-generated method stub
+
+                       }
+               };
+
+               LinkedList<COMPRESSOR_TYPE> decompressors = new 
LinkedList<COMPRESSOR_TYPE>();
+               FetchContext ctx = m_pr.getHLSimpleClient().getFetchContext();
+               boolean deleteFetchContext = false;
+               ClientMetadata clientMetadata = null;
+               ArchiveContext actx = null;
+               int recursionLevel = 0;
+               Bucket returnBucket = null;
+               long token = 0;
+               if (metadata.isCompressed()) {
+                       COMPRESSOR_TYPE codec = metadata.getCompressionCodec();
+                       decompressors.add(codec);
+               }
+               VerySimpleGetter vsg = new VerySimpleGetter((short) 1, null, 
(RequestClient) m_pr.getHLSimpleClient());
+               SplitFileFetcher sf = new SplitFileFetcher(metadata, cb, vsg, 
ctx, deleteFetchContext, decompressors, clientMetadata, actx, recursionLevel, 
returnBucket, token,
+                               null, m_pr.getNode().clientCore.clientContext);
+
+               // VerySimpleGetter vsg = new VerySimpleGetter((short) 1, uri,
+               // (RequestClient) m_pr.getHLSimpleClient());
+               // VerySimpleGet vs = new VerySimpleGet(ck, 0,
+               // m_pr.getHLSimpleClient().getFetchContext(), vsg);
+               sf.schedule(null, m_pr.getNode().clientCore.clientContext);
+               // fw.waitForCompletion();
+               return fw.waitForCompletion();
+       }
+
        private void sendError(PluginReplySender replysender, int code, String 
description) throws PluginNotFoundException {
                SimpleFieldSet sfs = new SimpleFieldSet(true);
                sfs.putOverwrite("Status", "Error");
@@ -172,82 +321,108 @@
                replysender.send(sfs);
        }
 
-       private String makeMainPage(String key) {
+       private String makeMainPage(List<String> errors, String key, int 
hexWidth, boolean automf, boolean deep) throws PluginHTTPException {
                HTMLNode pageNode = m_pm.getPageNode("KeyExplorer", null);
                HTMLNode contentNode = m_pm.getContentNode(pageNode);
 
-               String error = null;
                byte[] data = null;
                GetResult getresult = null;
-               
+               String extraParams = "&hexwidth=" + hexWidth;
+               if (automf) {
+                       extraParams += "&automf=checked";
+               }
+               if (deep) {
+                       extraParams += "&deep=checked";
+               }
                FreenetURI furi = null;
+               FreenetURI retryUri = null;
 
                try {
                        if (key != null && (key.trim().length() > 0)) {
                                furi = new FreenetURI(key);
+                               retryUri = furi;
                                if ("USK".equals(furi.getKeyType())) {
                                        USK tempUSK = USK.create(furi);
                                        ClientKey tempKey = tempUSK.getSSK();
                                        furi = tempKey.getURI();
-                               } 
+                               }
                                getresult = simpleGet(m_pr, furi);
                                data = 
BucketTools.toByteArray(getresult.getData());
                        }
                } catch (MalformedURLException e) {
-                       error = "MalformedURL";
+                       errors.add("MalformedURL: " + key);
                } catch (LowLevelGetException e) {
-                       error = "get failed";
+                       errors.add("Get failed (" + e.code + "): " + 
e.getMessage());
                } catch (IOException e) {
-                       error = "io error";
+                       errors.add("IO Error: " + e.getMessage());
+               } finally {
+                       if (getresult != null)
+                               getresult.free();
                }
 
-               if (error != null) {
-                       contentNode.addChild(createErrorBox(error));
+               HTMLNode uriBox = createUriBox(((furi == null) ? null : 
furi.toString(false, false)), hexWidth, automf, deep, errors);
+
+               if (errors.size() > 0) {
+                       contentNode.addChild(createErrorBox(errors, retryUri, 
null));
+                       errors.clear();
                }
 
-               contentNode.addChild(createUriBox());
+               contentNode.addChild(uriBox);
 
                if (data != null) {
-                       String title = "Key: " + furi.toString();
+                       Metadata md = null;
+
+                       if (getresult.isMetaData()) {
+                               try {
+                                       md = Metadata.construct(data);
+                               } catch (MetadataParseException e) {
+                                       errors.add("Metadata parse error: " + 
e.getMessage());
+                               }
+                               if (md != null) {
+                                       if (automf && md.isArchiveManifest()) {
+                                               if (md.getArchiveType() == 
ARCHIVE_TYPE.TAR) {
+                                                       throw new 
RedirectPluginHTTPException("Reopen as TAR manifest", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=TARmanifest&key=" + furi
+                                                                       + 
extraParams);
+                                               } else if (md.getArchiveType() 
== ARCHIVE_TYPE.ZIP) {
+                                                       throw new 
RedirectPluginHTTPException("Reopen as ZIP manifest", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=ZIPmanifest&key=" + furi
+                                                                       + 
extraParams);
+                                               } else {
+                                                       errors.add("Unknown 
Archive Type: " + md.getArchiveType().name());
+                                               }
+                                       }
+                                       if (automf && md.isSimpleManifest()) {
+                                               throw new 
RedirectPluginHTTPException("Reopen as simple manifest", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=simplemanifest&key=" + furi
+                                                               + extraParams);
+                                       }
+                               }
+                       }
+
+                       String title = "Key: " + furi.toString(false, false);
                        if (getresult.isMetaData())
                                title = title + "\u00a0(MetaData)";
                        HTMLNode dataBox2 = m_pm.getInfobox(title);
 
                        dataBox2.addChild("%", "<pre lang=\"en\" 
style=\"font-family: monospace;\">\n");
-                       dataBox2.addChild("#", hexDump(data));
+                       dataBox2.addChild("#", hexDump(data, hexWidth));
                        dataBox2.addChild("%", "\n</pre>");
 
                        contentNode.addChild(dataBox2);
 
-                       error = null;
-
                        if (getresult.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.isMultiLevelMetadata()) {
-                                               metaBox.addChild("#", "Document 
type: MultiLevelMetadata");             
-                                               metaBox.addChild("%", "<BR 
/>");                                
+                                               metaBox.addChild("#", "Document 
type: MultiLevelMetadata");
+                                               metaBox.addChild("%", "<BR />");
                                        }
                                        if (md.isSimpleManifest()) {
                                                metaBox.addChild("#", "Document 
type: SimpleManifest");
                                                metaBox.addChild("#", "\u00a0");
-                                               metaBox.addChild(new 
HTMLNode("a", "href", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?type=simplemanifest&key=" + furi,
-                                               "reopen as manifest"));
+                                               metaBox.addChild(new 
HTMLNode("a", "href", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=simplemanifest&key=" + furi, 
"reopen as manifest"));
                                                metaBox.addChild("%", "<BR />");
                                        }
 
@@ -266,15 +441,14 @@
                                                metaBox.addChild("#", "\u00a0");
                                                FreenetURI uri = 
md.getSingleTarget();
                                                if (uri != null) {
-                                                       String sfrUri = 
md.getSingleTarget().toString();
+                                                       String sfrUri = 
md.getSingleTarget().toString(false, false);
                                                        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(new 
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?key=" + 
sfrUri, "explore"));
                                                } else {
-                                                       metaBox.addChild(new 
HTMLNode("a", "href", "/?key=" + furi, "reopen normal"));                       
                           
+                                                       metaBox.addChild(new 
HTMLNode("a", "href", "/?key=" + furi, "reopen normal"));
                                                }
                                                metaBox.addChild("%", "<BR />");
                                        }
@@ -287,8 +461,8 @@
                                        if (md.isArchiveManifest()) {
                                                metaBox.addChild("#", "Document 
type: ArchiveManifest");
                                                metaBox.addChild("#", "\u00a0");
-                                               metaBox.addChild(new 
HTMLNode("a", "href", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?type="+md.getArchiveType().name()+"manifest&key="
 + furi,
-                                               "reopen as manifest"));
+                                               metaBox.addChild(new 
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=" + 
md.getArchiveType().name() + "manifest&key=" + furi,
+                                                               "reopen as 
manifest"));
                                                metaBox.addChild("%", "<BR />");
                                        }
 
@@ -298,8 +472,8 @@
                                                metaBox.addChild("#", 
"Compressed (codec " + md.getCompressionCodec().name + ")");
                                                metaBox.addChild("%", "<BR />");
                                                metaBox.addChild("#", 
"Decompressed size: " + md.uncompressedDataLength() + " bytes");
-                                       }                                       
-                                       
+                                       }
+
                                        metaBox.addChild("%", "<BR />");
 
                                        metaBox.addChild("#", "Data 
size\u00a0=\u00a0" + md.dataLength());
@@ -311,34 +485,33 @@
                                        }
                                        contentNode.addChild(metaBox);
                                }
-
                        }
-
+                       if (errors.size() > 0)
+                               contentNode.addChild(createErrorBox(errors, 
null, null));
                }
-
                return pageNode.generate();
        }
 
-       private String hexDump(byte[] data) {
+       private String hexDump(byte[] data, int width) {
                StringBuilder sb = new StringBuilder();
                Formatter formatter = new Formatter(sb, Locale.US);
 
                try {
-                       for (int offset = 0; offset < data.length; offset += 
16) {
-                               formatter.format("%07x:",  offset);
-                               
-                               for (int i = 0; i < 16; i++) {
+                       for (int offset = 0; offset < data.length; offset += 
width) {
+                               formatter.format("%07X:", offset);
+
+                               for (int i = 0; i < width; i++) {
                                        if (i % 2 == 0)
                                                formatter.out().append(' ');
                                        if (i + offset >= data.length) {
                                                formatter.out().append("  ");
                                                continue;
                                        }
-                                       formatter.format("%02x", data[i + 
offset]);
+                                       formatter.format("%02X", data[i + 
offset]);
                                }
 
                                formatter.out().append("  ");
-                               for (int i = 0; i < 16; i++) {
+                               for (int i = 0; i < width; i++) {
                                        if (i + offset >= data.length)
                                                break;
 
@@ -358,13 +531,12 @@
                return sb.toString();
        }
 
-       private String makeManifestPage(String key, boolean zip, boolean tar) {
+       private String makeManifestPage(List<String> errors, String key, 
boolean zip, boolean tar, int hexWidth, boolean automf, boolean deep) {
                HTMLNode pageNode = m_pm.getPageNode("KeyExplorer", null);
                HTMLNode contentNode = m_pm.getContentNode(pageNode);
 
-               String error = null;
                Metadata metadata = null;
-               
+
                FreenetURI furi = null;
 
                try {
@@ -373,149 +545,322 @@
                                USK tempUSK = USK.create(furi);
                                ClientKey tempKey = tempUSK.getSSK();
                                furi = tempKey.getURI();
-                       } 
-       
+                       }
+
                        if (zip)
                                metadata = zipManifestGet(furi);
                        else if (tar)
                                metadata = tarManifestGet(furi);
                        else
-                               metadata = simpleManifestGet(furi);
+                               metadata = simpleManifestGet(m_pr, furi);
                } catch (MalformedURLException e) {
-                       error = "MalformedURL";
+                       errors.add("MalformedURL: " + key);
                } catch (FetchException e) {
-                       error = "get failed ("+e.mode+"): "+e.getMessage();
+                       errors.add("Get failed (" + e.mode + "): " + 
e.getMessage());
                } catch (IOException e) {
-                       error = "io error";
+                       errors.add("IO Error: " + e.getMessage());
                } catch (MetadataParseException e) {
-                       error = "MetadataParseException";
+                       errors.add("MetadataParseException");
                } catch (LowLevelGetException e) {
-                       error = "get failed ("+e.code+"): "+e.getMessage();
+                       errors.add("Get failed (" + e.code + "): " + 
e.getMessage());
                }
 
-               if (error != null) {
-                       contentNode.addChild(createErrorBox(error));
-                       contentNode.addChild(createUriBox());
+               if (errors.size() > 0) {
+                       contentNode.addChild(createErrorBox(errors, null, 
null));
+                       contentNode.addChild(createUriBox(furi.toString(false, 
false), hexWidth, automf, deep, errors));
                        return pageNode.generate();
                }
 
-               contentNode.addChild(createUriBox());
-               String title = "Key: " + furi.toString()  + "\u00a0(Manifest)";
+               contentNode.addChild(createUriBox(furi.toString(false, false), 
hexWidth, automf, deep, errors));
+               String title = "Key: " + furi.toString(false, false) + 
"\u00a0(Manifest)";
                HTMLNode listBox = m_pm.getInfobox(title);
-               contentNode.addChild(listBox);
-               
+
                HashMap<String, Metadata> docs = metadata.getDocuments();
 
-               parseMetadata(listBox, docs, "", furi.toString());
+               // HTMLNode contentTable = contentNode.addChild("table", 
"class",
+               // "column");
+               HTMLNode contentTable = listBox.addChild("table");
+               HTMLNode tableHead = contentTable.addChild("thead");
+               HTMLNode tableRow = tableHead.addChild("tr");
+               HTMLNode nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "\u00a0");
+               nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "Type");
+               nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "Name");
+               nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "Size");
+               nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "Mime");
+               nextTableCell = tableRow.addChild("th");
+               nextTableCell.addChild("#", "Target");
 
+               parseMetadata(contentTable, docs, "", furi.toString(false, 
false), errors);
+               if (errors.size() > 0) {
+                       contentNode.addChild(createErrorBox(errors, null, 
null));
+               }
+               contentNode.addChild(listBox);
                return pageNode.generate();
 
        }
-       
-       private void parseMetadata(HTMLNode htmlnode, HashMap<String, Metadata> 
docs, String prefix, String furi) {
+
+       private void addEmptyCell(HTMLNode tableRow) {
+               HTMLNode tableCell = tableRow.addChild("td");
+               tableCell.addChild("#", "\u00a0");
+       }
+
+       private void parseMetadata(HTMLNode htmlTable, HashMap<String, 
Metadata> docs, String prefix, String furi, List<String> errors) {
                Set<String> s = docs.keySet();
                Iterator<String> i = s.iterator();
                while (i.hasNext()) {
+                       HTMLNode htmlTableRow = htmlTable.addChild("tr");
+                       addEmptyCell(htmlTableRow);
+                       HTMLNode nextTableCell = htmlTableRow.addChild("td");
                        String name = i.next();
                        Metadata md = docs.get(name);
                        String fname = prefix + name;
-                       
+
                        if (md.isArchiveInternalRedirect())
-                               htmlnode.addChild("#", "(container)\u00a0");
+                               nextTableCell.addChild("#", 
"(container)\u00a0");
                        if (md.isArchiveManifest())
-                               htmlnode.addChild("#", "(archive)\u00a0");
+                               nextTableCell.addChild("#", "(archive)\u00a0");
                        if (md.isCompressed())
-                               htmlnode.addChild("#", "(compress)\u00a0");
+                               nextTableCell.addChild("#", "(compress)\u00a0");
                        if (md.isMultiLevelMetadata())
-                               htmlnode.addChild("#", "(multilevel)\u00a0");
+                               nextTableCell.addChild("#", 
"(multilevel)\u00a0");
                        if (md.isResolved())
-                               htmlnode.addChild("#", "(resolved)\u00a0");
+                               nextTableCell.addChild("#", "(resolved)\u00a0");
                        if (md.isSimpleManifest())
-                               htmlnode.addChild("#", 
"(simple-manifest)\u00a0");
+                               nextTableCell.addChild("#", 
"(simple-manifest)\u00a0");
                        if (md.isSimpleSplitfile())
-                               htmlnode.addChild("#", "(simple-splitf)\u00a0");
+                               nextTableCell.addChild("#", 
"(simple-splitf)\u00a0");
                        else if (md.isSplitfile())
-                               htmlnode.addChild("#", "(splitf)\u00a0");
+                               nextTableCell.addChild("#", "(splitf)\u00a0");
                        if (md.isSingleFileRedirect())
-                               htmlnode.addChild("#", "(extern)\u00a0");
-                       
-                       
+                               nextTableCell.addChild("#", "(extern)\u00a0");
+
+                       nextTableCell = htmlTableRow.addChild("td");
+
                        if (md.isArchiveInternalRedirect()) {
-                               htmlnode.addChild(new HTMLNode("a", "href", 
"/?key=" + furi + "/" + fname, fname));
-                               htmlnode.addChild("%", "<BR />");
-               } else if (md.isSingleFileRedirect()) {
-                       htmlnode.addChild(new HTMLNode("a", "href", "/?key=" + 
furi + "/" + fname, fname));
-                       htmlnode.addChild("#", "\u00a0");
-                               htmlnode.addChild(new HTMLNode("a", "href", 
"/plugins/plugins.KeyExplorer.KeyExplorer/?key=" + 
md.getSingleTarget().toString(), "explore"));
-                               htmlnode.addChild("%", "<BR />");
-               } else if (md.isSplitfile()) {
-                       htmlnode.addChild(new HTMLNode("a", "href", "/?key=" + 
furi + "/" + fname, fname));
-                               htmlnode.addChild("%", "<BR />");
-               } else {
-                       htmlnode.addChild("#", fname);
-                               htmlnode.addChild("%", "<BR />");
-                               parseMetadata(htmlnode, md.getDocuments(), 
fname + "/", furi);
-               }
-       }
-               
+                               nextTableCell.addChild(new HTMLNode("a", 
"href", "/" + furi + "/" + fname, fname));
+                               addEmptyCell(htmlTableRow);
+                               nextTableCell = htmlTableRow.addChild("td");
+                               nextTableCell.addChild("#", md.getMIMEType());
+                               addEmptyCell(htmlTableRow);
+                       } else if (md.isSingleFileRedirect()) {
+                               nextTableCell.addChild(new HTMLNode("a", 
"href", "/?key=" + furi + "/" + fname, fname));
+                               addEmptyCell(htmlTableRow);
+                               nextTableCell = htmlTableRow.addChild("td");
+                               nextTableCell.addChild("#", md.getMIMEType());
+                               nextTableCell = htmlTableRow.addChild("td");
+                               if (md.isArchiveManifest()) {
+                                       String containerTarget = 
md.getSingleTarget().toString(false, false);
+                                       nextTableCell.addChild(new 
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?mftype=" + 
md.getArchiveType().name() + "manifest&key=" + containerTarget, 
containerTarget));
+                                       Metadata subMd;
+                                       if (md.getArchiveType() == 
ARCHIVE_TYPE.TAR) {
+                                               try {
+                                                       subMd = 
tarManifestGet(md.getSingleTarget());
+                                                       
parseMetadata(htmlTable, subMd.getDocuments(), fname + "/", furi, errors);
+                                               } catch (FetchException e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (MetadataParseException 
e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (IOException e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               }
+                                       }
+                               } else {
+                                       nextTableCell.addChild(new 
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?key=" + 
md.getSingleTarget().toString(false, false), 
md.getSingleTarget().toString(false, false)));
+                                       // Multi level stuff
+
+                                       FreenetURI mlUri = md.getSingleTarget();
+                                       if ((mlUri.getExtra()[2] & 0x02) != 0) 
{ // control document?
+                                               //System.out.println("May ML 
target: " + mlUri.toString(false, false));
+                                               try {
+                                                       Metadata subMd = 
simpleManifestGet(m_pr, mlUri);
+                                                       if 
(subMd.isMultiLevelMetadata()) {
+                                                               
//System.out.println("is ML target: " + mlUri.toString(false, false));
+                                                               
subMd.getResolvedURI();
+                                                               if 
(subMd.isSingleFileRedirect()) {
+                                                                       
//System.out.println("try get ML target: " + mlUri.toString(false, false));
+                                                                       subMd = 
splitManifestGet(subMd);
+                                                                       
parseMetadata(htmlTable, subMd.getDocuments(), fname + "/", furi, errors);
+                                                                       
//System.out.println("brrrstlhipf!!!!!!!!!!");
+                                                               } else {
+                                                                       
//System.out.println("seems splitfile ML target: " + mlUri.toString(false, 
false));
+                                                                       
//System.out.println("try this: " + subMd.getSingleTarget());
+                                                               }
+                                                       } else {
+                                                               
//System.out.println("no ML target: " + mlUri.toString(false, false));
+                                                       }
+                                               } catch (MalformedURLException 
e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (LowLevelGetException 
e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (MetadataParseException 
e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (IOException e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch (FetchException e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               } catch 
(KeyListenerConstructionException e) {
+                                                       // TODO Auto-generated 
catch block
+                                                       e.printStackTrace();
+                                               }
+                                       } else {
+                                               //System.out.println("NO! ML 
target: " + mlUri.toString(false, false));
+                                       }
+                               }
+                       } else if (md.isSimpleSplitfile()) {
+                               nextTableCell.addChild(new HTMLNode("a", 
"href", "/?key=" + furi + "/" + fname, fname));
+                               nextTableCell = htmlTableRow.addChild("td");
+                               if (md.isCompressed()) {
+                                       nextTableCell.addChild("#", 
Long.toString(md.uncompressedDataLength()));
+                               } else {
+                                       nextTableCell.addChild("#", 
Long.toString(md.dataLength()));
+                               }
+                               nextTableCell = htmlTableRow.addChild("td");
+                               nextTableCell.addChild("#", md.getMIMEType());
+                               addEmptyCell(htmlTableRow);
+                       } else if (md.isSplitfile()) {
+                               nextTableCell.addChild(new HTMLNode("a", 
"href", "/?key=" + furi + "/" + fname, fname));
+                               addEmptyCell(htmlTableRow);
+                               addEmptyCell(htmlTableRow);
+                               addEmptyCell(htmlTableRow);
+                       } else {
+                               nextTableCell.addChild("#", fname);
+                               nextTableCell = htmlTableRow.addChild("td");
+                               nextTableCell.addChild("#", "(");
+                               nextTableCell.addChild("#", 
Integer.toString(md.getDocuments().size()));
+                               nextTableCell.addChild("#", " Items)");
+                               addEmptyCell(htmlTableRow);
+                               addEmptyCell(htmlTableRow);
+                               parseMetadata(htmlTable, md.getDocuments(), 
fname + "/", furi, errors);
+                       }
+               }
        }
 
-       private HTMLNode createUriBox() {
+       private HTMLNode createUriBox(String uri, int hexWidth, boolean automf, 
boolean deep, List<String> errors) {
                HTMLNode browseBox = m_pm.getInfobox("Explore a freenet key");
                HTMLNode browseContent = m_pm.getContentNode(browseBox);
-               browseContent.addChild("#", "Display the top level chunk as 
hexprint");
+
+               if (hexWidth < 1 || hexWidth > 1024) {
+                       errors.add("Hex display columns out of range. (1-1024). 
Set to 32 (default).");
+                       hexWidth = 32;
+               }
+               browseContent.addChild("#", "Display the top level chunk as 
hexprint or list the content of a manifest");
                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" });
+               if (uri != null)
+                       browseForm.addChild("input", new String[] { "type", 
"name", "size", "value" }, new String[] { "text", "key", "70", uri });
+               else
+                       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!" });
+               browseForm.addChild("%", "<BR />");
+               if (automf)
+                       browseForm.addChild("input", new String[] { "type", 
"name", "value", "checked" }, new String[] { "checkbox", "automf", "ok", 
"checked" });
+               else
+                       browseForm.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "checkbox", "automf", "ok" });
+               browseForm.addChild("#", "\u00a0auto open as manifest if 
possible\u00a0");
+               if (deep)
+                       browseForm.addChild("input", new String[] { "type", 
"name", "value", "checked" }, new String[] { "checkbox", "deep", "ok", 
"checked" });
+               else
+                       browseForm.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "checkbox", "deep", "ok" });
+               browseForm.addChild("#", "\u00a0parse manifest recursive 
(include multilevel metadata/subcontainers)\u00a0\u00a0");
+               browseForm.addChild("#", "Hex display columns:\u00a0");
+               browseForm.addChild("input", new String[] { "type", "name", 
"size", "value" }, new String[] { "text", "hexWidth", "3", 
Integer.toString(hexWidth) });
                return browseBox;
        }
 
-       private HTMLNode createErrorBox(String errmsg) {
+       private HTMLNode createErrorBox(List<String> errors, FreenetURI 
retryUri, String extraParams) {
+
                HTMLNode errorBox = m_pm.getInfobox("infobox-alert", "ERROR");
-               errorBox.addChild("#", errmsg);
+               for (String error : errors) {
+                       errorBox.addChild("#", error);
+                       errorBox.addChild("%", "<BR />");
+               }
+               if (retryUri != null) {
+                       errorBox.addChild("#", "Retry: ");
+                       errorBox.addChild(new HTMLNode("a", "href", 
"/plugins/plugins.KeyExplorer.KeyExplorer?key="
+                                       + ((extraParams == null) ? retryUri : 
(retryUri + "?" + extraParams)), retryUri.toString(false, false)));
+               }
                return errorBox;
        }
 
        public String getVersion() {
-               return "0.3 r"+ Version.svnRevision;
+               return "0.4α " + Version.svnRevision;
        }
 
-       public long getRealVersion() {
-               return Version.version;
-       }
-       
-       private Metadata simpleManifestGet(FreenetURI uri) throws 
MetadataParseException, LowLevelGetException, IOException {
+       // unroll until it hit a ARCHIVE_MANIFEST, return this
+       private Metadata archiveManifestGet(FreenetURI uri) throws 
MetadataParseException, LowLevelGetException, IOException {
                GetResult res = simpleGet(m_pr, uri);
                if (!res.isMetaData()) {
+                       throw new MetadataParseException("Uri did not point to 
metadata " + uri);
+               }
+               Metadata md = Metadata.construct(res.getData());
+               if (md.isArchiveManifest())
+                       return md;
+               return archiveManifestGet(md);
+       }
+
+       private Metadata archiveManifestGet(Metadata md) throws 
MetadataParseException, LowLevelGetException, IOException {
+               // GetResult res = simpleGet(uri);
+               // if (!res.isMetaData()) {
+               // throw new MetadataParseException("Uri did not point to 
metadata " +
+               // uri);
+               // }
+               // Metadata md = Metadata.construct(res.getData());
+               // if (md.isArchiveManifest())
+               // return md;
+               // return archiveManifestGet(md);
+               return md;
+       }
+
+       public static Metadata simpleManifestGet(PluginRespirator pr, 
FreenetURI uri) throws MetadataParseException, LowLevelGetException, 
IOException {
+               GetResult res = simpleGet(pr, uri);
+               if (!res.isMetaData()) {
                        throw new MetadataParseException("uri did not point to 
metadata " + uri);
                }
                return Metadata.construct(res.getData());
        }
-       
-       private Metadata zipManifestGet(FreenetURI uri) throws FetchException, 
MetadataParseException, IOException{
+
+       private Metadata splitManifestGet(Metadata metadata) throws 
MetadataParseException, LowLevelGetException, IOException, FetchException, 
KeyListenerConstructionException {
+               FetchResult res = splitGet(metadata);
+               return Metadata.construct(res.asBucket());
+       }
+
+       private Metadata zipManifestGet(FreenetURI uri) throws FetchException, 
MetadataParseException, IOException {
                HighLevelSimpleClient hlsc = m_pr.getHLSimpleClient();
                FetchContext fctx = hlsc.getFetchContext();
                fctx.returnZIPManifests = true;
-               //fctx.r
                FetchWaiter fw = new FetchWaiter();
                hlsc.fetch(uri, -1, (RequestClient) hlsc, fw, fctx);
                FetchResult fr = fw.waitForCompletion();
                ZipInputStream zis = new 
ZipInputStream(fr.asBucket().getInputStream());
                ZipEntry entry;
                ByteArrayOutputStream bos;
-               while(true) {
+               while (true) {
                        entry = zis.getNextEntry();
-                       if(entry == null) break;
-                       if(entry.isDirectory()) continue;
+                       if (entry == null)
+                               break;
+                       if (entry.isDirectory())
+                               continue;
                        String name = entry.getName();
-                       if(".metadata".equals(name)) {
+                       if (".metadata".equals(name)) {
                                byte[] buf = new byte[32768];
                                bos = new ByteArrayOutputStream();
                                // Read the element
                                int readBytes;
-                               while((readBytes = zis.read(buf)) > 0) {
+                               while ((readBytes = zis.read(buf)) > 0) {
                                        bos.write(buf, 0, readBytes);
                                }
                                bos.close();
@@ -524,29 +869,30 @@
                }
                throw new FetchException(200, "impossible? no metadata in 
archive " + uri);
        }
-       
-       private Metadata tarManifestGet(FreenetURI uri) throws FetchException, 
MetadataParseException, IOException{
+
+       private Metadata tarManifestGet(FreenetURI uri) throws FetchException, 
MetadataParseException, IOException {
                HighLevelSimpleClient hlsc = m_pr.getHLSimpleClient();
                FetchContext fctx = hlsc.getFetchContext();
                fctx.returnZIPManifests = true;
-               //fctx.r
                FetchWaiter fw = new FetchWaiter();
                hlsc.fetch(uri, -1, (RequestClient) hlsc, fw, fctx);
                FetchResult fr = fw.waitForCompletion();
                TarInputStream zis = new 
TarInputStream(fr.asBucket().getInputStream());
                TarEntry entry;
                ByteArrayOutputStream bos;
-               while(true) {
+               while (true) {
                        entry = zis.getNextEntry();
-                       if(entry == null) break;
-                       if(entry.isDirectory()) continue;
+                       if (entry == null)
+                               break;
+                       if (entry.isDirectory())
+                               continue;
                        String name = entry.getName();
-                       if(".metadata".equals(name)) {
+                       if (".metadata".equals(name)) {
                                byte[] buf = new byte[32768];
                                bos = new ByteArrayOutputStream();
                                // Read the element
                                int readBytes;
-                               while((readBytes = zis.read(buf)) > 0) {
+                               while ((readBytes = zis.read(buf)) > 0) {
                                        bos.write(buf, 0, readBytes);
                                }
                                bos.close();
@@ -556,7 +902,6 @@
                throw new FetchException(200, "impossible? no metadata in 
archive " + uri);
        }
 
-
        public String getString(String key) {
                // TODO Auto-generated method stub
                return key;
@@ -565,4 +910,8 @@
        public void setLanguage(LANGUAGE selectedLanguage) {
                // TODO Auto-generated method stub
        }
+
+       public long getRealVersion() {
+               return Version.version;
+       }
 }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to