Manejo de Caracteres Especiales
Una convención de nombrado, como la del LDAP o la del sistema de ficheros,
normalmente tiene metacaracters. Por ejemplo, en LDAP, si uno de los siguientes
caracteres aparece en el nombre, debe estár precedido por el caracter de
escape, la barra invertida("\").
- Un espacio o un caracter "#" que ocurren al principio del string
- Un caracter espacio que ocurre al final del string
- Uo de los caracteres ",", "+", """,
"\", "<", ">" o ";"
Cuando estámos especificando un nombre a uno de los métodos de Context,
no sólo debemos prestar atención a los caracteres especiales y a las
convenciones de nombrado del sistema de nombres subyacente. Tambíen debemos
prestar atención a la síntaxis de nombres mixtos de JNDI, que también define
caracteres especuales. La cambinación de las dos síntaxis podría tratar con
muchos niveles de escape.
Por ejemplo, supongamos que tenemos un atributo "cn"
cuyo valor contiene un caracter de barra invertida.
backslash\a
El LDAP requiere que el caracter de barra invertida de un nombre sea escapado.
Por lo tanto cuando usemos este atributo como un nombre LDAP, deberemos preceder
el caracter de barra invertida en su valor con otro caracter de barra invertida,
de esta forma.
cn=backslash\\a
El caracter de barra invertida también es un caracter especial JNDI, por eso si
suministramos este nombre string como un nombre mixto, debemos escapar las
barras invertidas, de nuevo precediendo a cada caracter de barra invertida.
cn=backslash\\\\a
Si especificamos esto como un literal en el lenguaje de programación Java,
debemos seguir los requerimientos del lenguaje Java y escapar las barras
invertidas dentro de un string literal con otra barra invertida.
String cname = "cn=backslash\\\\\\\\a";
Nombres String y Nombres Mixtos
Necesitamos tener en cuenta que los nombres string que pasamos a los métodos de
Context son nombres mixtos. Para evitar cualquier sorpresa si un
nombre contiene caracteres especiales que podrían entrar en conflicto con la
síntaxis de nombres mixtos JNDI, deberíamos usar los métodos de Context
que aceptan un Name.
Hay dos formas disponibles para hacer esto. La primera forma es usar un CompositeName.
Creamos un objeto CompositeName y le añadimos el nombre
específico del sistema de nombres (como un nombre LDAP). Aquí hay un
ejemplo.
String dn = ...; // An LDAP distinguished name
Name composite = new CompositeName().add(dn);
Object obj = ctx.lookup(composite);
Aplicando esta técnica al anterior ejemplo de nombre LDAP, ya no
necesitaríamos añadir manualmente escapes para la síntaxis JNDI porque los
manejaría automáticamente la clase CompositeName:
Name composite = new CompositeName().add("cn=backslash\\\\a");
Object obj = ctx.lookup(composite);
La segunda forma es usar un nombre compuesto. Creamos un nombre compuesto
convirtiendo el nombre especifico del sistema de nombres (como un nombre LDAP).
Aquí tenemos un ejemplo.
String dn = ...; // An LDAP distinguished name
NameParser ldapParser = ctx.getNameParser("");
Name compound = ldapParser.parse(dn);
Object obj = ctx.lookup(compound);
Aplicando esta técnica al nombre LDAP del ejemplo anterior, no necesitariamos
añadir escapes para la síntaxis JNDI porque no estamos usando nombres mixtos
JNDI.
Name compound = ldapParser.parse("cn=backslash\\\\a");
Object obj = ctx.lookup(compound);