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