Sistema de Nombrado en Java (JNDI) y II

Una factor�a de contexto URL es una factor�a de objetos especial que crea contextos para resolver strings URL. Como todas las factor�as de objetos, es una clase que implementa el interface ObjectFactory. Una factor�a de contexto URL no s�lo debe satisfacer todos los requerimientos especificados para las factor�as de objeto, como se espec�fic� en la lecci�n Factor�as de Objetos, tambi�n debe seguir las siguientes reglas:

  • Un argumento objeto null para getObjectInstance() significa que la factor�a deber�a crear un contexto para resolver strings URL arbitrarios del esquema asociado con la factor�a. Por ejemplo, una llamada a una factor�a para el esquema ldap devolver�a un contexto que acepte strings URL LDAP arbitrarios, como "ldap://ldap.wiz.com/o=wiz,c=us" y "ldap://ldap.umich.edu/o=umich,c=us".
  • Si el argumento objeto para getObjectInstance() es un string URL (java.lang.String) de un esquema aceptable para esa factor�a, entonces la factor�a deber�a devolver un objeto (que podr�a no ser necesariamente un contexto) identificado por el string URL. Por ejemplo, si a getObjectInstance() se le da el string "ldap://ldap.wiz.com/o=wiz,c=us", deber�a devolver el objeto nombrado por el DN "o=wiz, c=us" en el servidor LDAP ldap.wiz.com.
  • Si el argumento objeto para getObjectInstance() es un array de strings URL (java.lang.String[]), entonces la factor�a deber�a devolver un objeto nombrado por cualquiera de los strings URL. Se asume que todos los strings URL del array son equivalentes en t�rminos del objeto al que se refieren. La verificaci�n de si los strings son, o necesitan ser, equivalentes, es cosa de la factor�a. El orden de los strings URL en el array no es significante.

Si la factor�a recibe cualquier otro tipo de argumento objeto para getObjectInstance(), entonces este comportamiento es dependiente de la implementaci�n.

La primera regla se aplica para soportar la resoluci�n de strings URL desde el InitialContext--esto de describe m�s tarde en esta lecci�n. La segunda y tercera reglas se aplican para soportar la resoluci�n de strings URL embebidas en una Reference--esto tambi�n se describe m�s tarde en esta lecci�n. Como indican la segunda y tercera reglas, un factor�a de contexto URL no es s�lo de objetos context. Tambi�n produce cualquier tipo de objeto nombrado por un string URL.

.�Convenciones de Nombrado para Nombres de Clases

El nombre de la clase de la factor�a de contexto URL debe seguir la siguiente convenci�n de nombrado que puede localizarse en el marco de trabajo JNDI: package_prefix.scheme_id.URLContextFactory donde:

  • package_prefix es un prefijo v�lido de un paquete del lenguaje Java y
  • scheme_id es el identificador del esquema de la URL del servicio de nombres/directorio (por ejemplo, ldap es el id del esquema para los servicios que soportan LDAP).

Por ejemplo, el nombre de la clase tut.foo.fooURLContextFactory es para el esquema URL foo; que est� en el paquete "tut". En otro ejemplo, el nombre de la clase com.sun.jndi.url.ldap.ldapURLContextFactory es del esquema URL ldap; que est� en el paquete "com.sun.jndi.url". Observa que package_prefix no debe estar vac�o.

.�Implementaci�n de Ejemplo

Esta secci�n ofrece un ejemplo de c�mo implementar una factor�a de contexto URL. Este ejemplo es s�lo para prop�sitos ilustrativos lo que no significa que sea la mejor receta.

Este ejemplo es para el esquema URL foo, que tienen la s�ntaxis foo:nombre en el espacio de nombres HierCtx. HierCtx es una implementaci�n de espacio de nombres en memoria con forma de �rbol. Para hacer que funcione con el ejemplo URL, necesitamos crear un espacio de nombres est�tico que pueda procesarse usando un m�todo est�tico de la clase HierCtx. Usando un string URL foo, podremos nombrar los objetos en este espacio de nombres est�tico.

Como todas las factor�as de objetos, una factor�a de contextos URL debe ser p�blica y tener un constructor p�blico que no acepte argumentos:

public class fooURLContextFactory implements ObjectFactory {
    public fooURLContextFactory() {
    }
    ...
}

Esta implementaci�n de factor�a de getObjectInstance() sigue bastante bien las tres reglas listadas anteriormente. Las implementaciones de estas reglas usan la siguiente utilidad para crear un contexto desde la implementaci�n de contexto fooURLContext:

protected Context getURLContext(Hashtable env) {
    return new fooURLContext(env);
}

Una implementaci�n real podr�a o no podr�a elegir su estrategia usando una implementaci�n de contexto que satisfaga los tres requerimientos. Es prefectamente aceptable tener una factor�a que use diferentes implementaciones de contexto.

En los siguientes ejemplos, urlInfo es el argumento objeto para getObjectInstance().

Para la primera regla, simplemente devolvemos la ra�z fooURLContext:

if (urlInfo == null) {
    return createURLContext(env);
}

Para la segunda regla, usamos la ra�z fooURLContext para buscar y devolver el objeto nombrado por el string URL:

if (urlInfo instanceof String) {
    Context urlCtx = createURLContext(env);
    try {
        return urlCtx.lookup((String)urlInfo);
    } finally {
        urlCtx.close();
    }
}

Observa que antes de que el m�todo vuelva, cierra la ra�z fooURLContext. En este ejemplo particular, este paso no es realmente necesario porque fooURLContext no mantiene conexiones ni recursos. Sin embargo, hacer esto es una buena pr�ctica para asegurarnos de que las implementaciones que mantienen conexiones o recursos las liberan apropiadamente.

Para la tercera regla, iteramos sobre el array de strins URL hasta que encontramos uno que tenga �xito. Grabamos una de las excepciones encontradas junto con su camino en el caso de fallen todos los stringos URL y necesitemos indicar por qu�:

if (urlInfo instanceof String[]) {

    // Try each URL until lookup() succeeds for one of them.
    // If all URLs fail, throw one of the exceptions arbitrarily.
    String[] urls = (String[])urlInfo;
    if (urls.length == 0) {
        throw (new ConfigurationException("fooURLContextFactory: empty URL array"));
    }
    Context urlCtx = createURLContext(env);
    try {
	NamingException ne = null;
	for (int i = 0; i < urls.length; i++) {
	    try {
	        return urlCtx.lookup(urls[i]);
	    } catch (NamingException e) {
	        ne = e;
	    }
        }
        throw ne;
    } finally {
        urlCtx.close();
    }
}

COMPARTE ESTE ARTÍCULO

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