diff options
-rw-r--r-- | src/Ghost.java | 15 | ||||
-rw-r--r-- | src/Makefile | 4 | ||||
-rw-r--r-- | src/ProxyClient.java | 32 | ||||
-rw-r--r-- | src/ProxyMaster.java | 8 | ||||
-rw-r--r-- | src/Puppet.java | 39 |
5 files changed, 83 insertions, 15 deletions
diff --git a/src/Ghost.java b/src/Ghost.java index ad6e78c..fd7465d 100644 --- a/src/Ghost.java +++ b/src/Ghost.java @@ -22,18 +22,21 @@ class Ghost extends IvyClient { super(bus,socket,remotePort,incoming); this.id=id; this.pc=pc; + System.out.println("new Ghost: "+id+" pc:"+pc); } + // ProxyClient -> Ghost -> Ivy Bus protected synchronized void sendBuffer( String buffer ) throws IvyException { - System.out.println("out buffer: "+buffer); - pc.forward(id,buffer); - super.sendBuffer(buffer); + // System.out.println("out buffer: "+buffer+" for:"+pc+" id:"+id); + super.sendBuffer(buffer); // and to all the agents on the Ghost bus ? I'm not sure } + // Bus -> Ghost -> ProxyClient -> ProxyMaster -> other buses protected boolean newParseMsg(String s) throws IvyException { - System.out.println("in buffer: "+s); - pc.forward(id,buffer); - return super.newParseMsg(s); + // I received a message from an agent on the bus + System.out.println("in buffer to forward from "+id+": "+s); + if (pc!=null) pc.forward(id,s); // forward to all the puppets + return super.newParseMsg(s); // I'll take no action } } diff --git a/src/Makefile b/src/Makefile index e6a478f..692bbe1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,8 +2,8 @@ include ../java.mk #.SUFFIXES: .java .class #SRCS = *.java - SRCS = IvyApplicationAdapter.java IvyApplicationListener.java IvyBindListener.java IvyClient.java IvyException.java Ivy.java IvyMessageListener.java IvyWatcher.java SelfIvyClient.java WaiterClient.java Waiter.java PingCallback.java - TOOLS= IvyDaemon.java Probe.java After.java ProxyMaster.java ProxyClient.java Ghost.java + SRCS = IvyApplicationAdapter.java IvyApplicationListener.java IvyBindListener.java IvyClient.java IvyException.java Ivy.java IvyMessageListener.java IvyWatcher.java SelfIvyClient.java WaiterClient.java Waiter.java PingCallback.java Puppet.java ProxyClient.java Ghost.java + TOOLS= IvyDaemon.java Probe.java After.java ProxyMaster.java OBJS = $(SRCS:.java=.class) DOCS = ../doc/html/api diff --git a/src/ProxyClient.java b/src/ProxyClient.java index 3f616c5..d6c6932 100644 --- a/src/ProxyClient.java +++ b/src/ProxyClient.java @@ -26,6 +26,8 @@ public class ProxyClient extends Ivy { private volatile Thread clientThread;// volatile to ensure the quick communication private Hashtable id=new Hashtable(); private Vector ghosts = new Vector(); + private Hashtable puppets =new Hashtable(); // key=id value=Puppet + String domain=null; public static int DEFAULT_SERVICE_PORT = 3456 ; public static final String DEFAULTNAME = "ProxyClient"; @@ -69,10 +71,9 @@ public class ProxyClient extends Ivy { } String hostname="localhost"; try { - ProxyClient pc = new ProxyClient(hostname,servicePort); + ProxyClient pc = new ProxyClient(hostname,servicePort,domain); if (!quiet) System.out.println("broadcasting on "+pc.domains(domain)); if (!quiet) System.out.println("contacting tcp:"+hostname+":"+servicePort); - pc.start(domain); System.out.println("client running..."); } catch (IvyException ie) { System.out.println("error, can't connect to Ivy"); @@ -85,29 +86,39 @@ public class ProxyClient extends Ivy { } } - public ProxyClient(String hostname,int servicePort) throws IOException { + public ProxyClient(String hostname,int servicePort,String domain) throws IOException, IvyException { super(name,name+" ready",null); clientSocket = new Socket(hostname,servicePort) ; in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); clientThread=new Thread(new Servicer()); clientThread.start(); + this.domain=domain; + start(domain); } RE getId=new RE("^ID id=(.*) value=(.*)"); RE fwd=new RE("^Forward id=(.*) buffer=(.*)"); + RE puppetRe=new RE("^CreatePuppet id=(.*)"); void parseMsg(String msg) { System.out.println("parsing "+msg); if (getId.match(msg)) { id.put(getId.getParen(1),getId.getParen(2)); + } else if (puppetRe.match(msg)) { + // I must create a puppet + puppets.put(puppetRe.getParen(1),new Puppet(this,domain)); } else if (fwd.match(msg)) { // received a forward request // TODO give it to the puppet + Puppet p = (Puppet)puppets.get(fwd.getParen(1)); + p.parse(fwd.getParen(2)); } else { System.out.println("unknown message "+msg); } } + void removePuppet(Puppet p){puppets.remove(p);} + class Servicer implements Runnable { public void run() { Thread thisThread = Thread.currentThread(); @@ -126,9 +137,15 @@ public class ProxyClient extends Ivy { } traceDebug("Subreader Thread stopped"); System.out.println("ProxyClient disconnected"); + stop(); // leave the bus TODO: make a disconnexion/reconnexion possible ? } } + /* + * here, I create a ghost instead of a normal Ivy Client, to catch the + * protocol and forward everything to the proxies. + * TODO: remember everything in case a new proxy client comes ? + */ protected IvyClient createIvyClient(Socket s,int port, boolean domachin) throws IOException { String key = getWBUId(); System.out.println("asking for a key"); @@ -143,7 +160,12 @@ public class ProxyClient extends Ivy { return new Ghost(this,s,port,domachin,(String)id.get(key),this); } - private void forward(String id,String buffer) { + /* + * the function to forward the protocol to all the Puppets through the + * ProxyMaster + * + */ + protected void forward(String id,String buffer) { out.println("Forward id="+id+" buffer="+buffer); out.flush(); } @@ -152,4 +174,6 @@ public class ProxyClient extends Ivy { if (debug) System.out.println("-->ProxyClient "+name+"<-- "+s); } + + } diff --git a/src/ProxyMaster.java b/src/ProxyMaster.java index 7ed9460..09216ed 100644 --- a/src/ProxyMaster.java +++ b/src/ProxyMaster.java @@ -9,7 +9,7 @@ * changelog: * 1.2.12 */ -package fr.dgac.ivy ; +package fr.dgac.ivy ; // TODO go into sub tools, and build a shell/.BAT script import java.io.*; import java.net.*; import java.util.* ; @@ -122,8 +122,10 @@ public class ProxyMaster { out.println("ID id="+getId.getParen(1)+" value="+newGhostId); out.flush(); // TODO create Puppets in each other ProxyClient - for (Enumeration e=proxyClients.elements();e.hasMoreElements();) - ((SubReader)e.nextElement()).send("CreatePuppet id="+newGhostId); + for (Enumeration e=proxyClients.elements();e.hasMoreElements();) { + SubReader sr = (SubReader)e.nextElement(); + if (sr!=SubReader.this) sr.send("CreatePuppet id="+newGhostId); + } } else if (fwd.match(msg)) { System.out.println("forwarding "+msg); // TODO forward the message to all relevant puppets diff --git a/src/Puppet.java b/src/Puppet.java new file mode 100644 index 0000000..d122d52 --- /dev/null +++ b/src/Puppet.java @@ -0,0 +1,39 @@ +package fr.dgac.ivy ; +import java.lang.Thread; +import java.net.*; +import java.io.*; +import java.util.*; +import org.apache.regexp.*; + +class Puppet extends Ivy { + + Hashtable bound = new Hashtable(); // clef: l'ID de la regexp choisi par le ghost, valeur: l'Int de l'abonnement local + String myDomain; + ProxyClient pc; + + Puppet(ProxyClient pc,String domain) { + super("noname","noname not ready",null); + myDomain=domain; + this.pc=pc; + } + + void parse(String s){ + System.out.println("the puppet must parse "+s); + } + + protected IvyClient createIvyClient(Socket s,int port, boolean domachin) throws IOException { + return new PuppetClient(); + } + + class PuppetClient extends IvyClient { + protected synchronized void sendBuffer( String buffer ) throws IvyException { + super.sendBuffer(buffer); // and to all the agents on the Ghost bus ? I'm not sure + } + + protected boolean newParseMsg(String s) throws IvyException { + return super.newParseMsg(s); + } + } // class PuppetClient + +} + |