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.
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.