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

Sistema de Nombrado en Java (JNDI) [Parte I]
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Listar un Contexto

En lugar de obtener un sólo objeto, como con Context.lookup(), podemos listar un contexto completo usando una sola operación. Hay dos métodos para listar un contexto: uno que devuelve las uniones y otro que sólo devuelve las parejas de nombres de clases nombre-a-objeto.

El Método Context.List()

Context.list() devuelve una enumeración de NameClassPair.

Cada NameClassPair consiste en el nombre del objeto y el nombre de la clase. El siguiente fragmento de código lista los contenidos del directorio "awt" (es decir, los ficheros encontrados en el directorio "awt"). 

NamingEnumeration list = ctx.list("awt");

while (list.hasMore()) {
    NameClassPair nc = (NameClassPair)list.next();
    System.out.println(nc);
}

El ejecutar este ejemplo obtendremos la siguiente salida.

# java List
accessibility: javax.naming.Context
color: javax.naming.Context
datatransfer: javax.naming.Context
dnd: javax.naming.Context
event: javax.naming.Context
font: javax.naming.Context
geom: javax.naming.Context
im: javax.naming.Context
image: javax.naming.Context
peer: javax.naming.Context
print: javax.naming.Context
swing: javax.naming.Context

El Método Context.listBindings()

Context.listBindings() devuelve una enumeración de Binding.

Binding es una subclase de  NameClassPair.

Una binding (unión) no sólo contiene el nombre del objeto y el nombre de su clase, también contiene el propio objeto. El siguiente código enumera el contexto "awt", imprimiendo cada nombre de unión y el objeto.

NamingEnumeration bindings = ctx.listBindings("awt");

while (bindings.hasMore()) {
    Binding bd = (Binding)bindings.next();
    System.out.println(bd.getName() + ": " + bd.getObject());
}

Al ejecutar este ejemplo obtendremos una salida como esta.

# java ListBindings
accessibility: com.sun.jndi.fscontext.RefFSContext@1dacd52e
color: com.sun.jndi.fscontext.RefFSContext@1dacd551
datatransfer: com.sun.jndi.fscontext.RefFSContext@1dacd584
dnd: com.sun.jndi.fscontext.RefFSContext@1dacd5b6
event: com.sun.jndi.fscontext.RefFSContext@1dacd5e8
font: com.sun.jndi.fscontext.RefFSContext@1dacd61b
geom: com.sun.jndi.fscontext.RefFSContext@1dacd64d
im: com.sun.jndi.fscontext.RefFSContext@1dacd62a
image: com.sun.jndi.fscontext.RefFSContext@1dacd65c
peer: com.sun.jndi.fscontext.RefFSContext@1dacd68f
print: com.sun.jndi.fscontext.RefFSContext@1dacd6c1
swing: com.sun.jndi.fscontext.RefFSContext@1dacd6f3

Terminando una NamingEnumeration

Una NamingEnumeration puede terminarse de una de tres formas: naturalmente, explícitamente o inexperadamente.

  • Cuando un NamingEnumeration.hasMore() devuelve false, la enumeración se ha completado efectivamente.
  • Podemos terminar una enumeración explícitamente antes de que se haya completado llamando a  NamingEnumeration.close().

    Haciendo esto proporcionamos un aviso a la implementación subyacente para que libere cualquier recurso asociado con la enumeración.

  • Si hasMore() o next() lanzan una NamingException, la enumeración se termina de forma efectiva.

Sin importar el modo en que se ha terminado una enumeración, una vez terminada no se puede volver a usar. Llamar a un método sobre una enumeración terminada nos dará resultados indefinidos.

¿Por qué dos métodos de listado diferentes?

list() se ha pensado para una aplicación estilo navegador que sólo quiere nombrar los nombres de los objetos de un contexto. Por ejemplo, un navegador podria listar los nombres de un contexto y esperar a que el usuario seleccione uno o unos pocos de los nombres mostrados para realizar operaciones futuras. Dichas aplicaciones normalmente no necesitan acceder a todos los objetos de un contexto.

listBindings() se ha pensado para aplicaciones que necesitan realizar operaciones en masa sobre los objetos de un contexto. Por ejemplo, una aplicación de backup podría necesitar realizar operaciones de "estado de fichero" sobre todos los ficheros de un directorio. O un programa administrador de impresoras podría querer rearrancar todas las impresoras de un edificio. Para realizar dichas operaciones, estas aplicaciones necesitan obtener todos los objetos unidos en el contexto. Por eso es mucho más expeditivo devolver los objetos como parte de la enumeración.

Qué aplicación puede usar list() o la potencialmente más costosa listBindings(), depende del tipo de información que se necesite.


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