//@author: j.n.magee 11/11/96
package concurrency.message;

import java.awt.*;
import java.applet.*;
import concurrency.display.*;

public class EntryDemo extends Applet {

    ThreadPanel clA,clB,sv;
    SlotCanvas clientAdisp, clientBdisp, serverdisp;

    public void init() {
        setLayout(new BorderLayout());
        Panel bot = new Panel();
        Panel top = new Panel();
        top.setLayout(new FlowLayout(FlowLayout.CENTER,80,5));
        top.setBackground(Color.cyan);
        bot.add(clA =new ThreadPanel("Client A",Color.magenta,false));
        bot.add(sv =new ThreadPanel("Server",Color.blue,true));
        bot.add(clB =new ThreadPanel("Client B",Color.yellow,false));
        top.add(clientAdisp = new SlotCanvas("req A",Color.cyan,1));
        top.add(serverdisp  = new SlotCanvas("v",Color.cyan,1));
        top.add(clientBdisp = new SlotCanvas("req B",Color.cyan,1));
        add("Center",top);
        add("South",bot);
     }

    public void start() {
        Entry entry = new Entry();
        clA.start(new Client(entry,clientAdisp,"A"));
        clB.start(new Client(entry,clientBdisp,"B"));
        sv.start(new Server(entry,serverdisp));

    }

    public void stop() {
        clA.stop();
        clB.stop();
        sv.stop();
    }

}



/*******************CLIENT************************/

class Client implements Runnable {
  private Entry entry;
  private SlotCanvas display;
  private String id;

  Client(Entry e, SlotCanvas d, String s)
    {entry=e; display =d; id=s;}

  public void run() {
    try {
    while(true) {
      ThreadPanel.rotate(90);
      display.enter(id);
      String result = (String)entry.call(id);
      display.leave(id); display.enter(result);
      ThreadPanel.rotate(90);
      display.leave(result);
      ThreadPanel.rotate(180);
    }
    } catch (InterruptedException e){}
  }
}


/*******************Server************************/

class Server implements Runnable {
  private Entry entry;
  private SlotCanvas display;

  Server(Entry e, SlotCanvas d)
    {entry=e; display =d;}

  public void run() {
    try {
    while(true) {
      while(!ThreadPanel.rotate());
      String request = (String)entry.accept();
      display.enter(request);
      if (request.equals("A"))
         ThreadPanel.setSegmentColor(Color.magenta);
      else
         ThreadPanel.setSegmentColor(Color.yellow);
      while(ThreadPanel.rotate());
      display.leave(request);
      entry.reply("R");
    }
    } catch (InterruptedException e){}
  }
}
