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