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