Sistema de Nombrado en Java (JNDI) y II

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR