Author: sashee
Date: 2009-03-28 15:31:47 +0000 (Sat, 28 Mar 2009)
New Revision: 26255

Modified:
   trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
Log:
Improved the peer adder module:
-It is now possible to add multiple peers, instead of just 1. A result page 
will notify about the successes/failures
-The 2000 byte limit for uploading peers via file is removed

Modified: trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2009-03-28 12:42:05 UTC (rev 26254)
+++ trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2009-03-28 15:31:47 UTC (rev 26255)
@@ -145,6 +145,7 @@
        protected final PeerManager peers;
        protected boolean isReversed = false;
        protected final DecimalFormat fix1 = new DecimalFormat("##0.0%");
+       public enum PeerAdditionReturnCodes{ OK, WRONG_ENCODING, CANT_PARSE, 
INTERNAL_ERROR, INVALID_SIGNATURE, TRY_TO_ADD_SELF, ALREADY_IN_REFERENCE}
        
        @Override
        public String supportedMethods() {
@@ -511,7 +512,7 @@
                        String reftext = request.getPartAsString("ref", 
Integer.MAX_VALUE);
                        reftext = reftext.trim();
                        if (reftext.length() < 200) {
-                               reftext = request.getPartAsString("reffile", 
2000);
+                               reftext = request.getPartAsString("reffile", 
Integer.MAX_VALUE);
                                reftext = reftext.trim();
                        }
                        String privateComment = null;
@@ -551,60 +552,47 @@
                        ref = new StringBuilder(ref.toString().trim());
 
                        request.freeParts();
-                       // we have a node reference in ref
-                       SimpleFieldSet fs;
-                       
-                       try {
-                               fs = new SimpleFieldSet(ref.toString(), false, 
true);
-                               if(!fs.getEndMarker().endsWith("End")) {
-                                       sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"),
-                                                       
L10n.getString("DarknetConnectionsToadlet.cantParseWrongEnding", new String[] { 
"end" }, new String[] { fs.getEndMarker() }));
-                                       return;
+
+                       //Split the references string, because the peers are 
added individually
+                       String[] nodesToAdd=ref.toString().split("End");
+                       //The peer's additions results
+                       Map<PeerAdditionReturnCodes,Integer> results=new 
HashMap<PeerAdditionReturnCodes, Integer>();
+                       for(int i=0;i<nodesToAdd.length;i++){
+                               //We need to trim then concat 'End' to the 
node's reference, this way we have a normal reference(the split() removes the 
'End'-s!)
+                               PeerAdditionReturnCodes 
result=addNewNode(nodesToAdd[i].trim().concat("\nEnd"), privateComment);
+                               //Store the result
+                               if(results.containsKey(result)==false){
+                                       results.put(result, new Integer(0));
                                }
-                               fs.setEndMarker("End"); // It's always End ; 
the regex above doesn't always grok this
-                       } catch (IOException e) {
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), 
-                                               
L10n.getString("DarknetConnectionsToadlet.cantParseTryAgain", new String[] { 
"error" }, new String[] { e.toString() }));
-                               return;
-                       } catch (Throwable t) {
-                               this.sendErrorPage(ctx, 
l10n("failedToAddNodeInternalErrorTitle"), 
l10n("failedToAddNodeInternalError"), t);
-                               return;
+                               results.put(result, results.get(result)+1);
                        }
-                       PeerNode pn;
-                       try {
-                               if(isOpennet()) {
-                                       pn = node.createNewOpennetNode(fs);
-                               } else {
-                                       pn = node.createNewDarknetNode(fs);
-                                       
((DarknetPeerNode)pn).setPrivateDarknetCommentNote(privateComment);
+                       
+                       HTMLNode pageNode = 
ctx.getPageMaker().getPageNode(l10n("reportOfNodeAddition"), ctx);
+                       HTMLNode contentNode = 
ctx.getPageMaker().getContentNode(pageNode);
+                       
+                       //We create a table to show the results
+                       HTMLNode detailedStatusBox=new HTMLNode("table");
+                       //Header of the table
+                       detailedStatusBox.addChild(new 
HTMLNode("tr")).addChildren(new HTMLNode[]{new 
HTMLNode("th",l10n("resultName")),new HTMLNode("th",l10n("numOfResults"))});
+                       HTMLNode statusBoxTable=detailedStatusBox.addChild(new 
HTMLNode("tbody"));
+                       //Iterate through the return codes
+                       for(PeerAdditionReturnCodes 
returnCode:PeerAdditionReturnCodes.values()){
+                               if(results.containsKey(returnCode)){
+                                       //Add a <tr> and 2 <td> with the name 
of the code and the number of occasions it happened. If the code is OK, we use 
green, red elsewhere.
+                                       statusBoxTable.addChild(new 
HTMLNode("tr","style","color:"+(returnCode==PeerAdditionReturnCodes.OK?"green":"red"))).addChildren(new
 HTMLNode[]{new 
HTMLNode("td",l10n("peerAdditionCode."+returnCode.toString())),new 
HTMLNode("td",results.get(returnCode).toString())});
                                }
-                       } catch (FSParseException e1) {
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"),
-                                               
L10n.getString("DarknetConnectionsToadlet.cantParseTryAgain", new String[] { 
"error" }, new String[] { e1.toString() }));
-                               return;
-                       } catch (PeerParseException e1) {
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), 
-                                               
L10n.getString("DarknetConnectionsToadlet.cantParseTryAgain", new String[] { 
"error" }, new String[] { e1.toString() }));
-                               return;
-                       } catch (ReferenceSignatureVerificationException e1){
-                               HTMLNode node = new HTMLNode("div");
-                               node.addChild("#", 
L10n.getString("DarknetConnectionsToadlet.invalidSignature", new String[] { 
"error" }, new String[] { e1.toString() }));
-                               node.addChild("br");
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), node);
-                               return;
-                       } catch (Throwable t) {
-                               this.sendErrorPage(ctx, 
l10n("failedToAddNodeInternalErrorTitle"), 
l10n("failedToAddNodeInternalError"), t);
-                               return;
                        }
-                       if(Arrays.equals(pn.getIdentity(), 
node.getDarknetIdentity())) {
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), l10n("triedToAddSelf"));
-                               return;
-                       }
-                       if(!this.node.addPeerConnection(pn)) {
-                               this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), l10n("alreadyInReferences"));
-                               return;
-                       }
+
+                       HTMLNode infobox = 
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox",l10n("reportOfNodeAddition")));
+                       HTMLNode infoboxContent = 
ctx.getPageMaker().getContentNode(infobox);
+                       infoboxContent.addChild(detailedStatusBox);
+                       infoboxContent.addChild("br");
+                       infoboxContent.addChild("a", "href", ".", 
l10n("returnToPrevPage"));
+                       infoboxContent.addChild("br");
+                       addHomepageLink(infoboxContent);
                        
+                       writeHTMLReply(ctx, 500, l10n("reportOfNodeAddition"), 
pageNode.generate());
+                       
                        MultiValueTable<String, String> headers = new 
MultiValueTable<String, String>();
                        headers.put("Location", defaultRedirectLocation());
                        ctx.sendReplyHeaders(302, "Found", headers, null, 0);
@@ -613,6 +601,50 @@
                
                
        }
+       
+       /** Adds a new node. If any error arises, it returns the appropriate 
return code.
+        * @param nodeReference - The reference to the new node
+        * @param privateComment - The private comment when adding a Darknet 
node
+        * @return The result of the addition*/
+       private PeerAdditionReturnCodes addNewNode(String nodeReference,String 
privateComment){
+               SimpleFieldSet fs;
+               
+               try {
+                       fs = new SimpleFieldSet(nodeReference.toString(), 
false, true);
+                       if(!fs.getEndMarker().endsWith("End")) {
+                               return PeerAdditionReturnCodes.WRONG_ENCODING;
+                       }
+                       fs.setEndMarker("End"); // It's always End ; the regex 
above doesn't always grok this
+               } catch (IOException e) {
+                       return PeerAdditionReturnCodes.CANT_PARSE;
+               } catch (Throwable t) {
+                       return PeerAdditionReturnCodes.INTERNAL_ERROR;
+               }
+               PeerNode pn;
+               try {
+                       if(isOpennet()) {
+                               pn = node.createNewOpennetNode(fs);
+                       } else {
+                               pn = node.createNewDarknetNode(fs);
+                               
((DarknetPeerNode)pn).setPrivateDarknetCommentNote(privateComment);
+                       }
+               } catch (FSParseException e1) {
+                       return PeerAdditionReturnCodes.CANT_PARSE;
+               } catch (PeerParseException e1) {
+                       return PeerAdditionReturnCodes.CANT_PARSE;
+               } catch (ReferenceSignatureVerificationException e1){
+                       return PeerAdditionReturnCodes.INVALID_SIGNATURE;
+               } catch (Throwable t) {
+                       return PeerAdditionReturnCodes.INTERNAL_ERROR;
+               }
+               if(Arrays.equals(pn.getIdentity(), node.getDarknetIdentity())) {
+                       return PeerAdditionReturnCodes.TRY_TO_ADD_SELF;
+               }
+               if(!this.node.addPeerConnection(pn)) {
+                       return PeerAdditionReturnCodes.ALREADY_IN_REFERENCE;
+               }
+               return PeerAdditionReturnCodes.OK;
+       }
 
        /** Adding a darknet node or an opennet node? */
        protected abstract boolean isOpennet();

Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2009-03-28 
12:42:05 UTC (rev 26254)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2009-03-28 
15:31:47 UTC (rev 26255)
@@ -168,7 +168,7 @@
 ContentFilter.textPlainWriteAdvice=Plain text - not dangerous unless you 
include compromizing information
 DarknetConnectionsToadlet.activityTitle=Current Activity
 DarknetConnectionsToadlet.add=Add
-DarknetConnectionsToadlet.addPeerTitle=Add another peer
+DarknetConnectionsToadlet.addPeerTitle=Add another peers
 DarknetConnectionsToadlet.alreadyInReferences=We already have the given 
reference.
 DarknetConnectionsToadlet.backedOff=Connected but backed off: These peers are 
connected but we're backed off from them, so the node is not routing requests 
to them.
 DarknetConnectionsToadlet.backedOffShort=Backed off
@@ -254,6 +254,17 @@
 DarknetConnectionsToadlet.updateChangedPrivnotes=Update changed private notes
 DarknetConnectionsToadlet.urlReference=OR enter the URL of the node reference 
here:
 DarknetConnectionsToadlet.versionTitle=Version
+DarknetConnectionsToadlet.reportOfNodeAddition=Report of node additions
+DarknetConnectionsToadlet.returnToPrevPage=Return to previous page
+DarknetConnectionsToadlet.peerAdditionCode.OK=Added successfully
+DarknetConnectionsToadlet.peerAdditionCode.TRY_TO_ADD_SELF=Tried to add self
+DarknetConnectionsToadlet.peerAdditionCode.WRONG_ENCODING=Wrong encoding
+DarknetConnectionsToadlet.peerAdditionCode.CANT_PARSE=Can't parse
+DarknetConnectionsToadlet.peerAdditionCode.INTERNAL_ERROR=Internal error
+DarknetConnectionsToadlet.peerAdditionCode.INVALID_SIGNATURE=Invalid signature
+DarknetConnectionsToadlet.peerAdditionCode.ALREADY_IN_REFERENCE=Already in 
reference
+DarknetConnectionsToadlet.resultName=Name of result
+DarknetConnectionsToadlet.numOfResults=Number of results
 ExtOldAgeUserAlert.extTooOld=Your freenet-ext.jar file seems to be outdated: 
we strongly advise you to update it using 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext too old
 ExtOldAgeUserAlert.extTooOldShort=Your freenet-ext.jar is out of date. Please 
upgrade.

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

Reply via email to