Author: Jogy
Date: 2006-04-24 13:49:34 +0000 (Mon, 24 Apr 2006)
New Revision: 8571
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
trunk/freenet/src/freenet/io/comm/UdpSocketManager.java
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/PeerNode.java
Log:
- Enhanced the Darknet Page to optionally display MessageTypes sent to peers.
-- added functionality to PeerNode.java
-- added upcalls to PacketSender and UdpSocketManager
- fix code typo "incompatable" to "incompatible"
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-04-23 17:05:50 UTC (rev 8570)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-04-24 13:49:34 UTC (rev 8571)
@@ -9,6 +9,8 @@
import java.net.URLConnection;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.Hashtable;
+import java.util.Enumeration;
import freenet.client.HighLevelSimpleClient;
import freenet.io.comm.PeerParseException;
@@ -28,12 +30,12 @@
public int compare(Object arg0, Object arg1) {
Object[] row0 = (Object[])arg0;
Object[] row1 = (Object[])arg1;
- Integer stat0 = (Integer) row0[0];
- Integer stat1 = (Integer) row1[0];
+ Integer stat0 = (Integer) row0[1]; // 1 = status
+ Integer stat1 = (Integer) row1[1];
int x = stat0.compareTo(stat1);
if(x != 0) return x;
- String name0 = (String) row0[1];
- String name1 = (String) row1[1];
+ String name0 = (String) row0[2]; // 2 = node name
+ String name1 = (String) row1[2];
return
name0.toLowerCase().compareTo(name1.toLowerCase());
}
@@ -81,7 +83,12 @@
long now = System.currentTimeMillis();
buf.append("<div class=\"infobox\">\n");
- buf.append("<h2>My Connections</h2>\n");
+ buf.append("<h2>My Connections");
+ if (!path.endsWith("displaymessagetypes.html"))
+ {
+ buf.append(" <a href=\"displaymessagetypes.html\">(more
detailed)</a>");
+ }
+ buf.append("</h2>\n");
buf.append("<form action=\".\" method=\"post\"
enctype=\"multipart/form-data\">\n");
buf.append("<table class=\"darknet_connections\">\n");
buf.append("<tr><th>Status</th><th>Name</th><th> <span
title=\"Address:Port\" style=\"border-bottom:1px
dotted;cursor:help;\">Address</span></th><th>Version</th><th>Location</th><th>
<span title=\"Temporarily disconnected. Other node busy? Wait time(ms)
remaining/total\" style=\"border-bottom:1px
dotted;cursor:help;\">Backoff</span></th><th> <span title=\"Number of minutes
since the node was last seen in this session\" style=\"border-bottom:1px
dotted;cursor:help;\">Idle</span></th><th></th></tr>\n");
@@ -93,6 +100,7 @@
// Create array
Object[][] rows = new Object[peerNodes.length][];
+ String[][] messageTypesRows = new String[peerNodes.length][];
for(int i=0;i<peerNodes.length;i++) {
PeerNode pn = peerNodes[i];
long backedOffUntil = pn.getBackedOffUntil();
@@ -101,7 +109,8 @@
long idle = pn.lastReceivedPacketTime();
// Elements must be HTML encoded.
- Object[] row = new Object[8];
+ Object[] row = new Object[9]; // where [0] is the pn
object!
+ String[] messageTypesRow = new String[2];
rows[i] = row;
Object status;
@@ -116,15 +125,16 @@
status = DISCONNECTED;
}
- row[0] = status;
- row[1] = HTMLEncoder.encode(pn.getName());
- row[2] = pn.getDetectedPeer() != null ?
HTMLEncoder.encode(pn.getDetectedPeer().toString()) : "(address unknown)";
- row[3] = HTMLEncoder.encode(pn.getVersion());
- row[4] = new Double(pn.getLocation().getValue());
- row[5] = backoff + "/" + pn.getBackoffLength();
- if (idle == -1) row[6] = " ";
- else row[6] = new Long((now - idle) / 60000);
- row[7] = "<input type=\"checkbox\"
name=\"delete_node_"+pn.hashCode()+"\" />";
+ row[0] = pn;
+ row[1] = status;
+ row[2] = HTMLEncoder.encode(pn.getName());
+ row[3] = pn.getDetectedPeer() != null ?
HTMLEncoder.encode(pn.getDetectedPeer().toString()) : "(address unknown)";
+ row[4] = HTMLEncoder.encode(pn.getVersion());
+ row[5] = new Double(pn.getLocation().getValue());
+ row[6] = backoff + "/" + pn.getBackoffLength();
+ if (idle == -1) row[7] = " ";
+ else row[7] = new Long((now - idle) / 60000);
+ row[8] = "<input type=\"checkbox\"
name=\"delete_node_"+pn.hashCode()+"\" />";
}
// Sort array
@@ -133,26 +143,55 @@
// Convert status codes into status strings
for(int i=0;i<rows.length;i++) {
Object[] row = rows[i];
- Integer x = (Integer) row[0];
- if(x == CONNECTED) row[0] = "<span
class=\"peer_connected\">CONNECTED</span>";
- else if(x == BACKED_OFF) row[0] = "<span
class=\"peer_backedoff\">BACKED OFF</span>";
- else if(x == INCOMPATIBLE) row[0] = "<span
class=\"peer_incompatable\">INCOMPATIBLE</span>";
- else if(x == DISCONNECTED) row[0] = "<span
class=\"peer_disconnected\">DISCONNECTED</span>";
+ Integer x = (Integer) row[1];
+ if(x == CONNECTED) row[1] = "<span
class=\"peer_connected\">CONNECTED</span>";
+ else if(x == BACKED_OFF) row[1] = "<span
class=\"peer_backedoff\">BACKED OFF</span>";
+ else if(x == INCOMPATIBLE) row[1] = "<span
class=\"peer_incompatible\">INCOMPATIBLE</span>";
+ else if(x == DISCONNECTED) row[1] = "<span
class=\"peer_disconnected\">DISCONNECTED</span>";
}
// Turn array into HTML
for(int i=0;i<rows.length;i++) {
Object[] row = rows[i];
- buf.append("\n<tr>\n\t<td>");
- for(int j=0;j<row.length;j++) {
- buf.append(row[j]);
- if(j != row.length-1)
- buf.append("</td>\n\t<td>");
+ buf.append("<tr>\n");
+ for(int j=1;j<row.length;j++) { // skip index 0 as
it's the PeerNode object
+ buf.append("<td>"+row[j]+"</td>");
}
- buf.append("</td>\n</tr>\n");
+ buf.append("</tr>\n");
+
+ if (path.endsWith("displaymessagetypes.html"))
+ {
+ buf.append("<tr class=\"messagetypes\"><td
colspan=\"8\">\n");
+ buf.append("<table
class=\"sentmessagetypes\">\n");
+ buf.append("<tr><th>Sent Message
Type</th><th>Count</th></tr>\n");
+ for (Enumeration
keys=((PeerNode)row[0]).getLocalNodeSentMessagesToStatistic().keys();
keys.hasMoreElements(); )
+ {
+ Object curkey = keys.nextElement();
+ buf.append("<tr><td>");
+ buf.append((String)curkey);
+ buf.append("</td><td>");
+
buf.append(((Long)((PeerNode)row[0]).getLocalNodeSentMessagesToStatistic().get(curkey))
+ "");
+ buf.append("</td></tr>\n");
+ }
+ buf.append("</table>\n");
+
+ buf.append("<table
class=\"receivedmessagetypes\">\n");
+ buf.append("<tr><th>Received Message
Type</th><th>Count</th></tr>\n");
+ for (Enumeration
keys=((PeerNode)row[0]).getLocalNodeReceivedMessagesFromStatistic().keys();
keys.hasMoreElements(); )
+ {
+ Object curkey = keys.nextElement();
+ buf.append("<tr><td>");
+ buf.append((String)curkey);
+ buf.append("</td><td>");
+
buf.append(((Long)((PeerNode)row[0]).getLocalNodeReceivedMessagesFromStatistic().get(curkey))
+ "");
+ buf.append("</td></tr>\n");
+ }
+ buf.append("</table>\n");
+ buf.append("</td></tr>\n");
+ }
}
buf.append("</table>");
- buf.append("<input type=\"submit\" name =\"disconnect\"
value=\"Disconnect from Selected Peers\" />");
+ buf.append("<input type=\"submit\" name =\"disconnect\"
value=\"Disconnect from selected Peers\" />");
buf.append("</form>");
buf.append("</div>");
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
2006-04-23 17:05:50 UTC (rev 8570)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
2006-04-24 13:49:34 UTC (rev 8571)
@@ -112,7 +112,7 @@
color: red;
}
-.peer_incompatable {
+.peer_incompatible {
color: blue;
}
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-04-23 17:05:50 UTC (rev 8570)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-04-24 13:49:34 UTC (rev 8571)
@@ -218,7 +218,7 @@
color: #ff0000;
}
-table.darknet_connections span.peer_incompatable {
+table.darknet_connections span.peer_incompatible {
color: #d0a0d0;
}
@@ -226,3 +226,19 @@
color: #d0d0d0;
}
+tr.messagetypes {
+ text-align: center;
+}
+
+table.sentmessagetypes {
+ display: inline;
+}
+
+table.receivedmessagetypes {
+ display: inline;
+}
+
+table.sentmessagetypes th, table.sentmessagetypes td,
table.receivedmessagetypes th, table.receivedmessagetypes td {
+ font-size: 7pt;
+}
+
Modified: trunk/freenet/src/freenet/io/comm/UdpSocketManager.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketManager.java 2006-04-23
17:05:50 UTC (rev 8570)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketManager.java 2006-04-24
13:49:34 UTC (rev 8571)
@@ -241,6 +241,10 @@
* @param m The Message to dispatch.
*/
public void checkFilters(Message m) {
+ if ((m.getSource()) instanceof PeerNode)
+ {
+
((PeerNode)m.getSource()).addToLocalNodeReceivedMessagesFromStatistic(m);
+ }
boolean matched = false;
if (!(m.getSpec().equals(DMT.packetTransmit))) {
if (m.getSpec().equals(DMT.ping) ||
m.getSpec().equals(DMT.pong)) {
@@ -537,4 +541,4 @@
public int getMaxPacketSize() {
return 1400; // REDFLAG: Reasonable?
}
-}
\ No newline at end of file
+}
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2006-04-23 17:05:50 UTC
(rev 8570)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2006-04-24 13:49:34 UTC
(rev 8571)
@@ -142,6 +142,10 @@
} else {
for(int j=0;j<messages.length;j++) {
Logger.minor(this, "PS Sending:
"+(messages[j].msg == null ? "(not a Message)" :
messages[j].msg.getSpec().getName()));
+ if (messages[j].msg != null)
+ {
+
pn.addToLocalNodeSentMessagesToStatistic(messages[j].msg);
+ }
}
// Send packets, right now, blocking, including
any active notifications
node.packetMangler.processOutgoingOrRequeue(messages, pn, true, false);
@@ -154,6 +158,7 @@
Logger.minor(this, "Sending keepalive");
// Force packet to have a sequence number.
Message m = DMT.createFNPVoid();
+ pn.addToLocalNodeSentMessagesToStatistic(m);
node.packetMangler.processOutgoingOrRequeue(new
MessageItem[] { new MessageItem(m, null) }, pn, true, true);
}
} else {
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-04-23 17:05:50 UTC
(rev 8570)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-04-24 13:49:34 UTC
(rev 8571)
@@ -14,6 +14,7 @@
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import java.util.Vector;
+import java.util.Hashtable;
import freenet.crypt.BlockCipher;
import freenet.crypt.DiffieHellmanContext;
@@ -172,6 +173,12 @@
/** The time at which we last completed a connection setup. */
private long connectedTime;
+ /** Holds a String-Long pair that shows which message types (as name) have
been send to this peer. */
+ private Hashtable localNodeSentMessageTypes = new Hashtable();
+
+ /** Holds a String-Long pair that shows which message types (as name) have
been received by this peer. */
+ private Hashtable localNodeReceivedMessageTypes = new Hashtable();
+
/**
* Create a PeerNode from a SimpleFieldSet containing a
* node reference for one. This must contain the following
@@ -1230,5 +1237,55 @@
public boolean hasCompletedHandshake() {
return completedHandshake;
}
+
+ public synchronized void addToLocalNodeSentMessagesToStatistic (Message
m)
+ {
+ String messageSpecName;
+ Long count;
+
+ messageSpecName = m.getSpec().getName();
+ //
+ count = (Long)localNodeSentMessageTypes.get(messageSpecName);
+ if (count == null)
+ {
+ count = new Long(1);
+ }
+ else
+ {
+ count = new Long(count.longValue() + 1);
+ }
+ //
+ localNodeSentMessageTypes.put(messageSpecName,count);
+ }
+
+ public synchronized void addToLocalNodeReceivedMessagesFromStatistic
(Message m)
+ {
+ String messageSpecName;
+ Long count;
+
+ messageSpecName = m.getSpec().getName();
+ //
+ count =
(Long)localNodeReceivedMessageTypes.get(messageSpecName);
+ if (count == null)
+ {
+ count = new Long(1);
+ }
+ else
+ {
+ count = new Long(count.longValue() + 1);
+ }
+ //
+ localNodeReceivedMessageTypes.put(messageSpecName,count);
+ }
+
+ public Hashtable getLocalNodeSentMessagesToStatistic ()
+ {
+ return localNodeSentMessageTypes;
+ }
+
+ public Hashtable getLocalNodeReceivedMessagesFromStatistic ()
+ {
+ return localNodeReceivedMessageTypes;
+ }
}