Author: toad
Date: 2008-01-17 21:30:44 +0000 (Thu, 17 Jan 2008)
New Revision: 17105

Added:
   trunk/freenet/src/freenet/node/VersionParseException.java
Modified:
   trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
Don't throw the uncaught NumberFormatException, throw a new 
VersionParseException and catch it properly.
Various minor fixes relating to version - e.g. we try to parse a version, and 
probably NFE, even if it's a partial.

Modified: trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-01-17 18:46:14 UTC (rev 17104)
+++ trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-01-17 21:30:44 UTC (rev 17105)
@@ -89,7 +89,7 @@
                        }else if(sortBy.equals("location")){
                                return compareLocations(firstNode, secondNode);
                        }else if(sortBy.equals("version")){
-                               return 
Version.getArbitraryBuildNumber(firstNode.getVersion()) - 
Version.getArbitraryBuildNumber(secondNode.getVersion());
+                               return 
Version.getArbitraryBuildNumber(firstNode.getVersion(), -1) - 
Version.getArbitraryBuildNumber(secondNode.getVersion(), -1);
                        }else
                                return 0;
                }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2008-01-17 18:46:14 UTC (rev 
17104)
+++ trunk/freenet/src/freenet/node/Node.java    2008-01-17 21:30:44 UTC (rev 
17105)
@@ -483,7 +483,7 @@
                        Logger.error(this, "No version!");
                        System.err.println("No version!");
                } else {
-                       lastVersion = 
Version.getArbitraryBuildNumber(verString);
+                       lastVersion = 
Version.getArbitraryBuildNumber(verString, -1);
                }

                wasTestnet = Fields.stringToBool(fs.get("testnet"), false);

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2008-01-17 18:46:14 UTC 
(rev 17104)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2008-01-17 21:30:44 UTC 
(rev 17105)
@@ -762,7 +762,7 @@
                if(logMINOR) Logger.minor(this, "Skipping (routing backed off): 
"+p.getPeer());
                continue;
             }
-            if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion()) < minVersion) {
+            if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion(), -1) < minVersion) {
                if(logMINOR) Logger.minor(this, "Skipping old version: 
"+p.getPeer());
                continue;
             }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-01-17 18:46:14 UTC 
(rev 17104)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-01-17 21:30:44 UTC 
(rev 17105)
@@ -338,7 +338,11 @@
                this.backedOffPercent = new TimeDecayingRunningAverage(0.0, 
180000, 0.0, 1.0, node);
                version = fs.get("version");
                Version.seenVersion(version);
-               simpleVersion = Version.getArbitraryBuildNumber(version);
+               try {
+                       simpleVersion = 
Version.getArbitraryBuildNumber(version);
+               } catch (VersionParseException e2) {
+                       throw new FSParseException("Invalid version "+version+" 
: "+e2);
+               }
                String locationString = fs.get("location");
                try {
                        currentLocation = Location.getLocation(locationString);
@@ -1713,7 +1717,7 @@
                        //FIXME: It looks like bogusNoderef will just be set to 
false a few lines later...
                } else if(reverseInvalidVersion()) {
                        try {
-                               
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(getLastGoodVersion()));
+                               
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(getLastGoodVersion(),
 Version.lastGoodBuild()));
                        } catch(NumberFormatException e) {
                        // ignore
                        }
@@ -2084,7 +2088,13 @@
                        if(!newVersion.equals(version))
                                changedAnything = true;
                        version = newVersion;
-                       simpleVersion = 
Version.getArbitraryBuildNumber(version);
+                       if(version != null) {
+                               try {
+                                       simpleVersion = 
Version.getArbitraryBuildNumber(version);
+                               } catch (VersionParseException e) {
+                                       Logger.error(this, "Bad version: 
"+simpleVersion+" : "+e, e);
+                               }
+                       }
                        Version.seenVersion(newVersion);
                }
                String newLastGoodVersion = fs.get("lastGoodVersion");
@@ -2967,7 +2977,7 @@
        }

        public int getVersionNumber() {
-               return Version.getArbitraryBuildNumber(getVersion());
+               return Version.getArbitraryBuildNumber(getVersion(), -1);
        }

        public PacketThrottle getThrottle() {

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2008-01-17 18:46:14 UTC (rev 
17104)
+++ trunk/freenet/src/freenet/node/Version.java 2008-01-17 21:30:44 UTC (rev 
17105)
@@ -287,20 +287,34 @@
         * @return the build number of an arbitrary version string
         */
        public static final int getArbitraryBuildNumber(
-               String version ) {
+               String version ) throws VersionParseException {
            if(version == null) {
                Logger.error(Version.class, "version == null!",
                        new Exception("error"));
-               throw new NumberFormatException();
+               throw new VersionParseException("version == null");
            }
                String[] v = Fields.commaList(version);

                if ((v.length < 3) || !goodProtocol(v[2])) {
-               throw new NumberFormatException();
+                       throw new VersionParseException("not long enough or bad 
protocol: "+version);
                }
-               return Integer.parseInt(v[3]);
+               try {
+                       return Integer.parseInt(v[3]);
+               } catch (NumberFormatException e) {
+                       VersionParseException ve = new 
VersionParseException("Got NumberFormatException on "+v[3]+" : "+e+" for 
"+version);
+                       ve.initCause(e);
+                       throw ve;
+               }
        }

+       public static final int getArbitraryBuildNumber(
+                       String version, int defaultValue ) {
+               try {
+                       return getArbitraryBuildNumber(version);
+               } catch (VersionParseException e) {
+                       return defaultValue;
+               }
+       }
        /**
         * Update static variable highestSeenBuild anytime we encounter
         * a new node with a higher version than we've seen before

Added: trunk/freenet/src/freenet/node/VersionParseException.java
===================================================================
--- trunk/freenet/src/freenet/node/VersionParseException.java                   
        (rev 0)
+++ trunk/freenet/src/freenet/node/VersionParseException.java   2008-01-17 
21:30:44 UTC (rev 17105)
@@ -0,0 +1,13 @@
+package freenet.node;
+
+/**
+ * Unchecked exception thrown by Version.getArbitraryBuildNumber()
+ * @author toad
+ */
+public class VersionParseException extends Exception {
+
+       public VersionParseException(String msg) {
+               super(msg);
+       }
+
+}


Reply via email to