////////////////////////////////////////////////////////////
//
//	ECHO_MEMORY_LEAK.JAVA
//	Kulisics, Joseph D.
//	14 February 2004
//
////////////////////////////////////////////////////////////


import java.io.*;
import java.util.*;


public class echo_memory_leak{

	public static void main(String[] arguments){

		Dispatcher dispatcher=new Dispatcher();
		LocalInObject inobject=new LocalInObject(dispatcher);
		inobject.dataLoop();

	}

}


class LocalInObject implements DatumSource{

	Dispatcher dispatcher;

	LocalInObject(Dispatcher dispatcher){

		this.dispatcher=dispatcher;

	}

	public void dataLoop(){

		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		while(true){
			try{
				System.out.print("Enter a string: ");
				String datum=br.readLine();
				LocalOutObject outobj=new LocalOutObject(this.dispatcher);
				this.sendDatum(datum);
			}catch(IOException e){}
		}

	}

	public void sendDatum(String datum){

		this.dispatcher.receiveDatum(datum);

	}

}


class LocalOutObject implements DatumListener{

	Dispatcher dispatcher;

	String datum;
	boolean set=false;

	LocalOutObject(Dispatcher dispatcher){

		this.dispatcher=dispatcher;
		this.dispatcher.addDatumListener(this);

	}

	public void receiveDatum(String datum){

		if(!this.set){
			this.set=true;
			this.datum=datum;
		}
		System.out.println(this.datum);

	}

}


interface DatumListener{

	public void receiveDatum(String datum);

}

interface DatumSource{

	public void sendDatum(String datum);

}


class Dispatcher implements DatumSource,DatumListener{

	Vector dklisteners=new Vector();
	Vector datumlisteners=new Vector();

	Dispatcher(){}


	public void receiveDatum(String datum){

		this.sendDatum(datum);

	}

	public void sendDatum(String datum){

		Enumeration e=datumlisteners.elements();
		while(e.hasMoreElements()){
			DatumListener dl=(DatumListener)e.nextElement();
			dl.receiveDatum(datum);
		}

	}

	public void addDatumListener(DatumListener dl){

		this.datumlisteners.addElement(dl);

	}

	public void removeDatumListener(DatumListener dl){

		while(this.datumlisteners.removeElement(dl)){}

	}

}
