Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) y II
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Relación con el Contexto Inicial

Cuando el usuario del API suministra un string URL a uno de los métodos de las clases InitialContext o InitialDirContext, el JNDI extrae el esquema URL de el string y usa NamingManager.getURLContext() para encontrar una implementación de contexto URL que procese el string. Este método utiliza el algoritmo descrito anteriormente en esta lección.

Si el JNDI localiza con éxito una implementación de contexto URL, invoca al método del contexto original usando los argumentos originales. Esto significa que se pasa el string URL completo a la implementación de contexto URL, donde es procesado como se describió en la sección Implementación del Contexto URL.

Si el JNDI no puede localizar una implementación de contexto URL para procesar el string URL, asume que el nombre de entrada no es un string URL. Luego pasa al nombre a la implementación de contexto inicial subyacente (que es nombrado por la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY ( "java.naming.factory.initial")).

Suportar Subinterfaces

Para proporcionar soporte URL desde el contexto inicial a un subinterface Context, necesitamos definir una nueva clase que descienda de InitialContext o de una de sus subclases.

Por ejemplo, supongamos que BarContext extiende Context añadiendo dos nuevos métodos: barMethod(), que acepta un argumento nombre, y bazMethod(), que no lo acepta. Este servicio tiene un identificador de esquema de URL de bar. (Ver su implementación de contexto URL presentada anteriormente en esta lección). Para definir un contexto inicial para este interface, primero especificamos su descendencia:

public class InitialBarContext 
    extends InitialContext implements BarContext

Esta clase desciende de InitialContext e implementa el nuevo interface, BarContext.

Luego definimos algunos constructores para la clase. Normalmente, deberíamos planear al menos dos constructores, uno que no acepte argumentos y uno que acepte un parámetro de entorno:

public InitialBarContext() throws NamingException {
    super();
}

public InitialBarContext(Hashtable env) throws NamingException {
    super(env);
}

Luego, proporcionamos métodos de útilidad para los métodos que procesan nombres y para los que no lo hacen. Para métodos que procesan nombres, definimos un método de utilidad que devuelva un contexto URL o un contexto inicial por defecto inspeccionando el argumento nombre. La mayoría del trabajo ya está hecho por el método protegido InitialContext.getURLOrDefaultInitCtx(). El método de utilidad sólo necesita chequear el tipo del contexto resultante para asegurarse de que es compatible con ese subinterface. Necesitamos dos de estos métodos, uno para el nombre string y otro para el Name. Aquí está la versión string:

protected BarContext getURLOrDefaultInitBarCtx(String name)
    throws NamingException {
    Context ctx = getURLOrDefaultInitCtx(name);
    if (!(ctx instanceof BarContext)) {
	throw new NoInitialContextException("Not a BarContext");
    }
    return (BarContext)ctx;
}

Para métodos que no procesan nombres, definimos un método de utilidad que devuelva un contexto inicial por defecto. La mayoría del trabajo ya está hecho por el método protegido InitialContext.getDefaultInitCtx(). El método de utilidad sólo necesita chequear el tipo del contexto resultante para asegurarse de que es compatible con ese subinterface:

protected BarContext getDefaultInitBarCtx() throws NamingException {
    Context ctx = getDefaultInitCtx();
    if (!(ctx instanceof BarContext)) {
	throw new NoInitialContextException("Not a BarContext");
    }
    return (BarContext)ctx;
}

Una vez que tenemos estos métodos, es correcto proporcionar implementaciones para todos los nuevos métodos. Los nuevos métodos relacionados con los nombres usan getURLOrDefaultInitBarCtx(), mientras que los no relacioandos con los nombres usan getDefaultInitBarCtx(). Aquí tenemos algunos ejemplo:

public Object barMethod(String name) throws NamingException {
    return getURLOrDefaultInitBarCtx(name).barMethod(name);
}

public String bazMethod() throws NamingException {
    return getDefaultInitBarCtx().bazMethod();
}

Para usar esta nueva implementación de contexto inicial, nuestro programa debe importar la nueva clase. Aquí tenemos un ejemplo que llama a uno de los nuevos métodos usando una URL bar:

tut.BarContext ctx = new tut.InitialBarContext();

// Invoke the BarContext-specific method with the URL
Object answer = ctx.barMethod("bar:/a");

Ejecutar este ejemplo produce esta salida:

The answer is a

Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis