aboutsummaryrefslogtreecommitdiff
path: root/src/IvyClient.java
diff options
context:
space:
mode:
authorjestin1999-11-02 14:23:46 +0000
committerjestin1999-11-02 14:23:46 +0000
commit5d82c5cb30a72653420acd10bcea6fb94592acef (patch)
treef70483614dfa0d8c41465d4c66b0f05ea567a970 /src/IvyClient.java
parent15bb0f64aa8fac273e77170ace642e221610b9c3 (diff)
downloadivy-java-5d82c5cb30a72653420acd10bcea6fb94592acef.zip
ivy-java-5d82c5cb30a72653420acd10bcea6fb94592acef.tar.gz
ivy-java-5d82c5cb30a72653420acd10bcea6fb94592acef.tar.bz2
ivy-java-5d82c5cb30a72653420acd10bcea6fb94592acef.tar.xz
Bon, alors deux choses importantes dans cette release:
1/ le passage des Vectors aux Hashtables pour la collection des regexp, que ce soit dans Ivy.java ( regexp_in ) ou dans IvyClient.java (regexp_out) Les clefs sont des Integer ( msgid, et un serial incrémenté en sortie ) L'accès le plus simple pour modifier ces fichiers, c'est l'énumération sur les clefs. On truve des choses comme: for (Enumeration e = regexps.keys(); e.hasMoreElements(); ) { Integer key=(Integer)e.nextElement(); // des choses avec regexps.get(key) // ... } 2/ Un bugfix sauvage sans IvyClient.java Le msgarg n'était pas réinitialisé entre deux parsings de messages. Dans le cas d'un message reçu sur une regexp sans groupement (.*), comme par exemple ^AIRCRAFT:, on faisait tout de même passer la valeur précédente de msgarg. C'est fini. Over. out. heraus schnell. 3/ j'avais dit deux ? dans le monde, il y a trois type de gens, ceux qui ne savent pas compter, et les autres. Je rajoute un TestIvySwing, qui nécéssite un swingall.jar, mais c'est un problème de paquetage, et pas de libivy. En fait, ça devrait devenir à terme un autre paquetage. Yannick.
Diffstat (limited to 'src/IvyClient.java')
-rwxr-xr-xsrc/IvyClient.java287
1 files changed, 127 insertions, 160 deletions
diff --git a/src/IvyClient.java b/src/IvyClient.java
index 8ec226d..7ec220f 100755
--- a/src/IvyClient.java
+++ b/src/IvyClient.java
@@ -1,9 +1,5 @@
/*
-**
** IvyClient
-** Wed Aug 27 15:02:00 MET DST 1997 -> rajout des fonction ping & pong
-**
-** correction: un Die va faire finir le Thread, pas l'*ensemble*
*/
package fr.dgac.ivy ;
@@ -11,14 +7,18 @@ package fr.dgac.ivy ;
import java.lang.Thread;
import java.net.*;
import java.io.*;
-import java.util.Date;
-import java.util.Vector;
-import java.util.StringTokenizer;
+import java.util.*;
import gnu.regexp.*;
public class IvyClient extends Thread {
- // les types de messages
+ /*
+ * les types de messages
+ * on ne *change* pas, sous peine d'incompatibilité avec les autres
+ * implémentations ( C, C++, etc... ).
+ * quoi que :)
+ *
+ */
public final static int Bye = 0; /* l'application emettrice se termine */
public final static int AddRegexp = 1;/* expression reguliere d'un client */
public final static int Msg = 2 ; /* message reel */
@@ -30,25 +30,25 @@ public class IvyClient extends Thread {
public final static int Die = 8; /* demande de terminaison de l'appli */
public final static int Ping = 9; /* demande de réponse pong */
public final static int Pong = 10; /* réponse au ping */
-
public final static String StartArg = "\002";/* separateur debut args */
public final static String EndArg = "\003"; /* separateur inter arguments */
- protected String appName;
- public int appPort;
+ private String appName;
+ private int appPort;
- // gestion du protocole ping
- long lastRead = 0;
- long pingDate = 0 ;
- long pingLag =0 ;
-
- Ivy bus;
- Socket socket;
- BufferedReader in;
- OutputStream out;
+ /*
+ * gestion du protocole ping
+ * ne marche pas encore
+ */
+ private long lastRead = 0;
+ private long pingDate = 0 ;
+ private long pingLag =0 ;
- Vector regexp_in;
- Vector regexp_id;
+ private Ivy bus;
+ private Socket socket;
+ private BufferedReader in;
+ private OutputStream out;
+ private Hashtable regexp_in = new Hashtable();
static private boolean debug = (System.getProperty("IVY_DEBUG")!=null) ;
@@ -60,206 +60,172 @@ public class IvyClient extends Thread {
lastRead = (new Date()).getTime();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = socket.getOutputStream();
- regexp_in = new Vector();
- regexp_id = new Vector();
- sendService( bus.getRegexpOut() );
+ sendService( bus.getRegexpOut());
start();
}
+ /*
+ * quelques accesseurs
+ */
public InetAddress getRemoteAddress() { return socket.getInetAddress(); }
public String getApplicationName() { return appName ; }
+ public int getAppPort() { return appPort ; }
void sendBuffer( String buffer ) {
- buffer += "\n";
- try {
- out.write(buffer.getBytes() );
- out.flush();
- } catch ( IOException e )
- {
- // TODO: write error
- }
+ buffer += "\n";
+ try {
+ out.write(buffer.getBytes() );
+ out.flush();
+ } catch ( IOException e ) {
+ // TODO: write error
+ System.err.println("IvyClient.sendBuffer.write failed. FIX ME");
+ }
}
+
void send( int type, int id, String arg) {
- String buffer = type+" "+id+StartArg+arg;
+ String buffer = type+" "+id+StartArg+arg;
sendBuffer(buffer );
}
- void sendRegexp( int id, String regexp )
- {
- send( AddRegexp,id,regexp);
- }
+ void sendRegexp( int id, String regexp ) { send( AddRegexp,id,regexp); }
- public void sendDie( )
- {
- send( Die,0,"");
- }
+ public void sendDie( ) { send( Die,0,""); }
- public void sendDie(String message)
- {
- send( Die,0,message);
- }
+ public void sendDie(String message) { send( Die,0,message); }
- void sendPing()
- {
+ void sendPing() {
pingDate = (new Date()).getTime();
// on marque le message par la date actuelle
send( Ping, 0, String.valueOf(pingDate) );
}
- void sendService( Vector regexps )
- {
+ /*
+ * notifie la liste des regexps aux autres clients du bus
+ */
+ private void sendService( Hashtable regexps ) {
send( StartRegexp, bus.getApplicationPort(), bus.appName);
- for ( int id = 0 ; id < regexps.size(); id++ )
- {
- String regexp;
- regexp = (String)regexps.elementAt(id);
- sendRegexp( id,regexp);
+ for (Enumeration e = regexps.keys(); e.hasMoreElements(); ) {
+ Integer key = (Integer)e.nextElement();
+ sendRegexp( key.intValue(),(String)regexps.get(key));
}
send( EndRegexp,0, "");
}
- void send( int type, Integer id, int nbsub, REMatch result)
- {
- String buffer = type+" "+id+StartArg;
+ void send( int type, Integer id, int nbsub, REMatch result) {
+ String buffer = type+" "+id+StartArg;
traceDebug ( "Send matching result \n" );
// ????Start at 1 because group 0 represent entire matching
for(int sub = 1; sub <= nbsub; sub++) {
- if (result.getSubStartIndex(sub) > -1) {
- buffer += result.toString(sub)+EndArg;
- traceDebug( "Send arg "+result.toString(sub));
- }
+ if (result.getSubStartIndex(sub) > -1) {
+ buffer += result.toString(sub)+EndArg;
+ traceDebug( "Send arg "+result.toString(sub));
+ }
}
- sendBuffer( buffer );
+ sendBuffer( buffer );
}
- public int sendMsg( String message )
- {
- REMatch result;
- RE regexp;
- Integer id;
- int count = 0;
- for ( int i = 0 ; i < regexp_in.size(); i++ )
- {
- regexp = (RE)regexp_in.elementAt(i);
- id = (Integer) regexp_id.elementAt(i);
- result = regexp.getMatch(message);
- if ( result != null )
- {
- send( Msg,id,regexp.getNumSubs(),result);
- count ++;
- }
+ public int sendMsg( String message ) {
+ int count = 0;
+ for (Enumeration e = regexp_in.keys();e.hasMoreElements();) {
+ Integer key = (Integer)e.nextElement();
+ RE regexp = (RE)regexp_in.get(key);
+ REMatch result = regexp.getMatch(message);
+ if ( result != null ) {
+ send(Msg,key,regexp.getNumSubs(),result);
+ count++;
+ }
}
- return count;
+ return count;
}
- void close(String msg) throws IOException
- {
- traceDebug( msg );
+ void close(String msg) throws IOException {
+ traceDebug( msg );
socket.close();
//stop();
- }
+}
- public boolean sameClient( IvyClient clnt )
- {
- if ( appPort != 0 && appPort == clnt.appPort ) {
- if ( getRemoteAddress() == clnt.getRemoteAddress() ) return true;
- }
- return false;
+ public boolean sameClient( IvyClient clnt ) {
+ return ( appPort != 0 && appPort == clnt.appPort )
+ && ( getRemoteAddress() == clnt.getRemoteAddress() ) ;
}
- public void delRegexp( int id )
- {
- send( DelRegexp,id,"");
- }
- public void run()
- {
- String msg = null;
- String token = null;
- int i;
- int msgtype; /* type du dernier message recu */
- Integer msgid; /* id du dernier message recu */
- String msgarg = null; /* argument du dernier message recu */
- RE regexp = null; /* regexp compile */
+ public void delRegexp( int id ) { send( DelRegexp,id,"");}
+ public void run() {
+ String msg = null;
try {
-
traceDebug("Connected from "+
socket.getInetAddress().getHostName()+":"+socket.getPort());
-
- parseInput:
- while( (msg = in.readLine()) != null ) {
-
- /* étape un : extrait le message */
+ while((msg=in.readLine()) != null ) {
+ int msgtype; /* type du dernier message recu */
+ Integer msgid; /* id du dernier message recu */
+ RE regexp = null; /* regexp compile */
+ String token = null;
+ /*
+ * ETAPE UN : extraire le message
+ */
lastRead = (new Date()).getTime();
StringTokenizer st = new StringTokenizer(msg);
- traceDebug("Receive msg '"+msg+"'");
- if ( ! st.hasMoreTokens()) {
+ if (!st.hasMoreTokens()){
close("Bad format no type '"+msg+"'");
break;
}
- token = st.nextToken();
- if ( token.length() == 0 ) {
+ token=st.nextToken();
+ if (token.length()==0) {
close("Bad format no type '"+msg+"'");
break;
}
- try { msgtype = Integer.parseInt( token ); }
- catch ( NumberFormatException e ) {
+ try {
+ msgtype = Integer.parseInt(token);
+ } catch ( NumberFormatException e ) {
close("Bad format error parsing type'"+msg+"'");
break;
}
- if ( ! st.hasMoreTokens()) {
+ if (!st.hasMoreTokens()) {
close("Bad format no id '"+msg+"'");
break;
}
- msgid = Integer.valueOf( st.nextToken(StartArg) );
- if ( st.hasMoreTokens()) {
- msgarg = st.nextToken("\n");
- }
+ msgid=Integer.valueOf(st.nextToken(StartArg));
+ /*
+ * DONE: il trainait un bug ici: on oubliait de réinitialiser msgarg
+ * à la chaine vide, et du coup, pour les regexps sans groupe (),
+ * ça envoyait des messages un peu fantaisistes
+ */
+ String msgarg="";
+ if (st.hasMoreTokens()) msgarg=st.nextToken("\n");
- /* étape deux : traitement adapté */
- switch( msgtype ){
+ /*
+ *ETAPE DEUX : traitement adapté au type de message
+ */
+ switch (msgtype) {
case Bye: break;
case AddRegexp:
- if ( bus.CheckRegexp( msgarg ) ) {
- // Attempt to compile the pattern. If the pattern is not valid,
- // report the error and exit.
+ if ( bus.CheckRegexp(msgarg) ) {
try {
- regexp = new RE(msgarg);
- if ( regexp.getNumSubs()!= 0 )
- {
- /* check to see if any subexp */
- /* these are needed to send msg */
- regexp_in.addElement( regexp );
- regexp_id.addElement( msgid );
- }
- else System.err.println("Bad pattern: No () groups");
+ regexp_in.put(msgid,new RE(msgarg));
} catch (REException e) {
System.err.println("Bad pattern: "+e.getMessage());
}
- } else System.err.println("Warning exp='"+
- msgarg+"' can't match removing from "+appName);
+ } else {
+ System.err.println(
+ "Warning exp='"+msgarg+"' can't match removing from "+appName);
+ }
break;
case DelRegexp:
- i = regexp_id.indexOf( msgid );
- if ( i >=0 )
- {
- regexp_in.removeElementAt(i);
- regexp_id.removeElementAt(i);
- }
+ regexp_in.remove(msgid);
break;
case EndRegexp:
- /*
- ** call application callback avec event Connected
- */
- bus.connect( this );
- if ( bus.getReadyMessage() != null )
- sendMsg( bus.getReadyMessage() );
+ /*
+ * call application callback avec event Connected
+ */
+ bus.connect(this);
+ if (bus.getReadyMessage()!=null) sendMsg(bus.getReadyMessage());
break;
case Msg:
/*
- ** call callback avec les arguments
- */
- bus.callCallback( this, msgid.intValue(), msgarg );
+ * call callback avec les arguments
+ */
+ bus.callCallback(this,msgid,msgarg);
break;
case Error:
traceDebug("Error msg "+msgid+" "+msgarg);
@@ -267,24 +233,23 @@ public class IvyClient extends Thread {
case StartRegexp:
appName=msgarg;
appPort=msgid.intValue();
- if ( bus.checkConnected( this ) )
- close( "Quitting Application already connected" );
+ if ( bus.checkConnected(this) )
+ close("Quitting Application already connected");
break;
case DirectMsg:
traceDebug("Direct Message id="+msgid+" msg='"+msgarg+"'");
-
/*
- ** call directCallback avec les arguments
- */
+ * call directCallback avec les arguments
+ */
bus.directMessage( this, msgid.intValue(), msgarg );
break;
case Die:
traceDebug("Die Message received . argh !");
/*
- ** call diecallBack aavant de quitter
- */
+ * call diecallBack aavant de quitter
+ */
bus.die( this,msgid.intValue());
- break parseInput;
+ break;
case Ping:
traceDebug("Ping Message");
// répond avec le même argument .. Pour le moment c'est inutile
@@ -297,10 +262,11 @@ public class IvyClient extends Thread {
break;
default:
System.err.println("*** IvyClient *** unhandled msg type "+
- msgtype+" "+msgid+msgarg);
+ msgtype+" "+msgid+msgarg);
break;
} // switch sur le type de message
} // while readline
+
// plus rien à lire .... ou alors break donc erreur
traceDebug("zarbi Disconnected from "+
socket.getInetAddress().getHostName()+":"+socket.getPort());
@@ -320,3 +286,4 @@ public class IvyClient extends Thread {
if (debug) System.out.println("-->ivyclient<-- "+s);
}
} // class IvyClient
+/* EOF */