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.
- Arrancamos nuestro editor de texto favorito y creamos un fichero llamado Hello.idl.
- En nuestro fichero, introducimos la sentencia módulo:
module HelloApp { // Add subsequent lines of code here. };- 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:
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.module HelloApp { interface Hello // Add { // these // four }; // lines. };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:
Cómo nuestra pequeá aplicación Hello World sólo tiene una operación, Hello.idl ya está completo.module HelloApp { interface Hello { string sayHello(); // Add this line. }; };
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:
- Ir al prompt de la línea de comandos.
- Cambiar al directorio donde esté nuestro fichero Hello.idl.
- Introducimos el comando de compilador:
idltojava Hello.idlSi 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:
Con un interface tan sencillo, es fácil ver cómo las sentencias IDL se mapea para generar las sentencias Java./* Hello.java as generated by idltojava */ package HelloApp; public interface Hello extends org.omg.CORBA.Object { 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.
Mapeo de Sentencias IDL a Sentencias Java Sentencia IDL Sentecia Java module HelloApp package HelloApp; interface Hello public interface Hello string sayHello(); String sayHello();
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: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 .
- _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.
- 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.