package fr.dgac.ivy ;
import java.io.*;
import java.util.*;
import gnu.getopt.Getopt;
/**
* terminal implementation in java of the ivyprobe.
* For a graphical version, see TestIvySwing
* @see fr.dgac.ivy.TestIvySwing
* @author Yannick Jestin
* @author http://www.tls.cena.fr/products/ivy/
*
*
* Changelog:
* 1.0.12
* - 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";
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-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:dh");
int c;
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 'd':
System.setProperty("IVY_DEBUG","yes");
break;
case 'h':
default:
System.out.println(helpmsg);
System.exit(0);
} // getopt
Probe p = new Probe();
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 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("-> 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=client.getApplicationName() + " sent";
for (int i=0;i