JNDI
La Interfaz de Nombrado y Directorio Java (Java Naming and Directory Interface) es una Interfaz de Programación de Aplicaciones (API) de Java para servicios de directorio. Permite a los clientes descubrir y buscar objetos y datos a través de un nombre. Como todas las APIs de Java que hacen de interfaz con sistemas host, es independiente de la implementación subyacente. Adicionalmente, especifica una interfaz de proveedor de servicio (SPI) que permite que las implementaciones del servicio de directorio sean integradas en el framework. Las implementaciones pueden hacer uso de un servidor, un fichero, o una base de datos; la elección depende del desarrollador.
Introducción
editarLa API JNDI es usada por Java RMI y las APIs de Java EE para buscar objetos en una red. Jini tiene su propio servicio de búsqueda y no usa la API JNDI.
La API suministra:
- un mecanismo para asociar(bind) un objeto a un nombre;
- una interfaz de búsqueda de directorio que permite consultas generales;
- una interfaz de eventos que permite a los clientes determinar cuándo las entradas de directorio han sido modificadas;
- extensiones LDAP para soportar las capacidades adicionales de un servicio LDAP.
La porción SPI permite el soporte de prácticamente cualquier tipo de servicio de directorio o nombrado incluyendo:
- LDAP
- DNS
- Network Information Service
- RMI
- servicio de nombres CORBA
- Sistema de ficheros
La especificación JNDI fue primero liberada por Sun Microsystems el 10 de marzo de 1997.[1]. En 2006, la versión vigente es JNDI 1.2.
Búsqueda básica
editarJNDI organiza sus nombres en una jerarquía. Un nombre puede ser cualquier string tal como "com.mydomain.ejb.MyBean". Un nombre también puede ser un objeto que soporte la interfaz Name, sin embargo la forma más común de nombrar a un objeto es un string. Un nombre se asocia a un objeto en el directorio almacenando el objeto o una referencia JNDI al objeto en el servicio de directorio identificado por el nombre.
La API JNDI define un contexto que especifica donde buscar un objeto. El contexto inicial se usa normalmente como punto de partida.
En el caso más simple, un contexto inicial debe crearse usando la implementación específica y los parámetros extra requeridos por la implementación. El contexto inicial será usado para buscar un nombre. El contexto inicial es análogo a la raíz de un árbol de directorios para un sistema de ficheros. Debajo hay un ejemplo de cómo crear un contexto inicial:
Hashtable args = new Hashtable();
//primero debes especificar la factory.
//Así es como eliges entre la implementación jboss o una de Sun
args.put( Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory");
//El siguiente argumento es la URL que especifica dónde está el almacén de datos:
args.put( Context.PROVIDER_URL, "http://jndiprovider-database" );
//Puedes tener que suministrar credenciales de seguridad
//lo siguiente es crear el contexto inicial
Context myCurrentContext = new InitialContext( args );
Un contexto se usa entonces para buscar previamente los nombres asociados en ese contexto. Por ejemplo:
Object reference = myCurrentContext.lookup( "com.mydomain.MyBean" );
//este paso es obligatorio con EJB.
MyBean myBean = (MyBean) PortableRemoteObject.narrow( reference, MyBean.class );
Búsquedas
editarLos atributos pueden ser adjuntados a entradas especiales llamadas directorios. Los Directorios se necesitan para permitir la búsqueda de objetos por sus atributos asociados. Los Directorios son un tipo de contexto, ellos restringen el espacio del nombres más como lo hace una estructura de directorios en un sistema de ficheros.