• Autor: admin
  • Publicado: May 31st, 2009
  • Categoria: Articulos
  • Comentarios: 1

RichFaces El Componente Tree, leyendo un directorio

tree

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>

Tags: , , ,

One Response to “RichFaces El Componente Tree, leyendo un directorio”


  1. Francy
    on Jun 14th, 2010
    @ 8:51

    muy bueno pero me gustaría saber como hago para recuperar la ruta completa del nodo seleccionado.

Dejar una Respuesta

Spam Protection by WP-SpamFree

© 2009 Jotadeveloper Blog. Nuestros contenidos están bajo licencia Creative Commons mientras no se indique lo contrario,
y pueden reproducirse libremente sin más que mencionar la fuente ("JotaDeveloper") y la URL concreta del artículo original. .

This blog is powered by Wordpress and JotaDeveloperTheme.