import java.util.*;

class observerProxy {
	
	String ip;
	int port;
	
	observerProxy(String arg1, int arg2) {
		ip = arg1;
		port = arg2;
	}
	
	public boolean notify(int number) {

		ClientNetProxy serv = new ClientNetProxy(ip, port);
		
		if( serv.isValid() ) {
			serv.sendMessage(Integer.toString(number));
			serv.dispose();
			return true;
		}else {
			serv.dispose();
			return false;
		}

	}
	
}


public class Subject {

	private int state;
	ArrayList<observerProxy> list = new ArrayList<observerProxy>();
	
	public void setState(int number) {
		state = number;
		
		notifyAll(state);
	}
	
	public int getState() {
		return state;
	}
	
	public void notifyAll(int number) {
				
		ArrayList<observerProxy> deletedItems = new ArrayList<observerProxy>();
			
		for(observerProxy ob : list) {
			boolean isSucceed = ob.notify(number);
			if( !isSucceed ) {
				deletedItems.add(ob);	
			}
		} 
		
		for(observerProxy ob : deletedItems) {
			System.out.println("Inactive observer removed: " + ob.ip + " : " + Integer.toString(ob.port));
			list.remove(ob);
		}
		
		
	}
	
	public void register(String ip, int port) {
		
		observerProxy ob = new observerProxy(ip, port);
		
		boolean isfound = false;
		for(observerProxy entry: list) {
			if(entry.ip.equals(ip) && entry.port == port) {
				isfound = true;
				break;
			}
		}
		
		if( ! isfound )
			list.add(ob);
		
	}
	
	
	public void unregister(String ip, int port) {
		
		for(observerProxy entry: list) {
			if(entry.ip.equals(ip) && entry.port == port) {
				list.remove(entry);
			}
		}
		
	}
	
	
	public void printlist() {
		
		System.out.print("Observer List: ");
		for(observerProxy entry: list) {
			System.out.print("[ip: " + entry.ip + " : " + Integer.toString(entry.port) + "]  ");
		}
		System.out.println();
		
	}
	
	
}
