import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Enumeration;

public class TupleSpaceClient extends Applet {

    protected TextField key = new TextField("Enter Key", 24);
    protected TextField sender = new TextField("Sender Name", 24);
    protected TextField tupleId = new TextField("Tuple Number", 24);
    protected String object = "OBJECT";
    protected String appletName;
    protected TupleSpace tupleSpace = null;

    protected void delay(int maxSeconds) {
	    try {Thread.sleep((int)(maxSeconds*1000 * Math.random()));}
	    catch (InterruptedException e){}
	}
	
    protected void getServer() {
        if (tupleSpace == null) {
        	Enumeration e = getAppletContext().getApplets();
        	while (e.hasMoreElements()) {
        	    Applet applet = (Applet)e.nextElement();
        	    if (applet instanceof TupleSpace) {
            		tupleSpace = (TupleSpace) applet;
        	    }
        	}
        }	
    }	
    
    protected void clearResultFields() {
        sender.setText("");
        tupleId.setText("");
    }    

    class OUTButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            delay(5);
            tupleSpace.out(new Tuple(key.getText(),appletName,object));
            clearResultFields();
        }
    }

    class INButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            Tuple tuple = new Tuple(key.getText(),appletName,object);
            clearResultFields();
            delay(5);
            tupleSpace.in(tuple);
            sender.setText(tuple.who());
            tupleId.setText(tuple.id());
        }
    }

    class INPButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            Tuple tuple = new Tuple(key.getText(),appletName,object);
            clearResultFields();
            delay(5);
            if (tupleSpace.inp(tuple)) {
                sender.setText(tuple.who());
                tupleId.setText(tuple.id());
            } else {
                sender.setText("NO TUPLE");
            }    
        }
    }

    class RDButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            Tuple tuple = new Tuple(key.getText(),appletName,object);
            clearResultFields();
            delay(5);
            tupleSpace.rd(tuple);
            sender.setText(tuple.who());
            tupleId.setText(tuple.id());
        }
    }

    class RDPButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            Tuple tuple = new Tuple(key.getText(),appletName,object);
            clearResultFields();
            delay(5);
            if (tupleSpace.rdp(tuple)) {
                sender.setText(tuple.who());
                tupleId.setText(tuple.id());
            } else {
                sender.setText("NO TUPLE");
            }    
        }
    }

    class EVALButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            getServer();
            clearResultFields();
            delay(5);
            tupleSpace.eval(new Tuple(key.getText(),appletName,object));
        }
    }

    class EVALTuple extends Thread {
        private Tuple tuple;

        public EVALTuple(Tuple tuple) {
            this.tuple = tuple;
        }

        public void run() {
            delay(10);
            getServer();
            tuple.appendHelper(appletName);
            tupleSpace.out(tuple);
        }
    }

    public void eval(Tuple tuple) {
        new EVALTuple(tuple).start();
    }

    public void init() {
        appletName = getParameter("NAME");
	    Label label = new Label(appletName, Label.CENTER);
        add(label);
        add(key);
        add(sender);
        add(tupleId);
	    Button outButton = new Button("OUT");
        add(outButton);
	    outButton.addActionListener(new OUTButtonHandler());
	    Button inButton = new Button("IN");
        add(inButton);
	    inButton.addActionListener(new INButtonHandler());
	    Button inpButton = new Button("INP");
        add(inpButton);
	    inpButton.addActionListener(new INPButtonHandler());
	    Button rdButton = new Button("RD");
        add(rdButton);
	    rdButton.addActionListener(new RDButtonHandler());
	    Button rdpButton = new Button("RDP");
        add(rdpButton);
	    rdpButton.addActionListener(new RDPButtonHandler());
	    Button evalButton = new Button("EVAL");
        add(evalButton);
	    evalButton.addActionListener(new EVALButtonHandler());
    }

    public void paint(Graphics g) {
        g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
    }

    public String getAppletInfo() {
        return "TupleSpaceClient by Charles E. Hughes";
    }

}
