Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) y II
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Factorías de Contexto URL

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();
    }
}

Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis