Composición Dinámica de Nombres
Para componer nombres, normalmente usamos métodos del interface Name.
La sección Nombres Mixtos explicó cómo
añadir componentes a un nombre mixto y la sección Nombres
Compuestos explicó cómo añadir componentes a un nombre compuesto.
Estos métodos son útiles cuando conocemos que estamos tratando con nombres
mixtos o nombres compuestos. Pero ¿qué pasa si tenermos un nombre mixto y
necesitamos añadir un componente? ¿Usaríamos la síntaxis de nombres mixtos o
la nombres compuestos? Y si es compuesto, ¿qué síntaxis de nombre compuesto?
Los desarrolladores que escriben aplicaciones como navegadores de espacios de
nombres afrontan frecuentemente esta cuestión. Puede ser díficil responder sin
mucho conocimiento sobre el contexto al que se unió el nombre y como fue
resuelto.
Por ejemplo, supongamos que el nombe "cn=homedir,cn=Jon
Ruiz,ou=People" está unido a un objeto en un sistema de nombres
diferentes -- especificamente, un contexto de sistema de ficheros. Para añadir
un componente de nombre de fichero, usamos la síntaxis de nombres mixtos. Esto
es porque estámos atravesando desde un espacio de nombres LDAP a un espacio de
nombres de fichero.
cn=homedir,cn=Jon Ruiz,ou=People/tutorial
Cuando ya hemos añadido otro componente de nombre de fichero al resultado,
deberíamos usar la síntaxis de nombre de fichero. Por ejemplo, en Windows,
añadir el componente "report.txt" resulta en el
nombre.
cn=homedir,cn=Jon Ruiz,ou=People/tutorial\report.txt
Para añadir un componente LDAP al nombre "cn=Jon Ruiz,
ou=People" usaríamos la síntaxis de nombre LDAP.
cn=homedir,cn=Jon Ruiz,ou=People
El los tres ejemplos, hemos usado una sintaxis de nombre diferente. Las reglas
de cúando usar cada una de ellas se hacen dificiles de imaginar, así como de
programar.
Para ayudar en esta tarea, el JNDI proporciona Context.composeName()
para componer nombres dinámicamente dependiendo de los límites del espacio de
nombres federado. Le damos a este método dos argumentos: el nombre que queremos
añadir y el nombre de su contexto (en relación a uno de sus contextos
ancestros). Se necesita suministrar este último porque, en general, un contexto
no conoce su nombre, especialmente su nombre en relación a otro contexto a
través del que podríamos haber resuelto para obtenerlo.
La implementación de este método está suministrada por el proveedor de
servicios. Esto pone la pelota de imaginarse los límites del espacio de nombres
y de que síntaxis usar en el tejado del proveedor de servicios y no en el del
desarrollador de la aplicación.
Aquí tenemos un ejemplo que realiza las
composiciones descritas aquí.
// Create the initial context
Context ctx = new InitialContext(env);
// Compose a name within the LDAP namespace
Context ldapCtx = (Context)ctx.lookup("cn=Jon Ruiz,ou=people");
String ldapName = ldapCtx.composeName("cn=homedir", "cn=Jon Ruiz,ou=people");
System.out.println(ldapName);
// Compose a name when it crosses into the next naming system
Context homedirCtx = (Context)ctx.lookup(ldapName);
String compositeName = homedirCtx.composeName("tutorial", ldapName);
System.out.println(compositeName);
// Compose a name within the File namespace
Context fileCtx = (Context)ctx.lookup(compositeName);
String fileName = fileCtx.composeName("report.txt", compositeName);
System.out.println(fileName);
Los nombres de las variable usadas aquí son sólo para propósitos
ilustrativos. La aplicación no necesita conocer si está interactuando con un
contexto LDAP, un contexto del sistema de ficheros, o con un contexto que
conecta los dos.
|
Nota:
La versión Beta v1.2 del proveedor de servicios del sistema de ficheros no
implementa apropiadamente composeName(). Si ejecutamos este
ejemplo en la plataforma Windows, la última composición usa un caracter de
barra inclinada ("/") en lugar de la barra inclinada invertida.
|
Este método también tiene una forma sobrecargada que acepta argumentos Name
en lugar de java.lang.String. Si estamos usando la forma Name,
debemos asegurarnos de que los dos argumentos son del mismo tipo. Por ejemplo,
no mezclar un CompositeName con un CompoundName.