/**
 * Copyright (c) 2001/2003 Distributed Systems Research Group.
 * All rights reserved.
 *
 * For more information on Distributed Systems Research Group (DSRG),
 * please see <http://www.ics.agh.edu.pl/>.
 *
 * @author radzisz
 * file name: NoteBoardImpl.java
 *
 */
package edu.agh.sr.madej;

import java.rmi.RemoteException;
import java.util.Enumeration;
import java.util.Hashtable;

/**
 * Klasa reprezentujaca zdalna tablice.
 */
public class NoteBoardImpl implements NoteBoard {
	private Hashtable users = new Hashtable();

	/**
	 * Dodaje linijke tekstu do tablicy.
	 *
	 * @param text tekst
	 * @param nick identyfikator klienta dodajacego tekst
	 */
	synchronized public void appendText(String text, String nick) throws UserRejectedException {
		//a check if user is logged in
		//on each object in listeners list call onNewText method
		
		if (users.containsKey(nick)) {
			Enumeration elements = users.keys();
			while (elements.hasMoreElements()) {
				String login = null;
				login = (String)elements.nextElement();
				NoteBoardListener listener = (NoteBoardListener)users.get(login);
				new NoteBoardServerThread(listener, login, users, text);
			}
		} else
			throw new UserRejectedException();
	}

	/**
	 * Rejestruje klienta umozliwiajac korzystanie z tablicy.
	 *
	 * @param listener referencja do obiektu klienta
	 * @param user obiekt opisujacy klienta
	 */
	synchronized public void register(NoteBoardListener listener, User user) throws UserRejectedException {
		//add user to the user list (if ther is a user with same nick throw exception
		//add reference to remote object to the reference list
		
		if (users.containsKey(user.getNick()))
			throw new UserRejectedException();
		
		users.put(user.getNick(), listener);
	}

	/**
	 * Wyrejestrowuje klienta.
	 *
	 * @param listener referencja do obiektu klienta
	 * @param user obiekt opisujacy klienta
	 */
	synchronized public void unRegister(NoteBoardListener listener, User user) throws UserRejectedException {
		//remove user from users list
		//remove refernce from references list
	
		users.remove(user.getNick());
	}

	/**
	 * Metoda logujaca
	 *
	 * @param text tekst do zalogowania
	 */
	private void log(String text) {
		System.out.println(text);
	}
}