Author: nextgens
Date: 2007-03-06 00:59:57 +0000 (Tue, 06 Mar 2007)
New Revision: 11988

Modified:
   trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
   trunk/freenet/src/freenet/node/LocationManager.java
   trunk/freenet/src/freenet/node/Node.java
Log:
That code is probably better... but it gives a ClassCast exception why trying 
to access the StatisticsToadlet.

Any idea why? How can it be fixed?

Modified: trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-03-05 23:36:13 UTC (rev 11987)
+++ trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-03-06 00:59:57 UTC (rev 11988)
@@ -8,7 +8,6 @@
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;

@@ -600,7 +599,9 @@
                nodeCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { generatePeerCircleStyleString(0.875, false, 
1.0), "mark" }, "+");
                nodeCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { generatePeerCircleStyleString(0.875, false, 
1.0), "mark" }, "+");
                nodeCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { "position: absolute; top: " + 
PEER_CIRCLE_RADIUS + "px; left: " + (PEER_CIRCLE_RADIUS + 
PEER_CIRCLE_ADDITIONAL_FREE_SPACE) + "px", "mark" }, "+");
-               LinkedHashMap knownLocsCopy = node.getKnownLocations(-1);
+               final Object[] knownLocsCopy = node.getKnownLocations(-1);
+               final Double[] locations = (Double[])knownLocsCopy[0];
+               final Long[] timestamps = (Long[])knownLocsCopy[1];
                Double location = new Double(0.0);
                Long locationTime = new Long(0);
                double strength = 1.0;
@@ -608,11 +609,10 @@
                long age = 1;
                int histogramIndex;
                int nodeCount = 0;
-               Iterator knownLocationsIterator = 
knownLocsCopy.keySet().iterator();
-               while (knownLocationsIterator.hasNext()) {
+               for(int i=0; i<locations.length; i++){
                        nodeCount += 1;
-                       location = (Double) knownLocationsIterator.next();
-                       locationTime = (Long) knownLocsCopy.get(location);
+                       location = locations[i];
+                       locationTime = timestamps[i];
                        age = now - locationTime.longValue();
                        if( age > MAX_CIRCLE_AGE_THRESHOLD ) {
                                age = MAX_CIRCLE_AGE_THRESHOLD;

Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2007-03-05 23:36:13 UTC 
(rev 11987)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2007-03-06 00:59:57 UTC 
(rev 11988)
@@ -6,10 +6,10 @@
 import java.security.MessageDigest;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.LinkedHashMap;
+import java.util.SortedMap;
+import java.util.TreeMap;
 import java.util.Vector;
 import java.util.Date;
-import java.util.Iterator;

 import freenet.crypt.RandomSource;
 import freenet.crypt.SHA256;
@@ -1025,7 +1025,7 @@
         recentlyForwardedIDs.remove(new Long(item.outgoingID));
     }

-    private final LinkedHashMap knownLocs = new LinkedHashMap();
+    private final TreeMap knownLocs = new TreeMap();

     void registerLocationLink(double d, double t) {
        if(logMINOR) Logger.minor(this, "Known Link: "+d+ ' ' +t);
@@ -1038,10 +1038,6 @@
         Long longTime = new Long(timestamp.getTime());

         synchronized(knownLocs) {
-                       //If the location is already recorded, remove it from 
the hashmap
-                       if (knownLocs.containsKey(dd)) {
-                               knownLocs.remove(dd);
-                       }
                        //Add the location to the map with the current 
timestamp as value
                        knownLocs.put(dd,longTime);
         }
@@ -1050,49 +1046,23 @@

     //Return the estimated network size based on locations seen after 
timestamp or for the whole session if -1
     public int getNetworkSizeEstimate(long timestamp) {
-               int size = 0;
-               if (timestamp == -1) {
-                       size = knownLocs.size();
-               }else if (timestamp > -1) {
-                               Long locationTime = new Long(0);
-                               Iterator knownLocationsIterator = 
knownLocs.values().iterator();
-                               
-                       synchronized (knownLocs) {
-                               //TODO optimize some more if it is to be called 
a lot.
-                               while (knownLocationsIterator.hasNext()) {
-                                       locationTime = (Long) 
knownLocationsIterator.next();
-                                       if (locationTime.longValue() > 
timestamp) {
-                                               size++;
-                                       }
-                               }
-                       }
-                       }
-                       return size;
+       final SortedMap temp;
+       synchronized (knownLocs) {
+               temp = timestamp == -1 ? knownLocs : 
knownLocs.tailMap(Long.valueOf(timestamp));
+       }
+               return temp.size();
        }

-    // Return a copy of the known locations HashMap for a given timestamp
-    public LinkedHashMap getKnownLocations(long timestamp) {
-               if (timestamp > -1) {
-                       LinkedHashMap knownLocsCopy = new LinkedHashMap();
-                       //TODO optimize some more if it is to be called a lot.
-                       Double location = new Double(0.0);
-                       Long locationTime = new Long(0);
-                               Iterator knownLocationsIterator = 
knownLocs.keySet().iterator();
-                               synchronized (knownLocs) {
-                                       while 
(knownLocationsIterator.hasNext()) {
-                                               location = (Double) 
knownLocationsIterator.next();
-                                               locationTime = (Long) 
knownLocs.get(location);
-                                               if (locationTime.longValue() > 
timestamp) {
-                                                       //If the location is 
already recorded, remove it from the hashmap
-                                                       if 
(knownLocsCopy.containsKey(location)) {
-                                                               
knownLocsCopy.remove(location);
-                                                       }
-                                                       
knownLocsCopy.put(location, locationTime);
-                                               }
-                                       }
-                               }
-                               return knownLocsCopy;
-                       }
-                       return new LinkedHashMap( knownLocs );
+    /**
+     * Method called by Node.getKnownLocations(long timestamp)
+     * 
+     * @Return an array containing two cells : Locations and their last seen 
time for a given timestamp
+     */
+    public Object[] getKnownLocations(long timestamp) {
+               final SortedMap temp;
+       synchronized (knownLocs) {
+               temp = timestamp == -1 ? knownLocs :  
knownLocs.tailMap(Long.valueOf(timestamp));
+       }
+       return new Object[]{ (Double[])temp.keySet().toArray(), 
(Long[])temp.values().toArray()};
        }
 }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-03-05 23:36:13 UTC (rev 
11987)
+++ trunk/freenet/src/freenet/node/Node.java    2007-03-06 00:59:57 UTC (rev 
11988)
@@ -28,7 +28,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.zip.DeflaterOutputStream;

 import org.tanukisoftware.wrapper.WrapperManager;
@@ -3231,7 +3230,7 @@
          return lm.getNetworkSizeEstimate( timestamp );
        }

-       public LinkedHashMap getKnownLocations(long timestamp) {
+       public Object[] getKnownLocations(long timestamp) {
          return lm.getKnownLocations( timestamp );
        }



Reply via email to