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:


Nombres

Los nombres se explican más extensamente en la lección ¿Qué es un nombre?. Esta lección explica en general cómo un desarrollador de proveedores de servicio debería tratar los parámetros string y los nombres estructurados de los métodos del interface Context y sus subinterfaces.

Nombres String

Un nombre String es un nombre mixto. Incluso si la implementación de contexto que estamos escribiendo no va a soportar federación, seguir esta regla es una buena idea para que los usuarios de nuestro proveedor no tengan que tratar a nuesto proveedor de forma diferente en este aspecto.

Siguiendo esta regla, escribiremos las sobrecargas del interface Context y sus subinterfaces que aceptan un nombre java.lang.String como una simple envoltura alrededor de las sobrecargas que aceptan un Name. Como ejemplo, aquí tenemos una definición de implementación de contexto de Context.lookup():

Object lookup(String name) throws NamingException {
    return lookup(new CompositeName(name));
}

Nombres Mixtos

Un nombre estructurado está representado por un objeto que implementa el interface Name. Puede representar un nombre mixto o un nombre compuesto. En cualquier caso, el parámetro nombre pertenece al llamador y no deberíamos modificarlo (puedes ver más detalles en la página Parámetros y Valores de Retorno).

Un nombre mixto está representado por un ejemplar de CompositeName. Si nuestra implementación de contexto no soporta federación, entonces puede crear nombres mixtos de dos formas. La más simple es para la implementación de contexto que lanza una InvalidNameException cuando recibe un CompositeName. Sin embargo, esta aproximación es Draconicana en que impide que la aplciación pase un CompositeName, incluso si el CompositeName contiene sólo componentes que pertencen al espacio de nombres de la implementación de contexto. Una aproximación más comprometida es para la implementación de contexto que sólo acepta CompositeNames que contienen componentes que pertenecen a su espacio de nombres. En esta aproximación, la implementación extrae los componentes que pertenecen a su espacio de nombres, y para los componentes que no pertenece, lanza una InvalidNameException.

Si nuestra implementación de contexto soporta federación, debería extraer los componentes del CompositeName que pertenecen a su espacio de nombres. Para componentes que no le pertenecen debería resolver sus propios componentes y pasar los componentes restantes al nns. (Se darán más detalles sobre esto en la lección Añadir Soporte de Federación.) Si la implementación sólo recibe componentes de su espacio de nombre, debería procesar la operación solicitada.

Aquí tenemos un pseudo-código que ilustra el caso no-federado:

Object lookup(Name name) throws NamingException {
    if (name instanceof CompositeName) {
        {mine, theirs} = splitName(name);
	if (theirs.size() == 0) {
             // Find in internal tables
             return impl.get(mine);
        } else {
	     // Don't support federation
 	     throw new InvalidNameException(name.toString() + 
                " has more components than I can handle");
        }
    } else {
        // Process the compound name
        ...
    }
}

Nombres Compuestos

Un nombre compuesto puede estar representado por cualquier implementación del interface Name excepto CompositeName o una de sus subclases. La forma más sencilla, aunque no la más eficiente, de hacer que una implementación de contexto acepta un nombre compuesto es convertirlo en un nombre mixto.

Aquí tenemos un ejemplo que mapea un nombre compuesto en un nombre mixto de un sólo componente:

Object lookup(Name name) throws NamingException {
    if (name instanceof CompositeName) {
        // Process composite name
        ...
    } else {
        // Process compound name; turn it into single-component CompositeName
        return lookup(new CompositeName().add(name.toString()));
    }
}

Esta es la solución más general. Normalmente una implementación de contexto puede hacer esto mucho más eficientemente usando directametne la forma pre-analizada (ejemplar de Name) o el nombre compuesto "stringified". Por ejemplo, una implementación podría usar el nombre compuesto "stringified" como una clave para una tabla interna.


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