Actualizar un Entorno de Contexto
Podemos cambiar el entorno de un contexto usando addToEnvironment()
y removeFromEnvironment().
Aquí tenemos un ejemplo que crea un
contexto inicial y obtiene un contexto derivado desde el contexto inicial
(mediante lookup()).
Luego actualiza los entornos del contexto inicial y del contexto derivado.
// 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);
// Get the child context
Context child = (Context)ctx.lookup("tmp");
// See what properties the initial context has
System.out.println(ctx.getEnvironment());
// Replace foo in the parent
ctx.addToEnvironment("foo", "baz");
// Add a new property to the parent
ctx.addToEnvironment("com.wiz.jndi.wizProp", "wizards");
// Remove an attribute from the parent
ctx.removeFromEnvironment(Context.OBJECT_FACTORIES);
// Remote property from the child
child.removeFromEnvironment(Context.PROVIDER_URL);
// See what environment properties you have after updates
System.out.println(">>>>> Parent context: ");
System.out.println(ctx.getEnvironment());
// See what environment properties the child has after updates
System.out.println(">>>>> Child context: ");
System.out.println(child.getEnvironment());
Aquí tenemos la salida al ejecutar el ejemplo, observa que estas
actualizaciones sólo afectan al ejemplar de Context en el que
se realizan.
{
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
}
>>>>> Parent context.
{
com.sun.jndi.ldap.netscape.schemaBugs=true,
com.wiz.jndi.wizProp=wizards,
java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory,
foo=baz,
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
}
>>>>> Child context.
{
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.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person,
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
}
Ámbito de Cambios
Como se ha visto en el ejemplo anterior, cambiar la propieades de entorno de un
contexto no afecta a ninguno de sus contexto derivados. Sin embargo, los
contextos que se deriven en el futuro desde este contexto heredarán el entorno
actualizado.
Valores por Defecto
Algunas propiedades de entorno tienen valores por defecto. Por ejemplo, una
implementación podría ignorar las referencias por defecto a menos que la
propiedad de entorno "java.naming.referral" se haya
configurado a "throw" o "follow".
Cuando dicha propiedad es eliminada usando removeFromEnvironment(),
el valor por defecto se convierte en el valor efectivo de la propiedad, aunque
el valor real podría no mostrarse necesariamente cuando examinamos las
propiedades de contexto usando getEnvironment().
Verificar la Actualización
Después de actualizar un entorno de contexto, podemos verificarlo
inmediatamente usando getEnvironment(). Sin embargo,
frecuentemente una propiedad de entorno representa una aspecto de comportamiento
del contexto, por ejemplo, las credenciales a usar cuando se entra en el
servidor. En dichos casos, no hay garantía de que que la propiedad haya sido
actualizada y el contexto haya verificado las corrección y aplicabilidad de la
propiedad. Esto es porque podría requerir interacción del servidor. La
siguiente vez que el contexto necesite usar la propiedad, ocurrirá la
verificación. En ese momento se podría indicar un fallo.
Por ejemplo, supongamos que hemos usado addToEnvironment()
tres veces para actualizar las identidades, las credenciales y el tipo de
autentificación de los clientes. Supongamos que hemos suministrado unas
credenciales erróneas. La próxima vez que llamemos al método que requiere la
autentificación en el conexto, el proveedor de servicio intentará
autentificarse usando las propiedades actualizadas. Sin embargo, la
autentificación fallará a causa de las credenciales erróneas y obtendremos
una AuthenticationException.