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