Download 3.2 Mapping de IDL a Java

Document related concepts
no text concepts found
Transcript
3.2 Mapping de IDL a Java
Tipos predefinidos (1)
n
Tipo IDL
short
Tipo Java
short
long
int
long long
long
unsigned short
short
unsigned long
int
unsigned long long
float
long
double
double
long double
De momento, no está soportado
float
El rango de los tipos enteros IDL sin signo es mayor que el de los tipos
Java (los enteros sin signo grandes llegan como negativos)
Tipos predefinidos (y 2)
n
Tipo IDL
char
Tipo Java
char
wchar
char
string
java.lang.String
wstring
java.lang.String
octet
byte
boolean
boolean (las constantes IDL TRUE y
FALSE se mapean a true y false)
any
org.omg.CORBA.Any (abstracta)
Se producen excepciones si se violan los rangos de los caracteres o el
tamaño de las cadenas de caracteres acotadas
typedef
n
n
En Java no existe una construcción similar a
typedef
Se usa el tipo original
Enumeraciones
// IDL
enum Color {red, green, blue, yellow, white};
// Java
public class Color
implements org.omg.CORBA.portable.IDLEntity {
public static final int _red = 0;
public static final Color red = new Color(_red);
public static final int _green = 1;
public static final Color green = new Color(_green);
// ...
public int value() { ... }
public static Color from_int(int value) { ... }
protected Color(int value) { ... }
}
n
Dado que cada valor es un singleton, la igualdad entre valores se
puede comprobar con equals().
Estructuras
// IDL
struct Date {
short year;
short month; // 1-12
short day; // 1-31
};
// Java
final public class Date
implements org.omg.CORBA.portable.IDLEntity {
public short year;
public short month;
public short day;
public Date() {}
public Date(short year, short month,
short day) { ... }
}
Union (1)
// IDL
union Token switch(Color) {
case blue:
float floatValue;
case red:
case green:
long longValue;
default:
string stringValue;
};
// Java
final public class Token
implements org.omg.CORBA.portable.IDLEntity {
public Token() { ... }
public Color discriminator() { ... }
Union (y 2)
public
public
public
public
public
float floatValue() { ... }
void floatValue(float value) { ... }
long longValue() { ... }
void longValue(long value) { ... }
void longValue(Color discriminator,
long value) { ... }
public String stringValue() { ... }
public void stringValue(String value) { ... }
public void stringValue(Color discriminator,
String value) { ... }
} // class
Vectores y secuencias (1)
n
Los vectores y secuencias (acotadas y no acotadas)
se mapean a vectores Java
Se produce una excepción si se violan longitudes (vectores y
secuencias acotadas)
// IDL
n
typedef
typedef
typedef
typedef
Date DateVector[10];
string StringMatrix[10][20];
sequence<Color> Colors;
sequence<Date, 10> Dates10;
struct Example {
DateVector fDateVector;
StringMatrix fStringMatrix;
Colors fColors;
Dates10 fDates10;
};
Vectores y secuencias (y 2)
// Java
final public class Example
implements org.omg.CORBA.portable.IDLEntity {
public Date[] fDateVector;
public String[][] fStringMatrix;
public Color[] fColors;
public Date[] fDates10;
public Example() {}
public Example(Date[] fDateVector,
String[] fStringMatrix, Color[] fColors,
Date[] fDates10) { ... }
};
Módulos
n
Se mapean a paquetes
n
Los tipos definidos dentro del módulo que mapean a
clases/interfaces, pertenecerán al correspondiente paquete
// IDL
module es { module udc { module fbellas {
module corba { module clock { module idl {
struct TimeOfDay { ... };
}; }; }; }; }; };
// Java
package es.udc.fbellas.corba.clock.idl;
final public class TimeOfDay
implements org.omg.CORBA.portable.IDLEntity { ... }
Interfaces (1)
// IDL
interface Clock {
TimeOfDay getTimeOfDay();
};
// Java
public interface ClockOperations {
TimeOfDay getTimeOfDay();
} // Este tipo lo utiliza el servidor para implementar
// el interfaz
public interface Clock extends ClockOperations,
org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity {
} // Este tipo lo utiliza el cliente
Interfaces (2)
n
También se generan las clases ClockPOA y
ClockPOATie
n
n
n
n
Object (IDL) se mapea a
org.omg.CORBA.Object (Java)
nil (IDL) se mapea a null
n
n
Las utiliza el servidor para implementar el interfaz mediante
herencia de implementación (ClockPOA) o delegación
(ClockPOATie)
Se estudian más adelante
null sólo se puede usar en valores de retorno y
parámetros para representar una referencia a objeto remoto
o “tipo valor” (value type) nulos
Cada atributo se mapea a dos operaciones con el
mismo nombre (una para leer y otra para modificar),
excepto si es de tipo readonly (sólo dispone de
operación para leer)
Interfaces (3)
n
Herencia
// IDL
interface Thermostat : Thermometer { ... };
// Java
public interface ThermometerOperations { ... }
public interface Thermometer
extends ThermometerOperations,
org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity {}
public interface ThermostatOperations
extends ThermometerOperations { ... }
public interface Thermostat
extends ThermostatOperations,
Thermometer,
org.omg.CORBA.portable.IDLEntity {}
Interfaces (y 4)
n
Tipos anidados dentro de interfaces
n
n
Java no permite anidar clases dentro de interfaces
Los tipos IDL (definidos dentro de una interfaz) que mapean
a clases se generan en un paquetes especial
// IDL
module Example {
interface Clock {
struct TimeOfDay { ... };
TimeOfDay getTimeOfDay();
};
};
// Java
package Example.ClockPackage;
final public class TimeOfDay
implements org.omg.CORBA.portable.IDLEntity { ... }
Constantes (1)
n
Constantes definidas dentro de un interfaz
// IDL
module Example {
interface MyInterface {
const float PI = 3.1415926;
};
};
// Java
package Example;
public MyInterfaceOperations {}
public interface MyInterface extends MyInterfaceOperations,
org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity {
float PI = 3.1415926;
}
Constantes (y 2)
n
Constantes definidas fuera de un interfaz
// IDL
module Example {
const float PI = 3.1415926;
};
// Java
package Example;
public interface PI {
float value = 3.1415926;
}
Excepciones (1)
Throwable
Error
Exception
RuntimeException
org.omg.CORBA
UserException
SystemException
Excepciones definidas
por el usuario en IDL
COMM_FAILURE, OBJ_ADAPTER,
etc.
Excepciones (y 2)
n
Mapping de excepciones definidas por el usuario
// IDL
typedef short Temperature;
exception InvalidTemperature {
Temperature selectedTemperature;
Temperature minimumPermitedTemperature;
Temperature maximumPermitedTemperature;
};
// Java
final public class InvalidTemperature
extends org.omg.CORBA.UserException {
// Mapping similar al de un “struct”.
};
Clases Holder (1)
n
Problema: mapear parámetros out e inout a Java
// IDL
interface Account {
void add(in float amount, out float newBalance);
// ...
};
n
Paso de parámetros en Java
n
n
n
n
Tipos básicos: por valor
Objetos: “por referencia”
Siendo más preciso: todos los parámetros se pasan
por valor (cuando se “pasan objetos”, se pasan
referencias por valor)
La semántica de paso de parámetros vía out e
inout se simula con las clases Holder
Clases Holder (2)
n
Mapping a Java
public interface AccountOperations {
void add(float amount,
org.omg.CORBA.FloatHolder newBalance);
// ...
}
n
El ORB proporciona clases Holder para los tipos
predefinidos
package org.omg.CORBA;
final public class FloatHolder
implements org.omg.CORBA.portable.Streamable {
public float value;
public FloatHolder() {}
public FloatHolder(float value) { ... }
// Otros métodos ...
}
Clases Holder (3)
n
Implementación de la operación
class AccountImpl extends AccountPOA {
private float balance;
public void add(float amount, FloatHolder newBalance) {
balance = balance + amount;
newBalance.value = balance;
}
// ...
}
n
Invocación de la operación
FloatHolder newBalance = new newBalance();
account.add(10, newBalance);
System.out.println(newBalance.value);
Clases Holder (4)
n
Para los tipos definidos por el usuario, el compilador
de IDL genera clases Holder
n
Mismo nombre que el tipo Java pero con sufijo Holder
// IDL
struct TimeOfDay {
short hour; // 0-23
short minute; // 0-59
short second; // 0-59
};
interface Clock {
void getTimeOfDay(out TimeOfDay time);
};
n
Para los tipos definidos con typedef, sólo se generan
clases Holder cuando se trata de vectores o secuencias
Clases Holder (5)
n
El compilador de IDL genera la clase
TimeOfDayHolder
final public class TimeOfDayHolder
implements org.omg.CORBA.portable.Streamable {
public TimeOfDay value;
public TimeOfDayHolder() {}
public TimeOfDayHolder(TimeOfDay value) { ... }
// Otros métodos ...
}
n
Implementación de la operación
class ClockImpl extends ClockPOA {
public void getTimeOfDay(TimeOfDayHolder time) {
<< Obtener “hour”, “minute” y “second” >>
TimeOfDay timeOfDay =
new TimeOfDay(hour, minute, second);
time.value = timeOfDay;
}
// ...
}
Clases Holder (y 6)
n
Invocación de la operación
TimeOfDayHolder timeOfDayHolder = new TimeOfDayHolder();
clock.getTimeOfDay(timeOfDayHolder);
TimeOfDay timeOfDay = timeOfDayHolder.value;
n
Parámetros inout
n
Idem parámetros out, excepto:
n
n
El llamador debe pasar un valor en el parámetro (excepto que
sirva el del constructor por defecto)
El llamado puede consultar el valor (value) del Holder,
cambiarlo o establecer uno nuevo (holder.value = new
... )
Clases Helper (1)
n
Concepto
n
n
n
n
Para cada tipo definido por el usuario (inclusive los definidos
con typedef) se genera una clase Helper (mismo nombre
que el tipo Java pero con sufijo Helper)
Permiten hacer downcasting de interfaces remotos
Permiten insertar y extraer valores en un Any
Ejemplo
abstract public class ClockHelper {
public static void insert(org.omg.CORBA.Any a,
Clock t) { ... }
public static Clock extract(org.omg.CORBA.Any) { ... }
public static org.omg.CORBA.TypeCode type() { ... }
// “narrow” sólo se genera para Helpers cuyo tipo es un
// interfaz remoto
public static Clock narrow(
org.omg.CORBA.Object obj) { ... }
}
Clases Helper (2)
n
El downcasting es un casting de un tipo base (no
necesariamente org.omg.CORBA.Object) a un
tipo derivado
// En el ejemplo “Clock” ...
org.omg.CORBA.Object clockObject =
orb.string_to_object(stringifiedReference);
if (clockObject == null) {
throw new Exception("stringified reference is nil");
}
Clock clock = ClockHelper.narrow(clockObject);
n
n
El objeto tiene que ser del tipo derivado (en otro caso se
produce una excepción del sistema CORBA)
En el ejemplo anterior no sería válido hacer ...
Clock clock = (Clock)clockObject;
n
... porque puede ser necesario contactar con el servidor (ej.:
servidor configurado con arranque automático)
Clases Helper (y 3)
n
Inserción y extracción de valores en un Any
n
Inserción
RouterEvent routerEvent = ...
org.omg.CORBA.Any event =
orb.create_any(); // método factoría
RouterEventHelper.insert(any, routerEvent);
manager.sendEvent(event);
n
Extracción
public void sendEvent(org.omg.CORBA.Any event) {
RouterEvent routerEvent =
RouterEventHelper.extract(event);
// ...
}
n
n
Si el receptor no sabe cuál es el tipo contenido en el Any, puede
utilizar org.omg.CORBA.Any.type()
Any proporciona operaciones de inserción y extracción para los
tipos predefinidos (insert_float, extract_float, etc.)
Paquete org.omg
n
Todos los pseudo-interfaces del ORB y los interfaces
de los servicios estándares CORBA pertenecen a
subpaquetes de org.omg (ej.: org.omg.CORBA,
org.omg.CosNaming, etc.)