Personalizar un Proveedor de Servicios
Las propiedades de entorno permiten a una aplicación y a un usuario
personalizar el uso del JNDI. Podemos personalizar un proveedor de servicio
particular usando un fichero
de recursos de proveedor. Al igual que un fichero de recursos de
aplicación, un fichero de recursos de proveedor contiene parejas de clave/valor
presentadas en el formato de propiedades de fichero (ver java.util.Properties).
Un fichero de recursos de proveedor tiene el nombre.
prefijo/]jndiprovider.properties
donde prefijo es el nombre de la implementación del contexto
del proveedor, con cada punto convertido en una barra inclinidad. Por ejemplo,
supongamos que el nombre de la clase de la implementación del contexto es com.sun.jndi.ldap.LdapCtx;
su nombre de fichero de recursos de proveedor sería "com/sun/jndi/ldap/jndiprovider.properties".
Mientras que una simple aplicación puede usar varios ficheros de recursos de
aplicación, sólo puede haber un fichero de recursos de proveedor por cada
provedor. De echo, el fichero de recursos de proveedor normalmente viene
empaquetado con el proveedor de servicios y se carga usando el mismo cargador de
clases que carga el proveedor de servicios.
Utilización
El fichero de recursos del proveedor tiene dos propósitos. Primero, permitir al
proveedor de servicios construirse sin componentes cableados, como un objeto o
factorias de estado, y a la vez permite especificar algunos valores por defecto.
Segundo, puede usarse como un mecanismo de despliegue. Por ejemplo,
supongamos que obtenemos un proveedor de servicio LDAP de un vendedor. Podemos
personalizar ese proveedor añadiendo, por ejemplo, algunos objetos y factorías
de estado disponibles para nuestro enterprise, como factorías para contabilidad
y objetos de empleados. Cuando nuestras aplicaciones con enterprise usen este
proveedor, aquellas factorías de estado se utilizarán atomáticamente sin que
la aplicación o el usuario hayan especificado las propiedades relevantes
mediante ficheros de recursos de aplicación, propiedades de sistema,
parámetros de applets o parámetros del entorno del contexto inicial.
El grado en que podemos manipular el fichero de recursos de un proveedor de
servicios depende de cómo esté empaquetado el propio proveedor. Por ejemplo si
el proveedor está empaquetado en un fichero JAR, podemos suministar un fichero
de recursos de proveedor actualizado extrayendo primero los contenidos del
fichero JAR y reempaquetándolos con el nuevo fichero de recursos actualizado.
Observa que este procedimiento no está recomendado para los proveedores de
servicios que están enpaquetados en la Java
2 SDK/JRE, Standard Edition, v1.3. Para estos proveedores de servicios no
deberíamos intentar actualizar los ficheros de recursos de proveedor. En su
lugar, deberíamos usar ficheros de recursos de aplicación como se describio en
una lección anterior.
Propiedades Afectadas
Aunque un fichero de recursos de proveedor puede contener cualquier propiedad,
el JNDI busca sólo las siguientes propiedades en un fichero de recursos de
proveedor.
java.naming.factory.object
java.naming.factory.state
java.naming.factory.control
java.naming.factory.url.pkgs
Al contrario que los contenidos de un fichero de recursos de aplicación, los
contenidos de un fichero de recursos de proveedor no se añaden al entorno. En
su lugar, estos contenidos aumentan el valor del entorno suministrado a los
siguientes métodos.
- NamingManager.getObjectInstance(Object,
Name, Context, Hashtable)
- DirectoryManager.getObjectInstance(Object,
Name, Context, Hashtable, Attributes)
- NamingManager.getStateToBind(Object,
Name, Context, Hashtable)
- DirectoryManager.getStateToBind(Object,
Name, Context, Hashtable, Attributes)
- ControlFactory.getControlInstance(Control,
Context, Hashtable)
Cuando un proveedor de servicio llama a uno de estos métodos, le suministra un
ejemplar del Context desde el que se llama al método y el
entorno del contexto. El JNDI usa el cargador de clases del contexto para
encontrar el fichero de recursos del proveedor y añadir los valores de la
propiedad (importantes para el método) a la misma propiedad encontrada en el
entorno. Luego usa la propiedad resultante como una lista ordenada de factorías
donde buscar.
Por ejemplo, supongamos que el proveedor de servicios LDAP, está
implementado usando la clase com.sun.jndi.ldap.LdapCtx,
llama a DirectoryManager.getObjectInstance(). El JNDI
encontrará el valor de la propiedad "java.naming.factory.object"
desde el fichero com/sun/jndi/ldap/jndiprovider.properties y lo
añade al valor de la propiedad "java.naming.factory.object"
encontrada en el parámetro de entorno (Hashtable). El
JNDI usa esta lista de factorías para encontrar una factoría de objetos que
devuelva una respuesta no-null.
Un proveedor de servicios es libre para acceder a otras propiedades del
fichero de recursos de proveedor pero el comportamiento es específico del
proveedor.