27
Invocación Dinámica en CORBA

Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Embed Size (px)

Citation preview

Page 1: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica en CORBA

Page 2: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer uso del stub correspondiente.

● Para hacer invocaciones dinámicas se usa un objeto “request”

● Un request consiste de una referencia, una operación y una lista de parámetros

● Un cliente que usa un request obtiene el mismo resultado que un cliente que use los stubs

● En el DII un parámetro de una solicitud es un elemento de una lista (NVList) denominado NamedValue

Page 3: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● Para ejecutar una solicitud se usa el método invoke en el objeto request.

● Invoke es bloqueante. La operación send_deffered envia una solicitud y regresa de inmediato (no bloqueante o asíncrona).

● Para obtener los resultados se usa la operación get_response. Si la solicitud no ha finalizado esta llamada se bloquea hasta que la solicitud termine

● La operación poll_response permite determinar si la llamada ha finalizado

Page 4: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● Ejemplo. Dada la siguiente interfaz IDL:

interface MessagePrinter

{

void printHello();

};

● Se puede invocar el método printHello dinámicamente como sigue:

org.omg.CORBA.Object obj=orb.string_to_object(ior);

Request request = obj._request("printHello");

request.invoke();

● Observe que si no se tiene el stub no se puede hacer el narrow porque la clase MessagePrinterHelper está en dicho stub.

Page 5: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● Los parámetros y valores devueltos (return value) en invocaciones dinámicas se manejan como variables de tipo “any”.

● El tipo any en CORBA puede almacenar valores de cualquier tipo.

● Ejemplo de uso de any:

Any a = org.omg.CORBA.ORB.init().create_any();

// char

a.insert_string("Hola");

// long

int l = 4711;

a.insert_long(l);

Page 6: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● Ejemplo de uso de any:

Any a = org.omg.CORBA.ORB.init().create_any();

// referencia sin tipo

org.omg.CORBA.Object obj;

a.insert_Object(obj);

// referencia con tipo

Cuenta c;

CuentaHelper.insert(a, c);

// estructuras

Person p = new Person(1, "Pedro Pérez");

PersonHelper.insert(a, p);

Page 7: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

● Ejemplo de uso de any. Extraer valores

Any a;

double d = a.extract_double();

String s = a.extract_string();

Cuenta c = CuentaHelper.extract(a);

org.omg.CORBA.Object obj = a.extract_Object();

Page 8: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Solicitudes dinámicas con parámetros.

● Los parámetros se manejan como valores any

● Ejemplo:

interface Funcion

{

double evaluar(in double x1, in double x2);

};

Page 9: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Solicitudes dinámicas con parámetros.

● Ejemplo:

org.omg.CORBA.Request r = obj._request("evaluar");

r.add_in_arg().insert_double( x1 );

r.add_in_arg().insert_double( x2 );

r.set_return_type(orb.get_primitive_tc(

org.omg.CORBA.TCKind.tk_double));

r.invoke();

Any any = r.return_value();

double v = any.extract_double();

System.out.println(v);

Page 10: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Invocación asíncrona

● Ejemplo:

org.omg.CORBA.Request r = obj._request("evaluar");

r.add_in_arg().insert_double( x1 );

r.add_in_arg().insert_double( x2 );

r.set_return_type(orb.get_primitive_tc(

org.omg.CORBA.TCKind.tk_double));

Page 11: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Invocación asíncrona

● El DII permite invocación asíncrona mediante la operación send_deferred()

● Ejemplo:

r.send_deferred();

while (!r.poll_response()) {

Thread.sleep(1000);

}

Any any = r.return_value();

double v = any.extract_double();

System.out.println(v);

Page 12: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Invocación asíncrona con objetos callback

● En lugar de usar poll_response(), se puede pasar un objeto como parámetro el cual será invocado para enviar la respuesta

● Ejemplo:

interface Response {

void setResult(in double value);

};

interface Funcion {

void evaluar(in double x1, in double x2, in

Response response);

};

Page 13: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Invocación asíncrona con objetos callback

● Ejemplo:

org.omg.CORBA.Request r = obj._request("evaluar");

r.add_in_arg().insert_double( x1 );

r.add_in_arg().insert_double( x2 );

ResponseImpl respImpl = new ResponseImpl();

org.omg.CORBA.Object obj2=poa.servant_to_reference(

respImpl);

Response response = ResponseHelper.narrow(obj2);

ResponseHelper.insert(r.add_in_arg(), response);

r.send_deferred();

Page 14: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Invocación Dinámica

Invocación asíncrona con objetos callback

● Ejemplo:

public class FuncionImpl extends FuncionPOA

{

public void evaluar(double x1, double x2,

Response response)

{

double result = x1*x2;

response.setResult(result);

}

}

Page 15: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Corba permite la herencia de interfaces

● Una interfaz puede heredar de otra, en cuyo caso hereda las operaciones definidas en la super interfaz

● No hay herencia de implementaciones. Cada implementación debe implementar todos los métodos

● Se puede usar composición para lograr reutilización de código

● Un parámetro o variable de un tipo puede recibir un valor de cualquier subtipo

Page 16: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Ejemplo:

interface Pozo {

string devolverId();

Ubicacion devolverUbicacion();

long devolverProduccionCrudo();

long devolverProduccionGas();

void actualizarProduccionCrudo(

in long produccion);

void actualizarProduccionGas(in long produccion);

};

Page 17: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Ejemplo:

interface PozoGasLift : Pozo {

void actualizarPresion(in long presion);

long devolverPresion();

};

interface PozoBES : Pozo {

void actualizarCorriente(in double c);

double devolverCorriente();

};

Page 18: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Un parámetro o variable de un tipo puede recibir un valor de cualquier subtipo:

void procesar(Pozo p) {

...

}

PozoGasLift pg;

procesar(pg);

Page 19: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Ejemplo de uso de composición para reutilizar código:

public class Pozo {

int id;

int prodCrudo;

...

public Pozo(int id) {

...

}

int devolverProduccionCrudo() {

...

}

...

}

Page 20: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Ejemplo de uso de composición para reutilizar código:

public class PozoImpl extends PozoPOA

{

Pozo p;

public PozoImpl(int id) {

p = new Pozo();

}

int devolverProduccionCrudo() {

return p.devolverProduccionCrudo();

}

...

}

Page 21: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Herencia en CORBA

● Ejemplo de uso de composición para reutilizar código:

public class PozoGasListImpl extends PozoGasLiftPOA

{

Pozo p;

int presion;

public PozoGasListImpl(int id) {

p = new Pozo();

}

int devolverProduccionCrudo() {

return p.devolverProduccionCrudo();

}

int devolverPresion() {

return presion;

}

}

Page 22: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Corba ofrece un mecanismo de implementación por delegación mediante las clases TIE.

● Por cada interfaz definida el compilador IDL genera una clase TIE automáticamente.

● Una clase TIE es una implementación completa y funcional de un objeto Corba

● La clase TIE usa un delegado para ejecutar las operaciones.

● El delegado es una clase que implementa la interfaz Operations generada por el compilador IDL

Page 23: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Ejemplo:

module tie {

enum TipoCuenta { corriente, ahorros };

interface Cuenta {

void depositar(in long monto);

void retirar(in long monto);

long getSaldo();

};

interface CuentaAhorros : Cuenta {

void getInteresMes();

};

interface FabricaCuentas {

Cuenta crearCuenta(in TipoCuenta tipo,

in long saldoIni);

};

};

Page 24: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Ejemplo:

class CuentaImpl implements CuentaOperations {

private int saldo;

CuentaImpl(int saldoIni) {

this.saldo = saldoIni;

}

public void depositar(int monto) {

saldo = saldo + monto;

}

public void retirar(int monto) {

saldo = saldo - monto;

}

public int getSaldo() {

return saldo;

}

}

Page 25: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Ejemplo:

class FabricaCuentasImpl extends FabricaCuentasPOA {

public Cuenta crearCuenta(int saldoIni) {

CuentaImpl ctaImpl = new CuentaImpl(saldoIni);

CuentaPOATie ctaTie = new CuentaPOATie(ctaImpl);

try {

org.omg.CORBA.Object obj = _poa().

servant_to_reference(ctaTie);

Cuenta cuenta = CuentaHelper.narrow(obj);

return cuenta;

}

catch( Exception e ) {

}

return null;

}

...

Page 26: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Ejemplo:

public class CuentaAhorrosImpl extends CuentaImpl

implements CuentaAhorrosOperations {

public CuentaAhorrosImpl(int saldoIni) {

super(saldoIni);

}

public int getInteresMes() {

return (int)(getSaldo() * 0.02);

}

}

Page 27: Invocación Dinámica en CORBA. Invocación Dinámica ● La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer

Mecanismo de Implementación por Delegación

● Ejemplo:

public CuentaAhorros crearCuentaAhorros(int saldoIni)

{

CuentaAhorrosImpl ctaImpl = new CuentaAhorrosImpl(saldoIni);

CuentaAhorrosPOATie ctaTie = new CuentaAhorrosPOATie(ctaImpl);

try {

org.omg.CORBA.Object obj=_poa().servant_to_reference(ctaTie);

CuentaAhorros cuenta = CuentaAhorrosHelper.narrow(obj);

return cuenta;

}

catch( Exception e ) {

}

return null;

}