Escribir el Inteface IDL

En esta sección, escribiremos un sencillo interface IDL para el programa Hello world. El interface IDL define el contrato entre las partes cliente y servidor de nuestra aplicación, especificando qué operaciones y atributos están disponibles. IMG IDL es independiente del lenguaje de programación. Debemos mapearlo a Java antes de escribir cualquier código de implementación. (Ejecutando idltojava sobre el fichero IDL hará esto por nosotros automáticamente.) Aquí está el fichero Hello.idl completo.

Escribir Hello.idl

OMG IDL es un lenguaje puramente declarativo diseñado para especificar interfaces operaciones independientes del lenguaje de programación para aplicaciones distribuidas. OMG especifica un mapeo desde IDL a diferentes lenguajes de programación, incluyendo C, C++. Smalltalk, COBOL, Ada, y Java. Cuando se mapea, cada sentencia del OMG IDL es traducida al la correspondiente sentencia en el lenguaje de programación que hemos elegido. Podemos usar la herramienta idltojava para mapear un interface IDL a Java e implementar las clases cliente. Cuando mapeamos el mismo IDL a C++ e implementamos el servidor en ese lenguaje, el cliene Java y el servidor C++ interoperan a través del ORB como si estuvieran escritos en el mismo lenguaje.

El IDL para Hello world es extremadamente sencillo, su único inteface tiene una sóla aplicación. Necesitamos realizar sólo estos tres pasos:

Paso 1: Declarar el Módulo CORBA IDL

Un módulo CORBA es un nombre que actúa como contenedor para interfaces y declaraciones relacionados. Corresponde casi con un paquete java. Cada sentencia módulo en un fichero IDL se mapea en una sentencia de paquete Java.
  1. Arrancamos nuestro editor de texto favorito y creamos un fichero llamado Hello.idl.
  2. En nuestro fichero, introducimos la sentencia módulo:
    module HelloApp { 
    	// Add subsequent lines of code here.
    };
    
  3. Grabamos el fichero. Cuando ejecutemos idltojava sobre el IDL, esta sentencia generará una sentencia de paquete en código Java.

Paso 2: Declarar el Interface

Al igual que los interfaces Java, los interfaces CORBA declaran el contrato API que un objeto tiene con otros objetos. Cada sentencia interface en el IDL se mapea a una sentencia de interface Java.

En nuestro fichero Hello.idl, introduce la sentencia de interface:

module HelloApp {
    interface Hello  // Add
    {                // these
                     // four
    };               // lines.
};
Cuando compilamoe el IDL, esta sentencia generará una sentencia interface en código Java. Nuestras clases cliente y servidor implemetarán el interface Hello de formas diferente.

Paso 3: Declarar las Operaciones

Las operaciones CORBA son el comportamiento que el servidor promete realizar sobre los clientes que lo invocan. Cada sentencia operación en el IDL genera su corresponiente sentencia método el interface Java generado.

En nuestro fichero Hello.idl, introducimos la sentencia de operación:

module HelloApp {
    interface Hello
    {
        string sayHello();  // Add this line.
    };
};
Cómo nuestra pequeá aplicación Hello World sólo tiene una operación, Hello.idl ya está completo.

Mapear Hello.idl desde IDL a Java

La herramienta idltojava lee los ficheros OMG IDL y crea los ficheros Java necesarios. La configuración por defecto de idltojava necesita un fichero cliente y servidor (como hicimos para nuestro programa Hello World), simplemente introducimos el nombre de la herramienta y el nombre de nuestro fichero IDL:
  1. Ir al prompt de la línea de comandos.
  2. Cambiar al directorio donde esté nuestro fichero Hello.idl.
  3. Introducimos el comando de compilador:
    idltojava Hello.idl
    

Si listamos los contenidos del directorio, veremos que se ha creado un directorio llamado HelloApp y que contiene cinco ficheros. Intentamos abrir Hello.java en nuestro editor de texto. Se parecerá a esto:

/* Hello.java as generated by idltojava */
package HelloApp;
public interface Hello
    extends org.omg.CORBA.Object {
    String sayHello();
}
Con un interface tan sencillo, es fácil ver cómo las sentencias IDL se mapea para generar las sentencias Java.

Mapeo de Sentencias IDL a Sentencias Java
Sentencia IDL Sentecia Java
module HelloApp package HelloApp;
interface Hello public interface Hello
string sayHello(); String sayHello();
La única sorpresa es la sentencia extends. Todos los objetos CORBA descienden de org.omg.CORBA.Object para asegurar la funcionalidad necesaria de CORBA. El código necesario lo genera idltojava; no necesitamos hacer el mapeo nosotros mismos.

Entender la Salida del Compilador idltojava

El compilador idltojava genera un número de ficheros, basándose en las opciones elegidas en la línea de comandos. Como estos proporcionan funcionalidades estándard, podemos ignoralmos hasta el momento de desarrollar y ejecutar nuestro programa. Los cinco ficheros generados por idltojava son:
_HelloImplBase.java
Esta clase abstracta es el esqueleto delservidor, proporcionando funcionalidades básicas de CORBA para el servidor. Implementa el interface Hello.java. La lcase servidor HelloServant desciende de _HelloImplBase.
_HelloStub.java
Esta clase es el cliente, proporciona funcionalidad CORBA al cliente. Implementa el interface Hello.java.
Hello.java
Este interface contiene la versión Java de nuestro interface IDL. Contiene el único método sayHello. El interface Hello.java desciende de org.omg.CORBA.Object, proporcionado también funcionalidades estándares de CORBA.
HelloHelper.java
Esta clase final proporciona funcionalidades auxiliares, notablemente el método narrow requerido para convertir las referencias de los objetos CORBA a sus propios tipos.
HelloHolder.java
Esta clase final conteine un ejemplar público del tipo Hello. Proporciona operaciones para argumentos de entrada y salida, que CORBA tiene pero que no se mapean fácilmente a la semántica Java.
Caundo escribimos nuestro interface IDL, hacemos toda la programación requerida para generar todos estos ficheros para nuestra aplicación distribuida. El único trabajo adicional necesario es la implementación real de las clases cliente y servidor. En la lección siguiente, crearemos las clases HelloClient.java, HelloApplet.java HelloServer.java .

Resolución de Problemas

Error Message: "idltojava" not found
Si intentamos ejecutar idltojava sobre el fichero Hello.idl y el sistema no puede encontrar idltojava, lo más común es que el ejecutable no esté en el path. Deberemos asegurarnos de que la dirección del idltojava está en nuestro path.
Error Message: preprocessor failed
idltojava usa un preprocesador C/C++ por defecto. Debemos modificar el valor por defecto seleccionando dos variables de entorno, CPP y CPPARGS. Si no queremos usar un preprocesador, podemos desasctivarlo añadiendo -fno-cpp a la línea de comandos de idltojava.

Ozito