Download Mapping de IDL a Java
Document related concepts
no text concepts found
Transcript
Correspondencia de IDL a Java Sistemas Distribuidos: Programación con CORBA Juan Pavón Mestras Dep. Sistemas Informáticos y Programación Universidad Complutense Madrid Correspondencia de IDL a Java n El programador debe conocer la correspondencia para n n n Usar las definiciones IDL de Java Implementar las definiciones IDL en Java El compilador IDL se encarga de generar el código Java correspondiente n El compilador de IDL a Java: > jidl fichero.idl n Se generan varios archivos que tienen las clases necesarias para implementar el stub y el skeleton Juan Pavón Mestras, UCM 2000-01 IDL a Java 2 1 Correspondencia de los tipos primitivos IDL a Java IDL void boolean char wchar short unsigned short long unsigned long long long unsigned long long float double octet any Juan Pavón Mestras, UCM 2000-01 Java void boolean char char short short int int long long float double byte org.omg.CORBA.Any IDL a Java 3 Tipo string n Los tipos string y wstring IDL representan cadenas de caracteres n n n De tipo char: string De tipo wchar: wstring Si se quiere limitar la longitud de un string, se puede indicándola entre < y > typedef string nombre; typedef string<5> codigo_postal; typedef wstring cadenaUnicode; Juan Pavón Mestras, UCM 2000-01 IDL a Java 4 2 Tipo string n Los tipos string y wstring se corresponden con la clase java.lang.String n Los tipos string de IDL pueden tener longitud limitada o ilimitada • Ambos se corresponden con la clase java.lang.String, que no pone límites • Si se intenta enviar un String Java mayor del límite máximo definido en el IDL se produce la excepción org.omg.CORBA.MARSHAL al realizar el marshalling n Los string IDL son secuencias de caracteres de 8 bits. Si se usa un carácter Unicode en un String Java se produce la excepción org.omg.CORBA.DATA_CONVERSION • Se debe utilizar wstring cuando sea necesario pasar caracteres Unicode Juan Pavón Mestras, UCM 2000-01 IDL a Java 5 Tipos construidos n Correspondencia de enum en Java n En Java se define una nueva clase que tiene • un método value() que devuelve el entero equivalente a la etiqueta • dos miembros de datos estáticos por etiqueta • un método de conversión de entero a etiqueta Juan Pavón Mestras, UCM 2000-01 IDL a Java 6 3 Tipos construidos enum dias {lunes, martes, miercoles, jueves, viernes, sabado, domingo}; public final class dias implements java.lang.Coneable { public static final int _lunes = 0; public static final dias lunes = new dias(_lunes); public static final int _martes = 1; public static final dias martes = new dias(_martes); // ... así sucesivamente para cada valor del enum // y los dos métodos siguientes: public int value() { /* ... */ } public dias from_int(int value) { /* ... */ } } Juan Pavón Mestras, UCM 2000-01 IDL a Java 7 Tipos construidos n struct n Se corresponde a tres clases Java • una de implementación de la estructura y con el mismo nombre • las clases Helper y Holder Juan Pavón Mestras, UCM 2000-01 IDL a Java 8 4 Tipos construidos struct sistema { string nombre; lenguaje programacion; short nro_usuarios; }; public final class sistema { public String nombre; public lenguaje programacion; public short nro_usuarios; public sistema() { /* ... */ } public sistema(String nombre, lenguaje programacion, short nro_usuarios) { /* ... */ } } Juan Pavón Mestras, UCM 2000-01 IDL a Java 9 Tipos construidos n union n Se corresponde a tres clases Java • una de implementación de la union y con el mismo nombre • proporciona los métodos para leer y modificar los miembros de la union • el discriminante se pone automáticamente y se puede leer con el método discriminator() • si se utiliza un método de acceso incorrecto produce la excepción org.omg.CORBA.BAD_OPERATION • las clases Helper y Holder Juan Pavón Mestras, UCM 2000-01 IDL a Java 10 5 Tipos construidos n union union compilador switch (lenguaje) { case Java: string versionstring; default: long versionlong; }; // código en el cliente: compilador c = new compilador(); c.versionstring(“3.2”); // código en el servidor: switch (c.discriminator()) { case Java: System.out.println(c.versionstring()); break; default: System.out.println(c.versionlong()); }; Juan Pavón Mestras, UCM 2000-01 IDL a Java 11 Tipos contenedores n sequence n En Java se corresponden en un array y las clases Helper y Holder • igual tanto si es limitada como si no • si al enviar una secuencia declarada como limitada se sobrepasa el límite se produce la excepción org.omg.CORBA.MARSHAL Juan Pavón Mestras, UCM 2000-01 IDL a Java 12 6 Tipos contenedores // IDL typedef sequence<long,8> numeros; // secuencia limitada de 3 long interface Prueba { void operacion(in numeros nums); }; // uso en el programa cliente int[] nn = new int[5]; for (int i=0; i<5; i++) nn[i] = i; refPrueba.operacion(nn); Juan Pavón Mestras, UCM 2000-01 IDL a Java 13 Tipos contenedores n array n La correspondencia en Java es también un array, pero en Java los arrays no tienen predeterminada una longitud fija • Si se intenta transmitir un array de dimensiones distintas de las definidas se produce la excepción org.omg.CORBA.MARSHAL • Se generan también las clases Holder y Helper correspondientes typedef Banco arrayDeBancos[10]; typedef long matriz[6][8]; Juan Pavón Mestras, UCM 2000-01 IDL a Java 14 7 Any n any n n n Puede representar un tipo IDL cualquiera Se corresponde a la clase org.omg.CORBA.Any Utiliza el pseudo-tipo TypeCode (implementado por la clase org.omg.CORBA.TypeCode) para determinar el tipo que representa package org.omg.CORBA; public class Any { public TypeCode type(); public byte[] value(); // ... } Juan Pavón Mestras, UCM 2000-01 IDL a Java 15 TypeCode n TypeCode n n n Es un contenedor de información específica a un tipo IDL Está definido en orb.idl Un TypeCode tiene • Un campo kind que es un objeto de la clase TCKind • Se puede conocer con la operación kind() • Otros campos con información adicional sobre el tipo kind() TCKind.tk_int TCKind.tk_sequence TypeCode para el tipo básico IDL int int content_type() 10 length() TypeCode para sequence<int, 10> Juan Pavón Mestras, UCM 2000-01 IDL a Java 16 8 TypeCode n TypeCode n Un objeto TypeCode se puede obtener de varias maneras: • Llamando al método Any.insert_X() que crea un objeto TypeCode para el tipo X y lo asigna al campo type del objeto Any • Con los métodos ORB.create_X_tc() que devuelven un TypeCode para el tipo X correspondiente • Como valor de retorno del método _type() de las clases Holder • De un Repositorio de Interfaces CORBA n Ofrece operaciones para: • Acceder a su tipo: • TCKind kind(); • Comparar si dos objetos TypeCode son iguales • boolean equal(in TypeCode tc); • Acceder a campos específicos de cada tipo • TypeCode content_type() raises (BadKind); • unsigned long length() raises (BadKind); • ... etc. Juan Pavón Mestras, UCM 2000-01 IDL a Java 17 TCKind n Es un enumerado con todos los clases posibles de TypeCode (una para cada tipo de datos de IDL esencial y primitivo): • • • • • • • • • • TCKind._tk_void TCKind._tk_short TCKind._tk_long TCKind._tk_ushort TCKind._tk_ulong TCKind._tk_float TCKind._tk_double TCKind._tk_boolean TCKind._tk_char TCKind._tk_octet Juan Pavón Mestras, UCM 2000-01 • TCKind._tk_any • TCKind._tk_TypeCode • TCKind._tk_array • TCKind._tk_enum • TCKind._tk_struct • TCKind._tk_union • TCKind._tk_objref • TCKind._tk_sequence • ... IDL a Java 18 9 Any n Uso de any con TypeCode de tipos básicos Any a = resultado_operacion(); TypeCode tc = a.type(); switch ( tc.kind() ) { case TCKind._tk_long: int valor = a.extract_long(); System.out.println(“Any contiene un long: “+ valor); break; case TCKind._tk_XXX: XXX valor = a.extract_XXX(); System.out.println(“Any contiene un XXX: “+ valor); break; default: throw new ExcepcionFalloEnAny(a); } Juan Pavón Mestras, UCM 2000-01 IDL a Java 19 Any n Uso de any con TypeCode de tipos básicos // ... case TCKind._tk_objref: java.lang.Object objeto = a.extract_object(); // Y luego tal vez se haga un narrow System.out.println(“Any contiene una referencia a objeto de interfaz “ + tc.name() + “ con id “ + tc.id()); break; // ... El resultado sería algo así: Any contiene una referencia a objeto de interfaz Banco con id IDL:Banco:1:0 Juan Pavón Mestras, UCM 2000-01 IDL a Java 20 10 Any n Para construir un objeto Any n Con los métodos insert_X() de la clase Any para los tipos básicos a.insert_boolean(true); a.insert_long(10); n n Usando el método estático insert() de la clase Helper para los demás tipos CuentaHelper.insert(unAny, cuentaRef); Para consultar un objeto Any n Con los métodos extract_X() de la clase Any para los tipos básicos a.extract_boolean(true); a.extract_long(10); n Usando el método estático extract() de la clase Helper para los demás tipos Cuenta nuevaCuenta = CuentaHelper.extract(unAny); Juan Pavón Mestras, UCM 2000-01 IDL a Java 21 typedef n Para dar un nombre más significativo a un tipo dado n n n También para permitir la definición de nuevos tipos con sequence y array Ejemplos: typedef string identificador; typedef sequence<long> numeros; typedef Banco BancoNacional; En Java no existe typedef n n Los tipos definidos por el usuario en IDL se pasan en Java al tipo correspondiente Además se crea una clase Helper de soporte para la manipulación del tipo Juan Pavón Mestras, UCM 2000-01 IDL a Java 22 11 Interfaz n Interfaz n n n n Grupo de operaciones y atributos Unidad de herencia Un objeto implementa una o más interfaces Operación n Requiere: • Valor de retorno • Nombre de operación • Lista de parámetros (in, out, inout) n Opcional: • Excepciones • Declaración oneway n Atributo n n Define el acceso a un valor para leerlo o modificarlo Si solo se puede acceder al valor en lectura: readonly Juan Pavón Mestras, UCM 2000-01 IDL a Java 23 Interfaces n Correspondencia de interfaces. Lado cliente n Para un cliente una interfaz se corresponde con: n n Una interfaz Java del mismo nombre La clase que implementa el stub • proporciona la funcionalidad del objeto proxy Juan Pavón Mestras, UCM 2000-01 IDL a Java 24 12 Interfaces n Correspondencia de interfaces. Lado servidor n Para un servidor una interfaz se corresponde con: n n Una interfaz Java del mismo nombre Dos clases que soportan dos modos de implementar la interfaz • Herencia • Delegación (clase TIE) Juan Pavón Mestras, UCM 2000-01 IDL a Java 25 Interfaz n Herencia de Interfaces n La correspondencia en Java es en herencia de interfaces Java public interface nuevo extends padre, madre, abuelo { public void nuevaoperacion (int parametro); }; Juan Pavón Mestras, UCM 2000-01 IDL a Java 26 13 Correspondencia de operaciones n Una operación se corresponde con un método Java, con el mismo nombre y parámetros interface Cuenta { exception SaldoInsuficiente { float balance; } ; void ingreso(in float cantidad); void reintegro(in float cantidad) raises (SaldoInsuficiente); }; interface Cuenta { public void ingreso(float cantidad) ; public void reintegro(float cantidad) throws CuentaPackage.SaldoInsuficiente; }; Juan Pavón Mestras, UCM 2000-01 IDL a Java 27 Paso de parámetros n Java pasa los parámetros por valor n n n También las referencias a objetos El paso de parámetros in y los valores de retorno se corresponden en Java directamente Para los parámetros out o inout se necesita simular el paso por referencia: • clases Holder: definidas para los tipos básicos y para los tipos definidos por el usuario final public class ShortHolder { public short value; public ShortHolder () {} public ShortHolder (short value) { this.value = value; } } Juan Pavón Mestras, UCM 2000-01 IDL a Java 28 14 Paso de parámetros n Clases Holder // IDL interface EjemploHolder { void operacion (out short numero); }; // correspondencia en Java public interface EjemploHolder extends org.omg.CORBA.Object { public void operacion (org.omg.CORBA.ShortHolder numero); } Juan Pavón Mestras, UCM 2000-01 IDL a Java 29 Paso de parámetros n Clases Holder // código en el cliente ShortHolder s = new ShortHolder(); //... refEjemploHolder.operacion(s); short numero = s.value; //... // código en el servidor public void operacion (org.omg.CORBA.ShortHolder numero) { //... // actualiza el contenido del Holder numero.value = 33; //... } Juan Pavón Mestras, UCM 2000-01 IDL a Java 30 15 Correspondencia de atributos n En Java un atributo se corresponde a dos operaciones de lectura y modificación (o una sola de lectura si es readonly) public interface Cuenta extends org.omg.CORBA.Object { public String cliente(); public void cliente(String value); public float balance(); // ... operaciones }; Juan Pavón Mestras, UCM 2000-01 IDL a Java 31 Excepciones n Una excepción CORBA se corresponde con una clase Java java.lang Exception RuntimeException org.omg.CORBA UserException SystemException INV_OBJREF BAD_OPERATION CuentaInexistente COMM_FAILURE SaldoInsuficiente Juan Pavón Mestras, UCM 2000-01 IDL a Java 32 16 Excepciones n Una excepción CORBA se corresponde con una clase Java final public class CuentaInexistente extends org.omg.CORBA.UserException { //... } final public class SaldoInsuficiente extends org.omg.CORBA.UserException { //... double saldoActual; } // y se declara en el método: void reintegro (string cuenta, double cantidad) throws NombreInexistente, SaldoInsuficiente { /* ... */ } Juan Pavón Mestras, UCM 2000-01 IDL a Java 33 Constantes n La correspondencia a Java n Si la constante estaba declarada dentro de una interfaz se corresponde a un campo public static final dentro de la interfaz Java correspondiente: interface Matematicas { const float pi = 3.14159; }; public interface Matematicas extends org.omg.CORBA.Object { public static final float pi = (float)3.14159; } n En los demás casos se define una interfaz con el nombre de la constante y el campo value: const float pi = 3.14159; public interface pi { public static final float value = (float)3.14159; } Juan Pavón Mestras, UCM 2000-01 IDL a Java 34 17 Reglas de ámbito n Todas las definiciones IDL realizadas dentro de una interfaz se colocan dentro de un paquete Java con el nombre <nombre_de_interfaz>Package n En el ejemplo anterior aparecerán los paquetes: n BancoPackage • con las clases CuentaInexistente, CuentaInexistenteHelper, CuentaInexistenteHolder, Rechazada, RechazadaHelper y RechazadaHolder n CuentaPackage • con las clases SaldoInsuficiente, SaldoInsuficienteHolder, ySaldoInsuficienteHelper n CuentaCreditoPackage • vacío Juan Pavón Mestras, UCM 2000-01 IDL a Java 35 Resumen de la correspondencia IDL-Java CORBA Java module package interface interface operación método Java con el mismo nombre parámetros in parámetros Java normales parámetros out e inout clases <tipo>Holder excepciones de usuario clase Java que hereda de org.o m g.CORBA.UserException excepciones de sistema org.o m g.CORBA.SystemException attribute método con el mismo nombre del atributo, sobrecargado para lectura y modificación const public static final nombre Juan Pavón Mestras, UCM 2000-01 IDL a Java 36 18 Resumen de la correspondencia IDL-Java CORBA Java boolean, TRUE, FALSE boolean, true, false char, wchar char octet byte string, wstring java.lang.String short, unsigned short short long, unsigned long int long long, unsigned long long long float float double double any org.omg.CORBA.Any Juan Pavón Mestras, UCM 2000-01 IDL a Java 37 Resumen de la correspondencia IDL-Java CORBA Java sequence array array array struct clase Java con el mismo nombre, y miembros y constructores para cada campo enum clase Java con el mismo nombre union clase Java con el mismo nombre y métodos get/set para cada campo typedef No existe en Java. Se usa el tipo IDL correspondiente y se crea una clase Helper Juan Pavón Mestras, UCM 2000-01 IDL a Java 38 19 Resumen de la correspondencia IDL-Java CORBA Java implementación de servidor implementación usando herencia clase que extiende la clase <nombre -de-interfaz>POA implementación usando delegación la clase que hereda de _tie _<nombre -de-interfaz> llama a la clase que implementa la interfaz <nombre -de-interfaz> Operations pseudo-objetos CORBA CORBA::ORB org.o m g.CORBA.ORB CORBA::Object org.o m g.CORBA.Object CORBA::TypeCode org.o m g.CORBA.TypeCode CORBA::TCKind org.o m g.CORBA.TCKind Juan Pavón Mestras, UCM 2000-01 IDL a Java 39 20