Desarrollar una Aplicación Cliente

Esta lección presenta lo básico para escribir un aplicación cliente CORBA. Aquí está la versión completa de HelloClient.java.

Nota Applet: Durante esta lección nos enfocaremos en escribir una aplicación cliente CORBA, muchos de los pasos son indénticos a los requeridos para escribir applets. La mayor diferencia es que el código del applet aparece en en el método init en vez de en main. Para más información sobre como configurar la página HTML del applet, puedes ver Configurar el Fichero HTML (sólo Applets). Aquí está el código completo para la versión del applet HelloApplet.java.

Realizar Configuración Básica

El shell bñasico de un cliente CORBA es el mismo que el de muchas aplicaciones Java. Importamos los paquetes necesarios, declaramos la clase de la aplicación, definimos un método main, y recordamos manejar cualquier excepción.

Importar los Paquetes Requeridos

Arrancamos nuestro editor de texto y grabar un nuevo fichero llamado HelloClient.java en nuestro directorio de proyecto.

Importar los paqueres requeridos para la clase cliente:

import HelloApp.*;          // The package containing our stubs.
import org.omg.CosNaming.*; // HelloClient will use the naming
			    //	service.
import org.omg.CORBA.*;     // All CORBA applications need these 
			    // classes.

Nota Applets: Si estamos escribiendo un applet, también necesitaremos importar java.awt.Graphics y org.omg.CosNaming.NamingContextPackage.*. Este último paquete contiene excepciones espciales lanzadas por el servicio de nombrado.

Declarar la Clase Cliente

En HelloClient.java, declara la clase cliente:
public class HelloClient {
    // Add the main method here in the next step.
}

Nota Applets: En la versión applet de este código, HelloApplet.java, declaramos la clase applet de esta forma:
public class HelloApplet extends java.applet.Applet {
// Put the init() method here in the next step.
}

Definir un Método main

Cada aplicación Java necesita un método main. Declarado dentro del ambito de la clase HelloClient:
public static void main(String args[]) {
    // Put the try-catch block here in the next step.
}

manejar Excepciones del Sistema CORBA

Como todos los programas CORBA pueden lanzar excepciones del sistema CORBA en el momento de ejecución, debemos situar toda la funcionalidad del método main dentro de un bloque try-catch. Los programas CORBA lanzan excepciones del sistema siempre que ocurre un problema durante cualquiera de los procesos involucrados en la llamada al servidor desde el cliente.

Nuestro manejador de excepciones sólo imprime el nombre de la excepción y su pila en la salida estándard para que podamos ver qué es lo ha ido mal.

Dentro de main, configuramos un bloque try-catch:

try {
    // Add the rest of the HelloClient code here.
} catch(Exception e) {
    System.out.println("ERROR : " + e);
    e.printStackTrace(System.out);
}

Crear un Objeto ORB

Un cliente CORBA necesita un objeto ORB local para realizar todas sus ordenes y trabajo IIOP. Cada cliente ejemplariza un objeto org.omg.CORBA.ORB y lo inicializa pasandole al objeto cierta información sobre sí mismo.

Dentro del bloque try-catch de HelloClient.java, declaramos e inicializamos una variable ORB:

ORB orb = ORB.init(args, null);
La llamada al método init del ORB le pasa a nuestra aplicación los argumentos de la línea de ocmandos, permitiendonos seleccioanar propiedaes durante la ejecución.

Encontrar el Servidor Hello

Una vez que la aplicación tiene un ORB, puede pedirle al ORB que localice el servico real que ncesita, en este caso el servidor Hello. Hay un número de formas para que un cliente CORBA obtenga una referencia inicial a un objeto; nuestra aplicación cliente usará el COS Naming Service especificado por el OMG y proporcionado con Java IDL. Puedes ver Usar Referencias a Objetos Stringified para más información sobre cómo obtenter una referencia inicial a un objeto cuando no hay servicio de nombres disponible.

Obtener el Contexto de Nombres Inicial

El primer paso para usar el servicio de nombrado es obtener el contecto de nombres inicial. En el bloque try-catch, debajo de la inicialización de uestro ORB, llamamos a orb.resolve_initial_references para obtener un objeto referencia al servidor de nombres:
org.omg.CORBA.Object objRef =
                 orb.resolve_initial_references("NameService");
El string "NameService" está definido para todos los ORBs CORBA. Cuando pasamos este string, el ORB retorna el contexto d enombre inicial, un objeto referencia al servicio de nombres.

Apuntando hacia el Objeto Referencia

Como con todos los objetos referencia de CORBA, objRef es un objeto CORBA genérico. Para usarlo como un objeto NamingContext, debemos apuntar hacia el tipo apripiado. Añadimos la llamada a narrow justo debajo de la sentencia anterior
NamingContext ncRef = NamingContextHelper.narrow(objRef);
Aquí vemos el uso de una clase de ayuda genrada por idltojava, similar en funcion a HelloHelper. El objeto ncRef es ahora un org.omg.CosNaming.NamingContext y podmeos usarlo para aceder al servicio de nombres y encontrar otros servicios. Haremos esto en el siguiente paso.

Encontrar el Servicio de Nombres

Los nombres pueden tener diferentes estructuras dependiendo de la implementación del servicio. Consecuentemente, los servidores de nombres CORBA manejan nombres complejos mediante objetos NameComponent. Cada NameComponent contiene una sola parte, o elemento, del nombre.Un array d eobjeto NameComponent puede contener un path completamente especificado de un objeto en cualquier systema de ficheros o de discos de un ordenador.

Para encontrar el servidor Hello, primero necesitamos un NameComponent que contenfa una cadena identificativa del servidor Hello. Añadimo este código directamente debajo de la llamada a narrow.

NameComponent nc = new NameComponent("Hello", "");
Esta sentencia selecciona el campo id de nc, el nuevo NameComponent, a "Hello" y el campo kind con una cadena vacía.

Como el path del objeto Hello sólo tiene un elemento, creamos un array de un sólo elemento fuera de nc. El método NamingContext.resolve requiere este array para funcionar:

NameComponent path[] = {nc};
Finalmente, pasamos path al método resolve del servicio de nombres, para obtener un objeto referencia al servidor Hello y apuntarlo hacia el objeto Hello:
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
Aquí podemos ver la clase HelloHelper funcionando. El método resolve devuelve un objeto CORBA genérico como vimos arriba cuando localizamos el propio servicio de nombres. Por lo tanto, lo apuntamos directamente al objeto Hello, que es el objeto referencia que necesitamos para realizar el resto de nuestro trabajo.

Invocar a la Operación sayHello

Las invocaciones CORBA se parecen a las llamadas a métodos de un objeto local. Las compilcaciones de ordenar parámetros por el cable, enrutarlos al ORB del lado del servidor, desordenar, y situar la llamada al método servidor son completamente transparentes al programador del cliente. Como casi toda la generación de código está hecha, la invocación es realmente la parte más sencilla de la programación CORBA.
  1. Continuando con el bloque try-catch en HelloClient.java, introducimos la siguiente invocación debajo de la llamada al método resolve del servicio de nombres:
    String hello = helloRef.sayHello();
    
  2. Finalmente, añadimos el código para imprimir los resultados de la invocación en la salida estándard:
    System.out.println(hello);
    
  3. Grabar y cerrar HelloClient.java.

Configuración del fichero HTML (sólo Applets)

Tutorial.html se utiliza para mostrar nuestro applet finalizado, pero necesitamos personalizar unos pocos atributos y parámetros.
  1. Abrimos Tutorial.html en nuestro editor de texto.
  2. Dentro de la etiqueta APPLET, introducimos el path de nuestro directorio de proyecto como el valor para el atributo CODEBASE.
  3. En la primera etiqueta PARAM, introducimos el nombre de la máquina donde se está ejecutando el servidor de nombres CORBA (la mayoría de las veces será nuestra máquina local) como el valor de ORBInitialHost.
  4. Nos aseguramos de que la segunda etiqueta PARAM contiene el valor de ORBInitialPort que estamos suando para ejecutar el servidor de nombres (está preseleccioanda a 1050 para funcionar con el valor por dfecto suado en los ejemplo de esta sección). En cualquier caso, debería ser un valor por encima de 1028.
Ya estamos listos para escribir el código del servidor.

Ozito