Download Presentación Powerpoint Tema 3
Document related concepts
no text concepts found
Transcript
Programación Concurrente y Distribuida Prácticas Tema 3: Programación Básica CORBA sobre Java 1 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 2 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 Tema 3: Programación Básica CORBA sobre Java 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) 4 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 5 xxxxx.java especific.idl idlj xxxxx.java Terminología: … Tema 3: Programación Básica CORBA sobre Java 2. Uso del traductor idlj Sirviente (servant): Objeto que implementa una (o varias) xxxxx.java 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 6 Tema 3: Programación Básica CORBA sobre Java 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 7 Tema 3: Programación Básica CORBA sobre Java 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) 8 Tema 3: Programación Básica CORBA sobre Java 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 9 Tema 3: Programación Básica CORBA sobre Java 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() 10 Tema 3: Programación Básica CORBA sobre Java 2. Uso del traductor idlj 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 11 Tema 3: Programación Básica CORBA sobre Java 2. Uso del traductor idlj 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! 12 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 13 Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor 1. 2. 3. Pasos a seguir: Partimos de la(s) interfaz(ces) IDL Traducir dichas interfaces con idlj 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 14 Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor En detalle: “hola mundo” Paso 1: Interfaz IDL interface holaMundo { attribute string mensaje; void saluda(); }; Paso 2: traducción a IDL holaMundo.java idlj –fserver holaMundo.idl holaMundoOperations.java holaMundoPOA.java 15 Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor 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); } } 16 Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor 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); } } 17 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: delegación: holaMundoImpl sirviente= new holaMundoImpl(); org.omg.CORBA.Object obj= poa.servant_to_reference(sirviente); holaMundoPOATie pseudosirviente= new holaMundoPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); … Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor 18 Paso 4: Creación de un servidor (cont.) … Tema 3: Programación Básica CORBA sobre Java 3. Creación del lado servidor // 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(); 19 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 20 Tema 3: Programación Básica CORBA sobre Java 4. Creación del lado cliente Cliente no depende de cómo se han implementado los sirvientes (herencia o delegación) Cliente no tiene por qué ser objeto CORBA 1. 2. 3. Pasos a seguir: Partimos de la(s) interfaz(ces) IDL Traducir dichas interfaces con idlj Creación del cliente: 1. Crear e inicializar ORB 2. Obtener referencias a objetos 3. Interactuar con ellos como si fuesen locales 21 Tema 3: Programación Básica CORBA sobre Java 4. Creación del lado cliente En detalle: (cliente para “hola mundo”) Pasos 1 y 2: análogo a lado servidor interface holaMundo { attribute string mensaje; void saluda(); }; holaMundo.java idlj –fclient holaMundo.idl _holaMundoStub.java holaMundoHelper.java holaMundoOperations.java holaMundoHolder.java 22 Tema 3: Programación Básica CORBA sobre Java 4. Creación del lado cliente 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(); } 23 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 24 Tema 3: Programación Básica CORBA sobre Java 5. Implementando herencia A operacionA(); B operacionB(); COperations public interface COperations extends AOperations, BOperations { void operacionC (); } C operacionC(); C public interface C extends COperations, A, B { } CPOA public abstract class CPOA extends org.omg.PortableServer.Servant implements COperations, org.omg.CORBA.portable.InvokeHandler { … 25 Tema 3: Programación Básica CORBA sobre Java 5. Implementando herencia CPOATie 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(); }… 26 Tema 3: Programación Básica CORBA sobre Java 5. Implementando herencia Implementación por herencia: cada implementación debe heredar de su *POA: APOA BPOA CPOA AImpl BImpl CImpl 27 Tema 3: Programación Básica CORBA sobre Java 5. Implementando herencia 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(); }… 28 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 29 Tema 3: Programación Básica CORBA sobre Java 6. Uso de excepciones 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); … 30 Tema 3: Programación Básica CORBA sobre Java 6. Uso de excepciones 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 31 Tema 3: Programación Básica CORBA sobre Java 6. Uso de excepciones 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: 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; 32 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 33 Tema 3: Programación Básica CORBA sobre Java 7. Objetos fábrica 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 34 Tema 3: Programación Básica CORBA sobre Java 7. Objetos fábrica Ejemplo: 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); … }; 35 Tema 3: Programación Básica CORBA sobre Java 7. Objetos fábrica class gestorConexionImpl extends gestorConexionPOA { … conexion nuevaConexion (string nombre) { … // Si sirviente sirviente creado por delegación herencia conexionImpl sirviente= new conexionImpl(); org.omg.CORBA.Object conexionPOATie pseudosirviente= obj= poa.servant_to_reference(sirviente); new conexionPOATie(sirviente); conexion c= conexionHelper.narrow(obj); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); conexion c= conexionHelper.narrow(obj); … return c; } … 36 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 37 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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); ¿Con B o con V? // 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); 38 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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 39 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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! 40 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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); } 41 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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(); } … 42 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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(); } … 43 Tema 3: Programación Básica CORBA sobre Java 8. Metodología 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"); … 44 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 45 Tema 3: Programación Básica CORBA sobre Java 8. Detalles de implementación ¡Las referencias a objetos CORBA, apuntan a objetos que pueden estar en otra máquina! servidor cliente … conexion c= gestor.nuevaConexion (“C01”); c.inicio_transmision(0); … _conexionStub ORB conexion conexionImpl conexionPOATie ORB 46 Tema 3: Programación Básica CORBA sobre Java 8. Detalles de implementación 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 47 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 48 Tema 3: Programación Básica CORBA sobre Java 10. El servicio de nombres 1. Generalidades 2. Inicio y localización del servicio 3. Creando contextos y asociando nombres 4. Explorando la estructura de nombres 49 Tema 3: Programación Básica CORBA sobre Java 10. El servicio de nombres 1. Generalidades 2. Inicio y localización del servicio 3. Creando contextos y asociando nombres 4. Explorando la estructura de nombres 50 Tema 3: Programación Básica CORBA sobre Java 10.1 Generalidades 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 Objeto1 Desarrollo Objeto2 Gestión 51 Tema 3: Programación Básica CORBA sobre Java 10.1 Generalidades Terminología: Componente de nombre (NameComponent): asociado a cualquiera de los nodos. Nombre • 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 52 Tema 3: Programación Básica CORBA sobre Java 10. El servicio de nombres 1. Generalidades 2. Inicio y localización del servicio 3. Creando contextos y asociando nombres 4. Explorando la estructura de nombres 53 Tema 3: Programación Básica CORBA sobre Java 10.2 Inicio y localización del servicio 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); 54 Tema 3: Programación Básica CORBA sobre Java 10. El servicio de nombres 1. Generalidades 2. Inicio y localización del servicio 3. Creando contextos y asociando nombres 4. Explorando la estructura de nombres 55 Tema 3: Programación Básica CORBA sobre Java 10.3 Creando contextos y asociando nombres 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); … 56 Tema 3: Programación Básica CORBA sobre Java 10.3 Creando contextos y asociando nombres 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); … 57 Tema 3: Programación Básica CORBA sobre Java 10.3 Creando contextos y asociando nombres 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() … 58 Tema 3: Programación Básica CORBA sobre Java 10. El servicio de nombres 1. Generalidades 2. Inicio y localización del servicio 3. Creando contextos y asociando nombres 4. Explorando la estructura de nombres 59 Tema 3: Programación Básica CORBA sobre Java 10.4 Explorando la estructura de nombres 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); contexto: // Si sabemos que objeto es otro un objeto de usuario: NamingContext hijo= NamingContextHelper.narrow(obj); miClase miObjeto= miClaseHelper.narrow(obj); … 60 Tema 3: Programación Básica CORBA sobre Java 10.4 Explorando la estructura de nombres 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 61 Tema 3: Programación Básica CORBA sobre Java 10.4 Explorando la estructura de nombres Para extraer los Binding de la lista: atributo value de clase BindingListHolder … Binding Bindings[]= bl.value; … Para extraer los Binding del next_one() del atributo value iterador: método 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; … 62 Tema 3: Programación Básica CORBA sobre Java 10.4 Explorando la estructura de nombres 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 63 64