package javacodebook.net.rmi.objectreference;

import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.UnicastRemoteObject;
import java.net.MalformedURLException;
import java.util.*;

/**
 * @author benjamin_rusch
 *
 * Dieser Server beinhaltet AddressDaten. Kennt der Client den Nachname,
 * kann er weitere Informationen über diese Person erlangen.
 * Zusätzlich hat er noch Zugriff auf die Anzahl gespeicherter Adressen
 * Achtung: Bevor der Server laufen kann müssen Stub und Skeleton generiert
 * werden:
 * 	   rmic javacodebook.net.rmi.reference.AddressBookServer
 * 	   rmic javacodebook.net.rmi.reference.AddressImpl
 */
public class AddressBookServer implements AddressBook {

	// Adressen werden in eine HashTable abgelegt
	private Hashtable content = new Hashtable();

	public int getSize() throws RemoteException {
		return content.size();
	}

	public Address getAddressByName(String name) throws RemoteException {
		return (Address)content.get(name);
	}

	public AddressBookServer(int port)throws Exception
	{
		// AdressBuch wird mit Daten gefüllt
		fillHashTable(port);
		// Die Registry wird vom Programm aus gestartet
		LocateRegistry.createRegistry(port);
		// Dieses Server-Object wird exportiert
		UnicastRemoteObject.exportObject(this,port);

		// Das exportierte Objekt wird an der registry mit defnierter
		// URL angemeldet
  		Naming.rebind("//localhost:"+port+"/"+AddressBook.NAMING, this);
	}

	/**
	 * Füllt Adressbuch mit Daten.
	 */
	private void fillHashTable(int port) throws RemoteException{
		Address a1= new AddressImpl("Arbeit", "Andi", "Terlindenweg","Soest");
		Address a2= new AddressImpl("Einstellbar","Manuel","Kaiserallee",
				"Karlsruhe");
		Address a3= new AddressImpl("Sörwis","Sigrid","Winsstrasse","Berlin");
		Address a4= new AddressImpl("Mutig","Miss","Kungshamra","Stockholm");

		// Die AddressImpl-Objekte müssen exportiert, aber nicht am
		// Namensdienst angemeldet werden.
		// (Der Namensdienst wird nur für den ersten Kontakt zwischen Client
		// und Server benötigt. anschließend können die Referenzen wie gehabt
		// hin und her geschickt werden).
		UnicastRemoteObject.exportObject(a1,port);
		UnicastRemoteObject.exportObject(a2,port);
		UnicastRemoteObject.exportObject(a3,port);
		UnicastRemoteObject.exportObject(a4,port);

		content.put("Arbeit",a1);
		content.put("Einstellbar",a2);
		content.put("Sörwis",a3);
		content.put("Mutig",a4);
	}

	// Server wird gestartet.
	public static void main(String[] args) throws Exception{
			new AddressBookServer(1099);
	}
}
