En esta página: Añadir Soporte de Enlaces a Referencias
Normalmente un proveedor de servicio soporta enlaces de referencia si soporta búsquedas que pueden devolver enlaces de referencia. Sin embargo, como la mayoría de los servicios de nombres/directorio tienen sus propias nociones de (nativos) enlaces simbólicos (como los alias o las remisiones), los enlaces de referencia podrían estar soportados sólo por proveedores de servicio que también soporten federación. Al igual que el soporte de remisiones, el soporte de enlaces de referencia es una parte integral de la implementación del proveedor de servicio. Afecta a todas las operaciones que implican resolución de nombres. Además, los enlaces de referencia se pueden implementar de formas diferentes. Abajo hay algunos trucos que podemos seguir, pero la implementación que funciona para nuestro proveedor de servicio depende de las características del servicio de nombes/directorio subyacente. En este respecto es especialmente importante cómo hayamos implementado nuestro código para manejar federaciones. Desreferenciar un Enlace Un enlace de referencia está representado por la clase LinkRef. Aquí tenemos un ejemplo de un método para desreferenciar un LinkRef: public static Object derefLink(LinkRef ref, Context currCtx, Hashtable env) throws NamingException { String link = ref.getLinkName(); if (link.startsWith("./")) { // A relative link; assume that currCtx is the // immediate context in which the link is bound return currCtx.lookup(link.substring(2)); } else { // An absolute link; resolve it to the initial context Context ctx = new InitialContext(env); try { return ctx.lookup(link); } finally { ctx.close(); // Close when you're done } } } Cuándo Desreferenciar lookupLink() no debería desreferenciar enlaces. Todas las otras resoluciones de nombres normales de todos los métodos del interface Context y sus subinterfaces siempre siguen los enlaces. Detectar Ciclos La resolución del propio nombre de enlace podría hacer que la resolución pasara a través de otros enlaces. El resultado podría ser un ciclo de enlaces cuya resolución no puede terminar normalmente. Son posibles varias aproximaciones para detectar y evitar los ciclos. Una es mantener un tamaño de pila fijo. En este caso, cada enlace seguido se pone en la pila con el correspondiente nombre restante. Cuando la pila esté llena, nuestro proveedor debería lanzar una LinkLoopException. La resolución de un enlace procede resolviendo cada enlace de la pila. Cuando se completa la resolución del enlace superior de la pila, es sacado de ésta y empieza la resolución del siguiente enlace de la pila. Cuando la pila está vacía, se ha completado la resolución del enlace original.
|