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
|