package rmi;

import java.io.IOException;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/**
 * Clase servidor de RMI
 *
 * @author Enrique M.L
 */
public class RMIServer {

	/**
	 * Método que crea el registro RMI en el puerto 'RMIPortNum'
	 * 	
	 * @param RMIPortNum
	 * @throws RemoteException
	 */
	private static void startRegistry(int RMIPortNum) throws RemoteException{
		try {
			Registry registry = LocateRegistry.getRegistry(RMIPortNum);
			registry.list( ); 
		}
		catch (RemoteException e) { 
			System.out.println("No se ha encontrado RMI registry en el puerto "  + RMIPortNum);
			LocateRegistry.createRegistry(RMIPortNum);
			System.out.println("RMI registry creado en puerto " + RMIPortNum);
		}
	}

	/**
	 * Método que lista los registros actuales de la direción de registro 'registryURL'
	 * 
	 * @param registryURL
	 * @throws RemoteException
	 * @throws MalformedURLException
	 */
	private static void listRegistry(String registryURL) throws RemoteException, MalformedURLException {
		System.out.println("Registry " + registryURL + " contains: ");
		String [ ] names = Naming.list(registryURL);
		for (int i=0; i < names.length; i++)
			System.out.println(names[i]);
	}

	/**
	 * Método que crea el servidor RMI en el puerto 'RMIPortNum' y exporta el objeto remoto RMIImpl, pasandole como parametro 'ruteRoot'
	 * @param RMIPortNum
	 * @param rutaRaiz
	 * @throws RemoteException
	 */
	public static void createServer(int RMIPortNum, String ruteRoot) throws RemoteException{

		try{
			startRegistry(RMIPortNum);
			RMIImpl rMI01Impl = new RMIImpl(ruteRoot);
			String registryURL = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":" + RMIPortNum + "/SecuritySCP";
			Naming.rebind(registryURL, rMI01Impl);
			listRegistry(registryURL);
		}		
		catch(java.rmi.ConnectException ce)
		{
			ce.printStackTrace();
			System.exit(-1);
		}
		catch (IOException ioe)
		{
			ioe.printStackTrace();
			System.exit(-1);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			System.exit(-1);
		}

	}


}
