--- /dev/null
+// Probe.java\r
+// $Id: Probe.java,v 1.1 2010/06/15 12:21:48 smhuang Exp $ \r
+// (c) COPYRIGHT MIT and INRIA, 1997.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+\r
+package org.w3c.www.protocol.http.micp;\r
+\r
+import java.awt.Button;\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Container;\r
+import java.awt.Dimension;\r
+import java.awt.Frame;\r
+import java.awt.GridBagConstraints;\r
+import java.awt.GridBagLayout;\r
+import java.awt.Label;\r
+import java.awt.Panel;\r
+import java.awt.Window;\r
+\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+\r
+import java.net.DatagramPacket;\r
+import java.net.DatagramSocket;\r
+import java.net.InetAddress;\r
+import java.net.MulticastSocket;\r
+import java.net.UnknownHostException;\r
+\r
+import java.io.IOException;\r
+import java.io.PrintStream;\r
+\r
+import java.util.EventObject;\r
+\r
+/**\r
+ * A real piece of fun, try it !\r
+ */\r
+\r
+class Stats implements MICP {\r
+ int queries = 0;\r
+ int hits = 0;\r
+ String lasturl = null;\r
+\r
+ final synchronized void handle(int op, String url) {\r
+ if (op == MICP_OP_QUERY)\r
+ queries++;\r
+ else\r
+ hits++;\r
+ lasturl = url;\r
+ }\r
+\r
+ final synchronized int getQueries() {\r
+ return queries;\r
+ }\r
+\r
+ final synchronized int getHits() {\r
+ return hits;\r
+ }\r
+\r
+ final synchronized String getLastURL() {\r
+ return lasturl;\r
+ }\r
+\r
+}\r
+\r
+class MICPReader extends Thread {\r
+ InetAddress addr = null;\r
+ int port = -1;\r
+ Stats stats = null;\r
+ MulticastSocket socket = null;\r
+ MICPReadWrite micprw = null;\r
+\r
+ public void run() {\r
+ byte buffer[] = new byte[4096];\r
+ MICPMessage msg = new MICPMessage();\r
+ while ( true ) {\r
+ try {\r
+ DatagramPacket p = new DatagramPacket(buffer, buffer.length);\r
+ socket.receive(p);\r
+ micprw.decode(p.getData(), p.getLength(), msg);\r
+ // Stat that message:\r
+ stats.handle(msg.op, msg.url);\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ } \r
+ }\r
+ }\r
+\r
+ MICPReader(InetAddress a, int port, Stats stats) \r
+ throws UnknownHostException, IOException\r
+ {\r
+ // Init:\r
+ this.micprw = new MICPReadWrite();\r
+ this.addr = a;\r
+ this.port = port;\r
+ this.stats = stats;\r
+ // Create and join:\r
+ this.socket = new MulticastSocket(port);\r
+ this.socket.joinGroup(a);\r
+ // Run !\r
+ setName("mICP listener");\r
+ start();\r
+ }\r
+}\r
+\r
+public class Probe extends Panel implements Runnable, ActionListener {\r
+ MICPReader reader = null;\r
+ Stats stats = null;\r
+ long refresh = 500;\r
+\r
+ Label hits = null;\r
+ Label queries = null;\r
+ Label url = null;\r
+ Button exit = null;\r
+\r
+ /**\r
+ * ActionListener implementation - exit on exit button.\r
+ * @param e The event.\r
+ */\r
+\r
+ public void actionPerformed(ActionEvent e) {\r
+ if ( e.getSource() == exit ) {\r
+ System.out.println("Bye !");\r
+ System.exit(0);\r
+ }\r
+ }\r
+\r
+ protected synchronized void tick() {\r
+ try {\r
+ wait(refresh);\r
+ } catch (InterruptedException ex) {\r
+ }\r
+ }\r
+\r
+ public void run() {\r
+ while ( true ) {\r
+ // Display stats:\r
+ hits.setText(Integer.toString(stats.getHits()));\r
+ queries.setText(Integer.toString(stats.getQueries()));\r
+ url.setText(stats.getLastURL());\r
+ // Wait for interval:\r
+ tick();\r
+ }\r
+ }\r
+\r
+ public Probe(InetAddress addr, int port, long refresh) \r
+ throws UnknownHostException, IOException\r
+ {\r
+ // Create objects:\r
+ this.refresh = refresh;\r
+ this.stats = new Stats();\r
+ this.reader = new MICPReader(addr, port, stats);\r
+ // Create widgets:\r
+ GridBagLayout gb = new GridBagLayout();\r
+ setLayout(gb);\r
+ GridBagConstraints ct = new GridBagConstraints();\r
+ GridBagConstraints cv = new GridBagConstraints();\r
+ // Create the title constraints:\r
+ ct = new GridBagConstraints() ;\r
+ ct.gridx = GridBagConstraints.RELATIVE ;\r
+ ct.anchor = GridBagConstraints.EAST ;\r
+ ct.weighty = 1.0 ;\r
+ // Create the value constraints:\r
+ cv = new GridBagConstraints() ;\r
+ cv.gridx = GridBagConstraints.RELATIVE ;\r
+ cv.gridwidth = GridBagConstraints.REMAINDER ;\r
+ cv.fill = GridBagConstraints.HORIZONTAL ;\r
+ cv.anchor = GridBagConstraints.WEST ;\r
+ cv.weightx = 1.0 ;\r
+ cv.weighty = 1.0 ;\r
+ // Add the number of queries label:\r
+ Label title = new Label("queries");\r
+ gb.setConstraints(title, ct);\r
+ add(title);\r
+ queries = new Label("0");\r
+ queries.setBackground(Color.white);\r
+ gb.setConstraints(queries, cv);\r
+ add(queries);\r
+ // Add the number of hits label:\r
+ title = new Label("hits");\r
+ gb.setConstraints(title, ct);\r
+ add(title);\r
+ hits = new Label("0");\r
+ hits.setBackground(Color.white);\r
+ gb.setConstraints(hits, cv);\r
+ add(hits);\r
+ // Add the last url label:\r
+ title = new Label("url");\r
+ gb.setConstraints(title, ct);\r
+ add(title);\r
+ url = new Label("0");\r
+ url.setBackground(Color.white);\r
+ gb.setConstraints(url, cv);\r
+ add(url);\r
+ // Add the exit button:\r
+ exit = new Button("Exit");\r
+ exit.addActionListener(this);\r
+ gb.setConstraints(exit, ct);\r
+ add(exit);\r
+ }\r
+\r
+ public static void usage() {\r
+ PrintStream p = System.out;\r
+ p.println("Probe -a <addr> -p <port> -r <refresh>"\r
+ + " -w <width> -h <height>");\r
+ p.println("\taddr: multicast group address");\r
+ p.println("\tport: multicast port");\r
+ p.println("\trefresh: refresh interval in ms");\r
+ p.println("\twidth: width at startup (pixels)");\r
+ p.println("\theight: height at startup (pixels)");\r
+ System.exit(1);\r
+ }\r
+\r
+ public static void main(String args[]) {\r
+ InetAddress addr = null;\r
+ int port = -1;\r
+ long refresh = 500;\r
+ int width = 330;\r
+ int height = 130;\r
+ try {\r
+ for (int i = 0 ; i < args.length ; i++) {\r
+ if ( args[i].equals("-a") && (i+1 < args.length) ) {\r
+ addr = InetAddress.getByName(args[++i]);\r
+ } else if ( args[i].equals("-p") && (i+1 < args.length) ) {\r
+ port = Integer.parseInt(args[++i]);\r
+ } else if ( args[i].equals("-r") && (i+1 < args.length) ) {\r
+ refresh = Long.parseLong(args[++i]);\r
+ } else if ( args[i].equals("-w") && (i+1 < args.length) ) {\r
+ width = Integer.parseInt(args[++i]);\r
+ } else if ( args[i].equals("-h") && (i+1 < args.length) ) {\r
+ height = Integer.parseInt(args[++i]);\r
+ } else {\r
+ usage();\r
+ } \r
+ }\r
+ } catch (Exception ex) {\r
+ usage();\r
+ }\r
+ // Check args:\r
+ if ((addr == null) || (port == -1))\r
+ usage();\r
+ // Run it:\r
+ Probe probe = null;\r
+ try {\r
+ probe = new Probe(addr, port, refresh);\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ System.exit(1);\r
+ }\r
+ Frame toplevel = new Frame("mICP-Probe") ;\r
+ toplevel.add ("Center", probe) ;\r
+ toplevel.setSize(new Dimension(width, height));\r
+ toplevel.show() ;\r
+ new Thread(probe).start();\r
+ }\r
+\r
+}\r