package fr.dgac.ivy ; import java.io.*; import java.util.*; import gnu.getopt.Getopt; /** * terminal implementation in java of the ivyprobe. * @author Yannick Jestin * @author http://www.tls.cena.fr/products/ivy/ * * * Changelog: * 1.2.1 * - new -t switch to print the date for each ivy message * - now displays the correct domain list * - now has .bind and .unbind commands * 1.2.0 * - Probe can now send empty strings on keyboard input * - rewritten with a looping thread on stdin to allow a cleaner exit on die * message : not very good * - processes .help, .die , .quit and .bye commands * - it is possible to rename the JPROBE on the bus with the -n switch, it can * circumvent name collisions during tests * e.g: java fr.dgac.ivy.Probe -n JPROBE2 * 1.0.10 * exits on end of user input * handles multiple domains - it was a IvyWatcher problem - */ class Probe implements IvyApplicationListener, IvyMessageListener, Runnable { /** * help message for the standalone program */ public static final String helpCommands = "Available commands:\n.die CLIENTNAME sends a die message\n.bye quits the application\n.quit idem\n.list lists the available clients\n.ping sends a ping request if IVY_PING is enabled\n.bind REGEXP binds to a regexp at runtime\n.unbind REGEXP unbinds to a regexp at runtime"; public static final String helpmsg = "usage: java fr.dgac.ivy.Probe [options] [regexp]\n\t-b BUS\tspecifies the Ivy bus domain\n\t-n ivyname (default JPROBE)\n\t-q\tquiet, no tty output\n\t-d\tdebug\n\t-t\ttime stamp each message\n\t-h\thelp\n\n\t regexp is a Perl5 compatible regular expression"; public static void main(String[] args) throws IvyException { Getopt opt = new Getopt("Probe",args,"n:b:dht"); int c; boolean timestamp=false; String domain=Ivy.getDomain(null); String name="JPROBE"; while ((c = opt.getopt()) != -1) switch (c) { case 'b': domain=opt.getOptarg(); break; case 'n': name=opt.getOptarg(); break; case 't': timestamp=true; break; case 'd': System.setProperty("IVY_DEBUG","yes"); break; case 'h': default: System.out.println(helpmsg); System.exit(0); } // getopt Probe p = new Probe(timestamp); Ivy bus=new Ivy(name,name+" ready",p); for (int i=opt.getOptind();i Sent to " +bus.sendMsg(s)+" peers"); } else if (s.lastIndexOf(".die ")>=0){ String target=s.substring(5); Vector v=bus.getIvyClientsByName(target); if (v.size()==0) { System.out.println("no Ivy client with the name \""+target+"\""); } for (int i=0;i=0){ String regexp=s.substring(8); if (bus.unBindMsg(regexp)) { System.out.println("you want to unsubscribe to " + regexp); } else { System.out.println("you can't unsubscribe to " + regexp + ", your're not subscribed to it"); } } else if (s.lastIndexOf(".bind ")>=0){ String regexp=s.substring(6); System.out.println("you want to subscribe to " + regexp); bus.bindMsg(regexp,this); } else if (s.lastIndexOf(".ping ")>=0){ String target=s.substring(6); Vector v=bus.getIvyClientsByName(target); if (v.size()==0) { System.out.println("no Ivy client with the name \""+target+"\""); } for (int i=0;i=0)||(s.lastIndexOf(".bye")>=0)){ bus.stop(); System.exit(0); } else if (s.lastIndexOf(".list")>=0) { Vector v = bus.getIvyClients(); System.out.println(v.size()+" clients on the bus"); for (int i=0;i "+((IvyClient)v.elementAt(i)).getApplicationName()); } } else if ( s.lastIndexOf(".help")>=0) { System.out.println(helpCommands); } else if ( s.charAt(0)=='.') { System.out.println("this command is not recognized"); System.out.println(helpCommands); } else { System.out.println(date()+"-> Sent to " +bus.sendMsg(s)+" peers"); } } // parseCommand public void connect(IvyClient client) { System.out.println(client.getApplicationName() + " connected " ); for (java.util.Enumeration e=client.getRegexps();e.hasMoreElements();) System.out.println(client.getApplicationName() + " subscribes to " +e.nextElement() ); } public void disconnect(IvyClient client) { System.out.println(client.getApplicationName() + " disconnected " ); } public void die(IvyClient client, int id) { System.out.println("received die msg from " + client.getApplicationName() ); Thread t = looperThread; looperThread = null; t.interrupt(); // TODO does'nt work System.exit(0); } public void directMessage(IvyClient client, int id, String arg) { System.out.println(client.getApplicationName() + " direct Message "+ id + arg ); } public void receive(IvyClient client, String[] args) { String s=date()+client.getApplicationName() + " sent"; for (int i=0;i