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



Reply via email to