Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) [Parte I]
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Nombres Compuestos

Un nombre compuesto es un nombre de un sólo sistema de nombres. Aquí tenemos un ejemplo de un nombre compuesto.

cn=homedir,cn=Jon Ruiz,ou=People

Esta es la representación string del nombre LDAP que contiene tres componentes.

ou=People
cn=Jon Ruiz
cn=homedir

Relación entre Nombre Compuesto y Nombre Mixto

Cuando pasamos un nombre string a un método de Context, como lookup(), el método espera un nombre mixto. El nombre mixto podría tener sólo un componente. Podríamos pasarle un nombre string LDAP, por ejemplo a lookup().

La única restricción es tener en cuenta si el nombre string contiene caracteres que tienen conflictos con la síntaxis de nombre mixto. En ese caso, esos caracteres necesitan ser escapados o entrecomillados. Por ejemplo, el nombre compuesto cn=a/b necesita especificarse como cn=a\/b para evitar que sea interpretado como un nombre mixto que tiene dos componentes.

Cuando pasamos un argumento Name a un método de Context, como lookup(), el método puede aceptar un nombre mixto o un nombre compuesto, como se explicó en la página anterior. Para hacer que el argumento sea interpretado como un nombre mixto, debemos usar un ejemplar de CompositeName.

Representaciones String

Como se vió en el ejemplo anterior, un nombre compuesto consiste en componentes.

Los componentes están separados de acuerdo a la síntaxis del sistema de nombres. Por ejemplo, en LDAP, los componentes están ordenados de derecha a izquierda y separados por una coma (","). Así, la representación string de los siguientes componentes.

ou=People
cn=Jon Ruiz
cn=homedir

es:

cn=homedir,cn=Jon Ruiz,ou=People

La Clase CompoundName

La clase CompoundName es una clase de conveniencia para representar la forma estuctural de un nombre compuesto. Su constructor acepta una representación string del nombre compuesto y un conjunto de propiedades que describen la síntaxis de nombrado del nombre. El conjunto de propiedades y la clase CompoundName se han creado lo suficientemente flexibles para casi todos los sistemas de nombres. Sin embargo, los implementadores podrían elegir su propias implementaciones de nombres compuestos que sean subclases de CompoundName o cualquier otra clase que implemente el interface Name.

Normalmente, usaremos el constructor de CompoundName sólo si estámos escribiendo un proveedor de servicios. Como desarrollador de aplicaciones, normalmente encontraremos nombres compuestos (CompoundName o implementaciones directas de Name) cuando queramos analizar un nombre de un sistema de nombres particular.

Aquí tenemos un ejemplo que obtiene el analizador de nombres para un contexto en el sistema de nombres y usa el analizador para descomponer un nombre de ese sistema de nombres.

NameParser parser = ctx.getNameParser("");
Name compoundName = parser.parse(compoundStringName);

Manipular un Nombre Compuesto

Observa que NameParser.parse() devuelve un objeto que implementa el interface Name. Este interface también está implementado por las clases CompositeName y CompoundName.

Esto significa que podemos acceder y actualizar los componentes de un nombre compuesto de la misma forma en que lo hacíamos con los nombres mixtos.

El siguiente ejemplo reemplaza el segundo componente de un nombre compuesto y añade componentes al principio y al final del nombre.

// Get the parser for this namespace
NameParser parser = ctx.getNameParser("");

// Parse the name
Name cn = parser.parse("cn=John,ou=People,ou=Marketing");

// Remove the second component from the head
System.out.println(cn.remove(1));          // ou=People

// Add to the head (first)
System.out.println(cn.add(0, "ou=East"));  // cn=John,ou=Marketing,ou=East

// Add to the tail (last)
System.out.println(cn.add("cn=HomeDir"));  // cn=HomeDir,cn=John,ou=Marketing,ou=East

Al ejecutar este programa se produce la siguiente salida.

ou=People
cn=John,ou=Marketing,ou=East
cn=HomeDir,cn=John,ou=Marketing,ou=East

Observa que las nociones de principio y final son independientes de la síntaxis de nombres. Por ejemplo, la síntaxis LDAP especifica que los componentes se ordenan de derecha a izquierda. Esto significa que el componente más a la derecha es el principio y el componente más a la izquierda el final del nombre.

Para dicho nombre, un componente añdido al principio ("cn=East") se añade a la derecha y un componente añadido al final ("cn=HomeDir") se añade a la izquierda.

Abajo tenemos la salida producida por una versión modificada del ejemplo anterior. Este ejemplo usa la síntaxis de nombres de ficheros UNIX en vez de la síntaxis LDAP.

People
East/Marketing/John
East/Marketing/John/HomeDir

Nombres Compuestos como Argumentos a los Métodos de Context

Un ejemplar de Name no es un CompositeName pasado a los métodos de los interfaces Context y DirContext es tratado como un nombre compuesto. Abajo tenemos un ejemplo que localiza una entrada LDAP usando un nombre compuesto. Primero obtiene un contexto dentro del espacio de nombres LDAP. Luego obtiene un analizador para ese espacio de nombres llamando a Context.getNameParser(), que luego es usado para descomponer el nombre string LDAP en un nombre compuesto. Ese nombre compuesto se usa en la llamada a lookup()

// Create the initial context
Context ctx = new InitialContext(env);

// Get the parser for the namespace
NameParser parser = ctx.getNameParser("");

// Parse the string name into a compound name
Name compound = parser.parse("cn=Jon Ruiz,ou=people");

// Perform the lookup using the compound name
Object obj = ctx.lookup(compound);

Nombres Compuestos Totalmente Cualificados

Algunas veces queremos obtener un nombre totalmente cualificado de un objeto.

Por ejemplo, en el DNS, podríamos querer conocer el nombre totalmente cualificado de una máquina en Internet para que pueda ser usado en autentificación o como una dirección para un servicio de entrega de correo. En el LDAP, un nombre distinguido totalmente cualificado podría insertarse dentro de un certificado X.509 o darse como una dirección e-mail o como parte de una URL.

El uso de este nombre totalmente cualificado normalmetne está fuera del ámbito de JNDI. Es decir, una vez que se obtiene el nombre, es pasado y utilizado en otros subsistemas en vez de volver a entrar en los APIs de JNDI.

Además, la definición de totalmente cualificado está determinada por el proveedor de servicios y/o por el sistema de nombres/directorio subyancente.

El JNDI proporciona Context.getNameInNamespace() para obtener un nombre totalmente cualificado de un objeto, en relación a su propio espacio de nombres. Es decir, el resultado es un nombre en el espacio de nombres servido por el sistema de nombres subyacente.

Aquí tenemos un ejemplo que localiza una entrada ("cn=Jon Ruiz, ou=people") y que invoca a getNameInNamespace() para obtener un nombre LDAP totalmente cualificado.

// Create the initial context
Context ctx = new InitialContext(env);

// Perform the lookup 
Context jon = (Context)ctx.lookup("cn=Jon Ruiz,ou=people");

String fullname = jon.getNameInNamespace();

Cuando se ejecuta este programa, se obtiene la siguiente salida.

cn=Jon Ruiz,ou=people,o=JNDItutorial

Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis