MMT MCE Martín Alfaro Arenas
CORBA: Common Object Request Broker Architecture. Tecnología para el manejo de objetos distribuidos Independiente del sistema operativo, de la plataforma hardware y del lenguaje de programación Los clientes y servidores pueden residir en la misma computadora o estar distribuidos “Middleware” orientado a objetos distribuidos
Componentes
Clientes: Ente que hace una solicitud a un objeto CORBA
Objetos CORBA: Ente capaz de recibir una solicitud de un cliente, realizar una acción (o múltiples acciones) en respuesta a dicha solicitud y devolver un resultado /* Servidor */
ORB (Administrador de solicitudes a objetos)
Cliente
ORB
Stubs IDL
Dynamic Invocation Interface
Objeto
Interfaz ORB
Dynamic skeleton interface
Núcleo del ORB
Skeleton IDL
Object Adapter
El ORB es el mediador entre el cliente y el servidor Referencia de objeto
Conexión lógica
Objeto CORBA
Flujo real
ORB servidor
Solicitud
ORB cliente
de la solicitud
Aplicación cliente
Aplicación servidora
Mecanismo evolucionado de RPC Función: Enviar solicitudes a objetos y devolver las respuestas a los clientes ORBs: Java ORB, JACORB, Orbix, Orbacus, Etc.
Ubicación de los objetos.
Implementación de objetos.
Estado del servidor.
Mecanismo de comunicación.
El cliente no sabe donde reside el servidor: en el mismo proceso, en la misma computadora o en diferentes computadoras conectadas en red El cliente no sabe cómo se ha implementado el servidor, que lenguaje fue usado, en que sistema operativo o en que plataforma de hardware está implementado El cliente no sabe si el servidor está activo o no El cliente no sabe que mecanismo de comunicación se está
El IDL es independiente del lenguaje de
programación
Existen compiladores IDL para diversos
lenguajes de programación: idltojava
Soporta
diferentes tipos de datos, incluyendo tipos básicos (enteros, floats, etc.), estructuras, objetos, arreglos dinámicos, strings, entre otros.
IDL. Lenguaje de definición de interfaces Un lenguaje que permite definir las interfaces
CORBA
Interfaz CORBA: Un
conjunto de operaciones y sus parámetros
Compilador
IDL: toma como entrada un archivo fuente IDL y produce como salida: 1.IDL Stubs 2.IDL skeletons
Tipos definidos por el usuario ½
Similar al typedef de C++ typedef short Identificador;
Secuencias ½ Son arreglos unidimensionales con un tamaño máximo fijo y una longitud que puede variar en tiempo de ejecución typedef sequence s; // delimitada
typedef sequence s;
// sin limite
Estructuras 1.
Similares a las estructuras en lenguaje C struct ubicacion { long latitud; long longitud; };
interface Customer { int getInfo(); int End(); }
Archivo fuente en lenguaje IDL
Compilador IDL
… class Customer { int getInfo(); int End(); } …. Stub IDL (archivo fuente en lenguaje X) … class Customer { int getInfo(); int End(); } …. Esqueleto IDL (archivo fuente en lenguaje X)
Stubs IDL Son archivos fuente, en un lenguaje dado, que
permiten que un cliente haga solicitudes a objetos CORBA que implementan las interfaces definidas
Son generados automáticamente por el compilador
IDL a partir de interfaces CORBA
Los stubs deben ser incorporados en los programas
cliente
Contienen el código necesario para canalizar la
solicitud al ORB
Stub: “Proxy”- objeto del lado del cliente que actúa
como si fuera el verdadero objeto servidor
Para hacer una solicitud el cliente utiliza una referencia a un objeto Cuando un nuevo objeto es creado se crea una nueva referencia Los objetos son creados en la aplicación servidora Para poder hacer una solicitud el cliente debe obtener, de alguna manera, la referencia al objeto
Inicialmente el cliente no tiene acceso a la referencia de un nuevo objeto creado en la aplicación servidora
Getinfo
?
Aplicación cliente
Referencia
Customer
ORB
ORB
Referencia al Customer
Aplicación servidora
// Obtener refencia CORBA org.omg.CORBA.Object obj = orb.obtiene_referencia(ref);
// hacer el narrow a Customer Customer v_customer = CustomerHelper.narrow(obj);
// verificar si la operación fue correcta if( v_customer == null ) { System.out.println("Error referencia"); System.exit( 1 ); }
// invocar operaciones int saldo = v_customer.GetInfo();
al
obtener
la
v
Obtener una referencia mediante un servicio de nombres
ORB
Referencia al Name service
Aplicación cliente
Solicitudes
Name Service Registrarse
Customer
ORB
Referencia al Customer
”) ustomer C “ ( r e lv o Res mer o t s u al C a i nc ere f e R
Aplicación servidora
• Interoperable Object Reference “Detalles de contacto” que una aplicación cliente usa para comunicarse con un objeto CORBA. Ejemplo: IOR:00a000000000001e49444c3a636f6e76657267696e2f6f74612f4d61 6e616765723a312e300000000000000100008200000000410001000000 00000c31302e392e32392e3137370051ef00000000002514010f004e555 00000000f0000000000000001006f746130360099000000000000016f746
Obtener una referencia desde un IOR
Aplicación cliente Solicitudes
Customer Escribir referencia
Leer referencia
IOR
ORB
ORB
Referencia al Customer
Aplicación servidora
1. Seleccionar el lenguaje de programación deseado. 2. Usar el compilador de IDL apropiado para generar código en el lenguaje seleccionado (el stub que servirá de proxy para el cliente). 3. El programa cliente tiene que: a. Incluir/importar el código generado b. Inicializar su ORB c. Usar el IOR del objeto que se quiera usar en la API y obtener su referencia. d. Invocar los métodos deseados de la API e. Cerrar la conexión
Aplicación cliente public class Cliente { public static void main(String args[]) { try { // inicializar el orb ORB orb = ORB.init( args, null ); String ref = new BufferedReader( new FileReader(“IOR-subscriber.ref")).readLine(); org.omg.CORBA.Object obj = orb.string_to_object( ref ); // Obtener la referencia oSubscriberAPI = converginProvisioningSubscriber.narrow(obj); // verificar si se obtuvo la referencia if (converginProvisioningSubscriber == null) { System.out.println("La referencia no es válida"); System.exit( 1 ); } // Usar un método int res = oSubscriberAPI.modifyState(“Usr”, “UsrPss”, subid, Suspend) } ...
Customer -Customer#
Subscriber -DN / MIN
Account -Account#
Subscriber: Entidad básica con información demográfica y elementos de red (HLR, ciudad..) Account: Información y actividad monetaria Wallets: Tipo, Balance, Límite, Fecha de Expiración Sobre ésta entidad se aplican: pagos, ajustes, cambios de rate plan, etc. Customer: agrupación de subscribers Customer -#
Subscriber -DN / MIN
Account -#
Un CUG (Closed User Group) habilita en servicio de VPN (Virtual Private Network) DN: 5585825000 CUG: Nombre: LaAcademia Prioridad: 30 Fecha de Inicio: 1/1/2007 Fecha de Fin: 1/1/2008
NT: Number Translation NT: #5000
Formato convergin::GenericOutput api_method_name (INPUT_ARGS ,OUTPUT_ARGS)
‘in’ y ’out’ indican si el argumento es de entrada o salida GenericOutput modifyPersonalInfo ( in convergin::LoginName i_user, in convergin::LoginPass i_pass, in convergin::provisioning::Subscriber::ID i_subid, in string i_first, in string i_middle, in string i_last, in string i_language, out double o_balance, out converging::Subscriber::State o_state);
Parámetro
Tipo
Descripción
Disponibilidad
Result Error_Code Error_Message Transaction_ID
int int char(100) int
Tue / False Identificador de eror Error descriptivo Identificador de transacción
Siempre Cuando Result_code=False Cuando Result_code=False Siempre
Arreglo de estructuras de datos de tipo “Item” v_generic n
V_item(0) Code = 1 Value = “Valor del código 1”
n
V_item(1) Code = 2 Value = “Valor del código 2”
n
…
Ejemplo: c_converginOptionalString n n
Exists { True, False } Value
Ejemplo 2: i_cuenta n n n
DN : OptionalString MIN: OptionalString Numero de Cuenta: OptionalExternalNo
(Cualquiera de los 3 puede ser la llave para la transacción, todos son opcionales, pero uno de ellos es requerido)
login name (convergin::LoginPass) password (convergin::LoginPass) 2 servidores API: opción de fail over Encolamiento a cargo del cliente
Add GetInfo End ModifyInfo
GetInfo
Add Subscriber ModifyInfo GetInfo ModifyState End AddAccount AddRestriction EndRestriction ListAllRestriction AddFriendsAndFamily
ListFriendsAndFamily RemoveF&F RemoveAllF&F AddCUGMembership EndCUGMembership ListCUGMembership AddComment ListComment
struct ID { convergin::OptionalString m_dn; convergin::OptionalString m_min; convergin::OptionalString m_cc; };
struct Membership { string m_cug; long m_priority; convergin::Time m_start; convergin::Time m_end; };
typedef string LoginPass;
struct Time { long m_year; long m_month; long m_day; long m_hour; long m_minute; long m_second; };
ModifyInfo GetInfo ModifyState End ModifyWalletExpiry Payment Adjustment AddRecurrentCharge EndRecurrentCharge
AddWallet GetLlastRecharge
Extra parameter: 1, Número único de operación
typedef sequence<Wallet> WalletList; Struct Wallet { convergin::provisioning::Account::WalletType m_type; convergin::provisioning::Account::WalletBalance m_balance; convergin::Time m_expiry; }; Type
Balance
Expiry
Default
100.0
11/01/2008
Minutos
5
31/12/2099
LD
0
11/11/1977
QueryTimeforCall CallCharge QueryChargeForSMS ChargeSMS QueryChargeforDataSession ChargeDataSession
struct PreCallDetails { Direction m_direction; MediaType m_mediaType; convergin::OptionalBillingAccount m_originator; convergin::OptionalBillingAccount m_terminator; string m_calledDigits; convergin::OptionalLocation m_originatorLocation; convergin::OptionalLocation m_terminatorLocation; convergin::Time m_startTime; }; struct PostCallDetails { convergin::Time m_answerTime; convergin::Time m_disconnectTime; };