Sistema de Nombrado en Java (JNDI) y II

Si hemos seguido los pasos descritos hasta ahora, deber�amos tener una implementaci�n de contexto completa y funcional. Sin embargo, como una implementaci�n de contexto deber�a estar cerrada en el sentido de los tipos de objetos que pueder ser le�dos y almacenados usando la implementaci�n de contexto estar�a limitado a lo que la implementaci�n de contexto estuviera programada para aceptar. El JNDI proporciona utilidades para hacer extensibles las implementaciones de contexto. Estas utilidades permiten a los objetos que son pasados desde el programa ser transformados antes de alcanzar la implementaci�n de contexto, y permtie que los objetos le�dos desde el directorio sean transformados antes de llegar al programa.

.�Leer Objetos

La lecci�n Factor�as de Objetos describe que un proveedor de servicio deber�a usar NamingManager.getObjectInstance() o DirectoryManager.getObjectInstance() antes de devolver un objeto al programa de usuario desde uno de los siguientes m�todos:

Abajo podemos ver c�mo el ejemplo del espacio de nombres con forma de �rbol llama a getObjectInstance() en su m�todo lookup(). Usa el m�todo de la clase NamingManager porque HierCtx s�lo implementa el interface Context. Si una implementaci�n de contexto implementa el interface DirContext, deber�a usar el de la clase DirectoryManager. Puedes encontrar m�s detalles en la lecci�n A�adir Soporte de Directorio:

// Code that determined "inter" is the object bound to the
// atomic name "atom"
    ...
// Call getObjectInstance for using any object factories
try {
    return NamingManager.getObjectInstance(inter, 
        new CompositeName().add(atom), this, myEnv);
} catch (Exception e) {
    NamingException ne = new NamingException("getObjectInstance failed");
    ne.setRootCause(e);
    throw ne;
}

Deber�amos pasar a getObjectInstance() el nombre del objeto como un nombre mixto y el contexto en el que se deber�a resolver ese nombre. Este no necesita ser el contexto m�s profundo (es decir, el nombre no necesita ser at�mico). Tambi�n deber�amos pasarle las propiedades de entorno del contexto en el caso de las factor�as de objetos las necesiten.

De forma similar, cuando devolvamos la enumeraci�n generada por Context.listBindings() , deber�amos llamar a getObjectInstance() para el objeto de cada Binding en la enumeraci�n. Aqu� tenemos la definici�n del m�todo next() de la enumeraci�n:

public Object next() throws NamingException {
    String name = (String)names.nextElement();
    Object obj = bindings.get(name);

    try {
	obj = NamingManager.getObjectInstance(obj, 
	    new CompositeName().add(name), HierCtx.this, 
	    HierCtx.this.myEnv);
    } catch (Exception e) {
	NamingException ne = new NamingException("getObjectInstance failed");
	ne.setRootCause(e);
	throw ne;
    }

    return new Binding(name, obj);
}

Este ejemplo muestra un aproximaci�n est�tica, en la que se llama a getObjectInstance() mientras creamos cada ejemplar de Binding. Otra aproximaci�n es definir nuestra propia subclase de Binding y sobreescribir Binding.getObject() para que llame a getObjectInstance(). (El resultado de getObjectInstance() podr�a almacenarse en un chach� para evitar llamadas repetidas.)

.�Almacenar Objetos

La lecci�n Factor�as de Estado describe como un proveedor de servicio deber�a usar NamingManager.getStateToBind() o DirectoryManager.getStateToBind() antes de almacenar un objeto dado por el programa de usuario a uno de estos m�todos:

Aqu� tenemos como el ejemplo del espacio de nombres con forma de �rbol llama a getStateToBind() en sus m�todos bind() y rebind(). Usa el m�todo de la clase NamingManager porque HierCtx s�lo implementa el interface Context. Si una implementaci�n de contexto implementa el interface DirContext , deber�a usar el de la clase DirectoryManager. Puedes ver m�s detalles en la lecci�n A�adir Soporte de Directorio:

// Code that determines that this is the context in which
// to bind the atomic name "atom" to the object "obj"
    ...
// Call getStateToBind for using any state factories
obj = NamingManager.getStateToBind(obj, 
    new CompositeName().add(atom), this, myEnv);

// Add the object to the internal data structure
bindings.put(atom, obj);

Deber�amos pasar a getStateToBind() el nombre del objeto como un nombre mixto y el contexto en el que se deber�a resolver ese nombre. Este no necesita ser el contexto m�s profundo (es decir, el nombre no necesita ser at�mico). Tambi�n deber�amos pasarle las propiedades de entorno del contexto en el caso de las factor�as de objetos las necesiten.

Observa que esta implementaci�n es simpl�stica porque el ejemplo puede almacenar cualquir tipo de objeto. Una implementaci�n m�s realista chequear�a el resultado de getStateToBind() para asegurarse de que el objeto es de un tipo que �l puede almacenar. Puedes ver m�s detalles en la lecci�n Factor�as de Estado.

COMPARTE ESTE ARTÍCULO

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