Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porMaría Josefa Martín de la Fuente Modificado hace 9 años
1
1 Tema 3: Programación Básica CORBA sobre Java Programación Concurrente y Distribuida Prácticas
2
22 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
3
33 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
4
4 1. CORBA frente a RMI 1997: Se introduce RMI en JDK 1.1 1998: Se introduce Java IDL en JDK 1.2 (Compatible con CORBA) JDK 1.2 incluye su propio ORB Posibilidad de RMI sobre IIOP (Interoperabilidad CORBA/RMI) RMI: No diferencia interfaz de implementación Permite el paso de objetos por valor Permite elegir entre usar… IIOP JRMP (Java Remote Method Protocol) Tema 3: Programación Básica CORBA sobre Java
5
55 Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
6
6 2. Uso del traductor idlj Terminología: Sirviente (servant): Objeto que implementa una (o varias) interfaces IDL. Servidor (server): Programa que crea sirvientes y los hace accesible a los clientes. Cliente (client): Programa que hace uso de algún sirviente Sirviente de puede crear de dos formas: Herencia Delegación Tema 3: Programación Básica CORBA sobre Java especific.idl xxxxx.java … idlj
7
7 2. Uso del traductor idlj Línea de comandos de idlj (versión 3.2 o posterior): idlj [opciones] archivos.idl Opciones más habituales: -fclient : genera sólo infraestructura para lado cliente. -fserver : genera sólo infraestructura para construir lado servidor mediante herencia. -fserverTIE : genera sólo infraestructura para construir lado servidor mediante delegación. -fall : genera infraestructura para lados cliente y servidor (lado servidor mediante herencia) -fallTIE : genera infraestructura para lados cliente y servidor (lado servidor mediante delegación) -oldImplBase : genera infraestructura para lado servidor basado en BOA en lugar de POA Tema 3: Programación Básica CORBA sobre Java
8
8 2. Uso del traductor idlj Si se trabaja con eclipse: posibilidad de usar plugins ORBStudio: plugin gratuito para eclipse (www.orbzone.org) idlj *.idl Archivos generados tanto para lado cliente como servidor: *Operations.java : Intefaz Java resultante de aplicar las reglas de mapping IDL a Java a la interfaz traducida. *.java : Interfaz CORBA que verán los clientes Hereda de *Operations (tiene todas las operaciones de Interfaz) Hereda de org.omg.CORBA.Object (superclase común a todos los objetos CORBA) Tema 3: Programación Básica CORBA sobre Java
9
9 2. Uso del traductor idlj Archivos generados para lado cliente: _*Stub.java : Se usa de forma transparente (actúa como representante local en el cliente del objeto CORBA remoto). Sólo necesaria para compilar. Obsérvese que implementa las operaciones de la interfaz. *Holder.java : Clase que actúa como clase corbertura Se genera una clase Holder para cada… Tipo definido por usuario en IDL Tipo predefinido, si es necesario (por ejemplo, por usarse como argumento out/inout) Contiene: atributo “value” Constructores Tema 3: Programación Básica CORBA sobre Java
10
10 2. Uso del traductor idlj Archivos generados para lado cliente (cont.): *Helper.java : Clase abstracta que se genera en mismas circunstancias que clase Holder. Proporciona algunos métodos útiles para la manipulación del tipo. Ejemplo: método narrow() Tema 3: Programación Básica CORBA sobre Java
11
11 2. Uso del traductor idlj Tema 3: Programación Básica CORBA sobre Java Archivos generados para construcción lado servidor por herencia (idl -fserver) *POA.java Clase abstracta que… Afirma implementar Interfaz ¡pero no define sus operaciones! Hereda de org.omg.CORBA.portable.InvokeHandler Hereda de org.omg.portableServer.Servant Para construir sirviente: Debe heredar de esta clase Debe implementar las operaciones pendientes Es por tanto la clase base de todos los sirvientes
12
12 2. Uso del traductor idlj Tema 3: Programación Básica CORBA sobre Java Archivos generados para construcción lado servidor por delegación (idl -fserverTIE) *POATie.java Clase delegadora Hereda de _*POA: Implementa interfaz (¡y es verdad!) Tiene un constructor que acepta un objeto *Operations ¡Nótese cómo delega la implementación de las operaciones!
13
13 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
14
14 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java Pasos a seguir: 1.Partimos de la(s) interfaz(ces) IDL 2.Traducir dichas interfaces con idlj 3.Para cada interfaz, escribir una clase sirviente… Por herencia Por delegación 4.Creación de un servidor: 1.Crear e inicializar ORB 2.Crear e inicializar al menos un POA 3.Crear objetos sirvientes 4.Activar sirvientes 5.Hacer accesible a los clientes referencias a los sirvientes
15
15 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java En detalle: “hola mundo” Paso 1: Interfaz IDL interface holaMundo { attribute string mensaje; void saluda(); }; Paso 2: traducción a IDL holaMundo.java holaMundoOperations.javaholaMundoPOA.java idlj –fserver holaMundo.idl
16
16 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java Paso 3: Implementar clase sirviente (por herencia) public class holaMundoImpl extends holaMundoPOA { private String mensaje= "Mensaje por Defecto"; public holaMundoImpl() { super(); } public String mensaje() // Acessor { return mensaje; } public void mensaje(String mensaje) // Mutator { this.mensaje= mensaje; } public void saluda() { System.out.println(mensaje); }
17
17 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java Paso 3: Implementar clase sirviente (por delegación) public class holaMundoImpl implements holaMundoOperations { private String mensaje= "Mensaje por Defecto"; public holaMundoImpl() { … } public String mensaje() // Acessor { return mensaje; } public void mensaje(String mensaje) // Mutator { this.mensaje= mensaje; } public void saluda() { System.out.println(mensaje); }
18
18 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java Paso 4: Creación de un servidor import org.omg.CORBA.*; import org.omg.PortableServer.*; public static void main(String[] args) { // Inicialización del ORB ORB orb= ORB.init(args, null); // Creación del POA raíz: POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // Crear y activar sirvientes: // Si se usó herencia: holaMundoImpl sirviente= new holaMundoImpl(); org.omg.CORBA.Object obj= poa.servant_to_reference(sirviente); … // Si se usó delegación: holaMundoImpl sirviente= new holaMundoImpl(); holaMundoPOATie pseudosirviente= new holaMundoPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente);
19
19 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java Paso 4: Creación de un servidor (cont.) // Poner una referencia al objeto a disposición de los clientes, bien sea… // - Publicándola en servicio de nombres, de trading, etc. // - Devolviendo la referencia como valor de retorno o parámetro de salida, // - Convirtiéndola a una IOR y publicándola de alguna manera, por ejemplo… String ior= orb.object_to_string(obj); PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior"))); ps.println(orb.object_to_string(ior)); ps.close(); // Evitar terminación: orb.run(); …
20
20 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
21
21 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java Cliente no depende de cómo se han implementado los sirvientes (herencia o delegación) Cliente no tiene por qué ser objeto CORBA Pasos a seguir: 1.Partimos de la(s) interfaz(ces) IDL 2.Traducir dichas interfaces con idlj 3.Creación del cliente: 1.Crear e inicializar ORB 2.Obtener referencias a objetos 3.Interactuar con ellos como si fuesen locales
22
22 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java En detalle: (cliente para “hola mundo”) Pasos 1 y 2: análogo a lado servidor interface holaMundo { attribute string mensaje; void saluda(); }; holaMundo.java holaMundoOperations.java _holaMundoStub.java holaMundoHolder.java holaMundoHelper.java idlj –fclient holaMundo.idl
23
23 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java Paso 3: Creación de un cliente import org.omg.CORBA.*; public static void main(String[] args) { // Inicialización del ORB ORB orb= ORB.init(args, null); // Obtener referencia a objetos. Si se usó una “strinfied IOR”, se lee la cadena // del archivo… LineNumberReader input = new LineNumberReader(new FileReader("server.ior")); String ior = input.readLine(); org.omg.CORBA.Object obj = orb.string_to_object(ior); // Y se convierte al tipo correcto usando el método narrow de la clase helper: holaMundo hola = holaMundoHelper.narrow(obj); // Ya se puede usar el objeto: hola.mensaje(“Hola a todo el mundo”); hola.saluda(); }
24
24 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
25
25 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java A operacionA(); B operacionB(); C operacionC(); public interface COperations extends AOperations, BOperations { void operacionC (); } COperations public interface C extends COperations, A, B { } C public abstract class CPOA extends org.omg.PortableServer.Servant implements COperations, org.omg.CORBA.portable.InvokeHandler { … CPOA
26
26 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java public class CPOATie extends CPOA { private COperations _impl; public CPOATie ( COperations delegate ) { this._impl = delegate; } public void operacionC () { _impl.operacionC(); } public void operacionA () { _impl.operacionA(); } public void operacionB () { _impl.operacionB(); } … CPOATie
27
27 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java APOABPOACPOA Implementación por herencia: cada implementación debe heredar de su *POA: AImplBImplCImpl
28
28 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java Solución: implementar herencia mediante delegación class CImpl implements COperations { private AImpl deleg_A; private BImpl deleg_B; public CImpl (AImpl A, BImpl B) { this.deleg_A= A; this.deleg_B= B; … } public void operacionC() {…} public void operacionA() { deleg_A.operacionA(); } public void operacionB() { deleg_B.operacionB(); } …
29
29 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
30
30 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java Excepciones son remotas: Se producen en objeto sirviente Se capturan en cliente Pasos a seguir para usar excepciones: 1.En IDL, hay que 1.Definir la excepción 2.Indicar qué operación(es) puede(n) lanzarlas: interface conexion { exception error_tx { short codigo; string descripcion; }; void inicio_trasmision (in short modo) raises (error_tx); …
31
31 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java 2.Al implementar el sirviente: 1.Declarar que los métodos que implementan las operaciones que lanzan excepciones, pueden lanzar dichas excepciones 2.Lanzar las excepciones cuando sea oportuno: public class conexionImpl implements conexionOperations { … void inicio_trasmision (short modo) throws error_tx { … if (fallo_imprevisto()) throw new error_tx(codigo_error(), texto_error()); … 3.En el lado cliente, excepciones se tratan como locales 1.O se capturan mediante try … catch 2.O se declara mediante trhows que se propaga la excepción
32
32 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java public class conexionImpl implements conexionOperations { … void inicio_trasmision (short modo) throws error_tx { … if (fallo_imprevisto()) throw new error_tx(codigo_error(), texto_error()); … int tabla[]= new int[MAX]; … tabla[MAX]= 0; UNKNOWN_EXCEPTION: Excepción que le llega a cliente cuando sirviente eleva una excepción que no está declarada en la definición IDL de la operación Ejemplo: ArrayIndexOutOfBoundsException ¿?
33
33 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
34
34 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java Son objetos CORBA con operaciones que proporcionan referencias a otros objetos CORBA Frecuentemente, crean otros objetos CORBA Para crear un objeto CORBA y devolverlo como resultado de una operación: 1.En IDL, la operación debe declarar el tipo interfaz correspondiente como tipo de retorno. 2.Sirviente debe tener ORB y POA previamente inicializado 3.Método de sirviente: 1.Crea nuevo sirviente (clase *Impl correspondiente) 2.Registra dicho sirviente en POA (método servant_to_reference) 3.Usa método narrow de clase *Helper para convertir referencia obtenida al tipo adecuado 4.Devuelve la referencia resultante de conversión
35
35 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java interface conexion { exception error_tx { short codigo; string descripcion; }; void inicio_trasmision (in short modo) raises (error_tx); … }; interface gestorConexiones { conexion nuevaConexion(in string nombre); … }; Ejemplo:
36
36 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java class gestorConexionImpl extends gestorConexionPOA { … conexion nuevaConexion (string nombre) { … … return c; } … // Si sirviente sirviente creado por herencia conexionImpl sirviente= new conexionImpl(); org.omg.CORBA.Object obj= poa.servant_to_reference(sirviente); conexion c= conexionHelper.narrow(obj); // Si sirviente sirviente creado por delegación conexionImpl sirviente= new conexionImpl(); conexionPOATie pseudosirviente= new conexionPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); conexion c= conexionHelper.narrow(obj);
37
37 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
38
38 8. Metodología Tema 3: Programación Básica CORBA sobre Java CORBA no es más que un middleware que permite el acceso a objetos remotos Inconvenientes: programas contienen mucho código… … muy dependiente de dicho middleware … difícil de mantener … críptico // Inicialización del ORB ORB orb= ORB.init(args, null); // Creación del POA raíz: POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // Crear y activar sirvientes: holaMundoImpl sirviente= new holaMundoImpl(); holaMundoPOATie pseudosirviente= new holaMundoPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); ¿Con B o con V?
39
39 8. Metodología Tema 3: Programación Básica CORBA sobre Java Sería deseable que nuestras aplicaciones sean lo más independientes de middleware posible. Ventajas: Facilidad de desarrollo Facilidad de mantenimiento Portabilidad … IDEA: Encapsular todos los detalles dependientes del middleware en una capa de abstracción de middleware Para portar la aplicación a otro middleware, sólo habría que modificar dicha capa Inconveniente: Puede obligar a renunciar a determinadas particularidades del middleware… … o esta capa puede resultar muy compleja
40
40 8. Metodología Tema 3: Programación Básica CORBA sobre Java Abstrayendo: normalmente, todo middleware… … puede necesitar ser inicializado … puede necesitar ser terminado … puede registrar (publicar) un objeto … puede desconectar un objeto … puede localizar un objeto a través de su nombre … ¡Implementemos un middleware virtual que soporte estas operaciones, y las mapee sobre un middleware real!
41
41 8. Metodología Tema 3: Programación Básica CORBA sobre Java Propuesta: patrón de diseño basado en… 1.Interfaz IMiddleware: public interface IMiddleware { public void inicializar(); public void detener(); public void esperar(); public Object registrar(Object sirviente,String nombre_interfaz); public void desregistrar(Object objeto); public void nombrar (Object objeto, String nombre); public Object localizar(String nombre_objeto, String nombre_clase); }
42
42 8. Metodología Tema 3: Programación Básica CORBA sobre Java 2.Clase Middleware: public abstract class Middleware { private static IMiddleware middleware; private static void inicializar(IMiddleware middleware) { this.middleware= middleware; middleware.inicializar(); } public static void detener() { middleware.detener(); } public static void esperar() { middleware.esperar(); } …
43
43 8. Metodología Tema 3: Programación Básica CORBA sobre Java 3.Clases de abstracción de middleware: public class JavaORB implements IMiddleware { // Argumentos de inicialización: public String opcionesLC[]; // Opciones para ORB por la línea de comandos public Properties opcionesProp; // Opciones para ORB como lista de propiedades public String nombreSN=""; // Nombre de raíz en Servicio de Nombres public String kindSN=""; // Tipo (extensión) de dicho nombre … public void inicializar() { // Inicializar ORB usando las opciones. orb= org.omg.CORBA.ORB.init(opcionesLC, opcionesProp); _nombreSN= nombreSN; _kindSN= kindSN; // Inicializar POA try { poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); } catch (AdapterInactive e) { e.printStackTrace(); } …
44
44 8. Metodología Tema 3: Programación Básica CORBA sobre Java Para construir una aplicación basada en el Middleware abstracto: class holaMundoServer { public static void main(String args[]) { // Inicializar middleware: Properties props= new Properties(); JavaORB mdlw= new JavaORB(); mdlw.opcionesLC=args; mdlw.opcionesProp= props; mdlw.nombreSN="ejemplo"; // A partir de aquí, código es independiente de middleware! Middleware.inicializar(mdlw); holaMundoImpl sirviente= new holaMundoImpl(); holaMundo obj= (holaMundo)Middleware.registrar(sirviente,"holaMundo"); Middleware.nombrar(obj,"holamundo"); …
45
45 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
46
46 8. Detalles de implementación Tema 3: Programación Básica CORBA sobre Java ¡Las referencias a objetos CORBA, apuntan a objetos que pueden estar en otra máquina! … conexion c= gestor.nuevaConexion (“C01”); c.inicio_transmision(0); … cliente servidor conexionImpl conexion _conexionStub ORB conexionPOATie
47
47 8. Detalles de implementación Tema 3: Programación Básica CORBA sobre Java Consecuencias: ¡Dos referencias al mismo objeto pueden ser distintas! Basta que se hayan obtenido por procedimientos distintos Para saber si dos referencias apuntan a mismo objeto: método is_equivalent(Object other) heredado de la clase org.omg.CORBA.Object El true es seguro, el false no: ¡mejor implementar nuestro propia lógica de identificación! El ORB intenta que las referencias a objetos locales sean referencias directas al propio sirviente Para determinar si una referencia apunta a un objeto local: método _is_local() heredado de org.omg.CORBA.Object
48
48 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres
49
49 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres
50
50 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres
51
51 10.1 Generalidades Tema 3: Programación Básica CORBA sobre Java Servicio estandarizado por OMG Su interfaz IDL está definida en estándar CORBA Paquete org.omg.CosNaming: implementación de dicha interfaz Permite crear una jerarquía de nombres similar a un árbol de directorios Cada nombre puede tener asociada una referencia a un objeto Initial Naming Context Investigación Desarrollo Gestión Objeto1 Objeto2
52
52 10.1 Generalidades Tema 3: Programación Básica CORBA sobre Java Terminología: Componente de nombre (NameComponent): Nombre asociado a cualquiera de los nodos. Un nombre consta de un nombre y un tipo (ambos son cadenas) Contexto de nombre (NamingContext): Nodo del árbol. Puede tener asociado una referencia o ser un nodo intermedio Es un objeto CORBA Nombre: Se suele llamar así a los contextos de nombre que tienen asociada una referencia Contexto: Se suele llamar así a los contextos de nombre intermedios Sólo la raíz de la estructura (contexto de nombre inicial) es persistente
53
53 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres
54
54 10.2 Inicio y localización del servicio Tema 3: Programación Básica CORBA sobre Java Servicio debe arrancarse para poderlo usar: UNIX: tnameserv Windows: start tnameserv (en una ventana de comandos) Por defecto, servicio usa puerto 900 Para cambiar puerto: parámetro –ORBInitialPort n Para usar servicio, basta obtener referencia a contexto de nombre inicial: // Localización y puerto de servicios: en inicialización de ORB Properties conf= new Properties(); conf.Put(“org.omg.CORBA.ORBInitialPort”, “1024”); conf.Put(“org.omg.CORBA.ORBInitialHost”, “servidor.eii.us.es”); ORB orb= ORB.init(args, conf); // Se obtiene referencia a contexto inicial: org.omg.CORBA.Object obj= orb.resolve_initial_references(“NameService”); NamingContext root= NamingContextHelper.narrow(obj);
55
55 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres
56
56 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java 1.Para crear un nombre: clase NameComponent : Tiene sólo dos atributos de tipo string, id y kind : Los nombres se manejan como arrays de nombres simples … NameComponent nc= new NameComponent (“plans”, “text”); NameComponent[] nombre= {nc}; … 2.Asociar el nombre a un referencia obj, bajo un contexto cuya referencia es ctx: método rebind() de clase NamingContext También se puede usar método bind(), pero genera excepción si nombre ya está en uso en ese contexto … ctx.rebind(nombre, obj); …
57
57 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java 3.Para deshacer anterior operación (borrar un nombre): método unbind() : … ctx.unbind(nombre); … 4.Para asociar el nombre a un nuevo contexto creado como hijo de un contexto ctx ya existente: métodos new_context() y rebind_context() de clase NamingContext : … // Se pide a contexto padre que fabrique un nombre contexto: NamingContext nuevo= ctx.new_context(); // Se convierte este contexto en su hijo, asociándole un nombre: ctx.rebind_context(nombre, nuevo); …
58
58 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java Alternativa: pedir a un contexto que cree un nuevo contexto hijo con un nombre (método bind_new_context() de clase NamingContext ) Eleva excepción si nombre ya está en uso en dicho contexto … NamingContext nuevo= ctx.bind_new_context(nombre); … 5.Para deshacer anterior operación (destruir un contexto): método destroy() de clase NamingContext : … nuevo.destroy() …
59
59 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres
60
60 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java Dado un contexto de nombre ctx, para obtener lo que haya asociado en él a un nombre dado: método resolve() de clase NamingContext … NameComponent nc= new NameComponent(“nombre”, “tipo”); NameComponent[] nombre= {nc}; org.omg.CORBA.Object obj= ctx.resolve(nombre); … // Si sabemos que objeto es otro contexto: NamingContext hijo= NamingContextHelper.narrow(obj); // Si sabemos que objeto es un objeto de usuario: miClase miObjeto= miClaseHelper.narrow(obj);
61
61 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java Para explorar todo el contenido de un NamingContext : método de list() de dicha clase: … BindingListHolder bl= new BindingListHolder(); BindingIteratorHolder bit= new BindingIteratorHolder(); ctx.list(max, bl, bit); … Los parámetros bl y bit son “Holder” porque en la interfaz IDL del servicio están definidos como parámetros OUT Los max primeros elementos: van a bl Los restantes (si los hay): van a bit En ambos casos, el contenido son objetos de una clase llamada Binding
62
62 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java Para extraer los Binding de la lista: atributo value de clase BindingListHolder … Binding Bindings[]= bl.value; … Para extraer los Binding del iterador: método next_one() del atributo value Tipo boolean: devuelve true si queda alguno más Parámetro bh : parámetro de salida de tipo BindingHolder, que tiene un atributo value de tipo Binding … BindingHolder bh; bit.value.next_one(bh); Binding b= bh.value; …
63
63 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java Clase Binding: Atributo binding_name (de tipo NameComponent[] ): se trata del nombre, que puede ser resuelto mediante el método resolve() del contexto del que se obtuvo Atributo binding_type : de tipo BindingType, que puede valer: BindingType.ncontext, en cuyo caso representa a un contexto, o BindingType.nobject, en cuyo caso representa a un objeto de usuario
64
64
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.