// ============================================================
// = Ejemplo de servidor CORBA con JavaORB                  =
// ============================================================

// Servidor con POA

public class ServerPOA
{
	public static void main( String args[] )
	{
		// 1.
		// Inicializamos el ORB 
		org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

		// 2.
		// Resolvemos la referencia al RootPOA
		org.omg.CORBA.Object objPoa = null;
		org.omg.PortableServer.POA rootPOA = null;
		try
		{
			objPoa = orb.resolve_initial_references("RootPOA");			
		}
		catch ( org.omg.CORBA.ORBPackage.InvalidName ex )
		{}		

		// 3.
                // Hacemos un narrow de referencia de objeto a referencia POA
		rootPOA = org.omg.PortableServer.POAHelper.narrow(objPoa);		

		// 4.
		// Instanciamos un objeto Calculator  
		CalculatorPOAImpl calc = new CalculatorPOAImpl();
		
		try
		{
			// 5.
			// Activamos el servant dentro del ORB
			byte[] servantId = rootPOA.activate_object(calc);

			// 6.
			// Obtenemos la referencia al servant 
			org.omg.CORBA.Object ref = rootPOA.id_to_reference(servantId);

			// 6.
			// Accedemos al NamingService 
			org.omg.CORBA.Object obj = null;
			org.omg.CosNaming.NamingContext naming = null;
			try
			{			
				obj = orb.resolve_initial_references("NamingService");
				System.out.println("Locallizado el NamingService");
				naming = org.omg.CosNaming.NamingContextHelper.narrow(obj);
				System.out.println("Narrow del NamingService");
			}
			catch ( org.omg.CORBA.ORBPackage.InvalidName name )
			{
				System.out.println("No se ha podido obtener el NamingService");
				System.exit(0);
			}
		
			if ( naming == null )
			{
				System.out.println("No se ha encontrado el NamingService");
				System.exit(0);
			}
		
			// 7.
			// Construccion del nombre del objeto Calculator 
			org.omg.CosNaming.NameComponent [] name = new org.omg.CosNaming.NameComponent[1];
			name[0] = new org.omg.CosNaming.NameComponent();
			name[0].id = "Calculator";
			name[0].kind = "Example";
		
			try
			{
				naming.bind(name,ref);
			}
			catch ( org.omg.CosNaming.NamingContextPackage.NotFound ex )			
			{
				System.out.println("Objeto no encontrado");
				System.exit(0);
			}
			catch ( org.omg.CosNaming.NamingContextPackage.AlreadyBound ex )
			{	
				System.out.println("Ya hay un objeto con ese nombre");
				naming.unbind(name);
				System.exit(0);
			}
			catch ( org.omg.CosNaming.NamingContextPackage.InvalidName ex )
			{
				System.out.println("Nombre inválido");
				System.exit(0);
			}
			catch ( org.omg.CosNaming.NamingContextPackage.CannotProceed ex )
			{
				System.out.println("No se ha podido continuar");
				System.exit(0);
			}
				
			// 8.
			// Activamos el gestor de invocaciones del POA
			rootPOA.the_POAManager().activate();

			System.out.println("El servidor está preparado...");
			
			// 9.
			// Nos quedamos a la espera de peticiones sobre Calculator 
			orb.run();
		}
		catch ( java.lang.Exception ex )
		{
			System.out.println("Se ha capturado una excepción");
			ex.printStackTrace();
		}

	}
}
