import java.util.Iterator;
import java.io.File;

public class DirectoryTree {
	private Tree<File> dirTree;
	
	/**
	  * Construct a Directory Tree<File> from a file
	  */
	public DirectoryTree(File directory) {
		dirTree = getDirectories(directory);
	}
		
	private Tree<File> getDirectories(File directory) {
		Tree<File> root = new Tree<File>(directory);
		String[] fileNames = directory.list();
		for( int i = 0; i < fileNames.length; i++ ) {
			File file = new File(directory,fileNames[i]);
			if( file.isDirectory() ) {
				root.addChild(getDirectories(file));
			} else {
				root.addChild(new Tree<File>(file));
			} // end if
		} // end for
		return root;
	}
	
	/**
	  * Returns a String representation of the Directory Tree<File>.
	  * Each subdirectory is indented and each file is identified as
	  * a directory or a file.
	  *@returns a String representation of the this Directory Tree<File>
	  */
	public String toString() {
		return preorder(dirTree,0);
	} // end preorder
			
	private	String preorder(Tree<File> tree, int depth) {
		StringBuffer out = new StringBuffer();
		for(int i = 0; i < 10*depth; i++ ) {
			out.append(" ");
		} // end for
		File file = tree.getData();
		out.append(file.getName());
		if( tree.isLeaf() ) {
			if( file.isDirectory() ) {
				return out.append(" DIRECTORY\n").toString();
			} else {
				return out.append(" FILE\n").toString();
			} // end if 
		} // end if
		out.append(" DIRECTORY\n");
		Iterator<Tree<File>> itr = tree.getChildren().iterator();
		while( itr.hasNext() ) {
			out.append(preorder(itr.next(),depth+1));
		}
		return out.toString();
	} // end preorder				
	
} // end DirectoryTree


