Un Entorno de Contexto
Podemos usar ficheros de recursos de aplicación, parámetros de entorno,
propiedades de sistema, y parámetros de applets para especificar propiedades de
entorno pero, ¿qué pasa si usamos más de uno de estos mecanismos a la vez?
Inicialización
Cuando usamos cualquiera de los constructores de las siguientes clases, podemos
suministrar un parámetro Hashtable que contenga propiedades de
entorno: InitialContext,
InitialDirContext,
y InitialLdapContext.
El entorno del contexto inicial es inicializado desde las dos siguientes
fuentes, en el orden especificado.
- Parámetro de entorno del constructor. Si la propiedad es una de.
java.naming.factory.initial
java.naming.factory.object
java.naming.factory.state
java.naming.factory.control
java.naming.factory.url.pkgs
java.naming.provider.url
java.naming.dns.url
y no ocurre en el parámetro entorno, se obtiene desde los parámetros
del applet, y si no está presente allí, desde las propiedades del sistema.
- Todos los ficheros de recursos de aplicación (jndi.properties).
Por eso el entorno, efectivamente, es la unión de los parámetros de entorno y
los ficheros de recursos de aplicación, con la regla adicional de que algunas
propiedades estándars se podrían obtener desde parámetros de un applet o
desee propiedades del sistema.
Si una de las siguientes propiedades se encuentra en alguno de estos dos
recursos o en más de un fichero de recursos de aplicación, todos los valores
de las propieades se concatenan en una sóla lista separada por dos puntos. Para
otras propiedades, se usa el primer valor encontrado.
java.naming.factory.object
java.naming.factory.state
java.naming.factory.control
java.naming.factory.url.pkgs
Cuando se llama al constructor, el JNDI construye un entorno de acuerdo a
esas reglas y pasa el resultado al proveedor de servicios subyancente. Cuando se
llama a los métosos que obtienen objetos del contexto inicial derivados de
dicho contexto, como Context.lookup(),
se hereda el entorno del contexto padre.
Observa que posiblemente no todas las propiedades de entorno se apliquen a un
contexto. Sin embargo, el contexto siempre está obligado a grabarlas y pasarlas
a cualquier contexto derivado.
Obtener un Entorno de Contexto
Para obtener un entorno de contexto, usamos getEnvironment().
Aquí tenemos un ejemplo.
// Initial environment with various properties
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.FSContextFactory");
env.put(Context.PROVIDER_URL, "file:/");
env.put(Context.OBJECT_FACTORIES, "foo.bar.ObjFactory");
env.put("foo", "bar");
// Call the constructor
Context ctx = new InitialContext(env);
// See what environment properties you have
System.out.println(ctx.getEnvironment());
Cuando ejecutamos este fichero con el siguiente fichero
de recursos de aplicación de nuestro classpath.
java.naming.factory.object=com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person
java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.provider.url=ldap://localhost:389/o=jnditutorial
com.sun.jndi.ldap.netscape.schemaBugs=true
obtenemos los siguientes resultados.
com.sun.jndi.ldap.netscape.schemaBugs=true
java.naming.factory.object=foo.bar.ObjFactory:com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person
java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory
foo=bar
java.naming.provider.url=file:/
java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
De esta salida podemos observar lo siguiente.
- Las propiedades que sólo se encuentran en una fuente --"foo"
desde el parámetro de entorno, y "com.sun.jndi.ldap.netscape.schemaBugs"
desde el fichero de recursos de aplicación-- están en el entorno resultante.
- Las propiedades listas-de-factorías (es decir, "java.naming.factory.object")
que ocurren en ambas fuentes se mezclan, con las de los parámetros de entorno
en primera posición de las listas.
- Todas las demás propiedades (es decir, "java.naming.factory.initial")
que ocurren en ámbas fuentes toman sus valores del parámetro de entorno.
Los usuarios muchas veces actualizan erróneamente el resultado de getEnvironment()
y luego esperan que el entorno del contexto se actualice adecuadamente.
Dependiendo de la implementación del proveedor, actualizar los resultados de getEnvironment()
podría no tener efecto. De echo, deberíamos pensar que el resultado de getEnvironment()
es un objeto de sólo lectura inmutable, y no intentar actualizarlo. Pueder ir a
la próxima sección para ver más instrucciones sobre
como actualizar un entorno de contexto.