RichFaces, nos ofrece una forma facil de generar Arboles (Tree) con solo agregarle un Collection, List o un Array, el ejemplo siguiente, sacado del live demo de RichFaces es un ejemplo sencillo de como leer un directorio y convertirlo en un arbol. El componente rich:recursiveTreeNodesAdaptor que se agrega internamente, se encarga de identificar de los elementos de la raÃz tienen a su vez mas elementos, y asi mostrarlos como carpetas o archivos.
En el siguiente ejemplo, la clase TreeNodeTest inicia una busqueda en el directorio indicado en SRC_PATH y llama a la función getSourceRoots().getNodes() que a su vez recupera el listado de carpetas y archivos, como puedes ver en la imagen, cuando haces click en las carpetas (que a su vez son objetos arrays con elementos), el inicia otra busqueda, por eso la propiedad nodes=”#{item.nodes}” que busca si Object[] nodes tiene algún elemento. Este proceso se repite hasta que el último elemento del arbol no encuentre mas elementos.
public class FileSystemNode { private String path; private static FileSystemNode[] CHILDREN_ABSENT = new FileSystemNode[0]; private FileSystemNode[] children; private String shortPath; public FileSystemNode(String path) { this.path = path; int idx = path.lastIndexOf('/'); if (idx != -1) { shortPath = path.substring(idx + 1); } else { shortPath = path; } } public synchronized FileSystemNode[] getNodes() { if (children == null) { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Set resourcePaths = externalContext.getResourcePaths(this.path); if (resourcePaths != null) { Object[] nodes = (Object[]) resourcePaths.toArray(); children = new FileSystemNode[nodes.length]; for (int i = 0; i < nodes.length; i++) { String nodePath = nodes[i].toString(); if (nodePath.endsWith("/")) { nodePath = nodePath.substring(0, nodePath.length() - 1); } children[i] = new FileSystemNode(nodePath); } } else { children = CHILDREN_ABSENT; } } return children; } public String toString() { return shortPath; } }
public class TreeNodeTest { private static String SRC_PATH = "/WEB-INF/classes"; private FileSystemNode[] srcRoots; private Log log = LogFactory.getLog(this.getClass()); public synchronized FileSystemNode[] getSourceRoots() { if (srcRoots == null) { srcRoots = new FileSystemNode(SRC_PATH).getNodes(); } return srcRoots; } }
<rich:tree style="width:300px" switchType="ajax"> <rich:recursiveTreeNodesAdaptor roots="#{treeNodeLocationBean.sourceRoots}" var="item" nodes="#{item.nodes}" /> </rich:tree>



Francy
on Jun 14th, 2010
@ 8:51:
muy bueno pero me gustarÃa saber como hago para recuperar la ruta completa del nodo seleccionado.