[freenet-cvs] r11988 - in trunk/freenet/src/freenet: clients/http node

nextgens at freenetproject.org nextgens at freenetproject.org
Tue Mar 6 01:34:42 UTC 2007


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 );
 	}
 	




More information about the cvs mailing list