src.gov.nasa.worldwind.util.FileTree Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of worldwindx Show documentation
Show all versions of worldwindx Show documentation
World Wind is a collection of components that interactively display 3D geographic information within Java applications or applets.
/*
* Copyright (C) 2012 United States Government as represented by the Administrator of the
* National Aeronautics and Space Administration.
* All Rights Reserved.
*/
package gov.nasa.worldwind.util;
import java.io.File;
import java.io.FileFilter;
import java.util.*;
/**
* @author dcollins
* @version $Id: FileTree.java 1171 2013-02-11 21:45:02Z dcollins $
*/
public class FileTree implements Iterable
{
private File root;
private int mode = FILES_AND_DIRECTORIES;
public static final int FILES_ONLY = 1;
public static final int DIRECTORIES_ONLY = 2;
public static final int FILES_AND_DIRECTORIES = 3;
public FileTree()
{
this(null);
}
public FileTree(File root)
{
this.root = root;
}
public File getRoot()
{
return this.root;
}
public void setRoot(File root)
{
this.root = root;
}
public int getMode()
{
return this.mode;
}
public void setMode(int mode)
{
if (!validate(mode))
throw new IllegalArgumentException("mode:" + mode);
this.mode = mode;
}
public List asList()
{
return asList(null);
}
public List asList(FileFilter fileFilter)
{
return makeList(this.root, fileFilter, this.mode);
}
public Iterator iterator()
{
return iterator(null);
}
public Iterator iterator(FileFilter fileFilter)
{
return new FileTreeIterator(this.root, fileFilter, this.mode);
}
private static List makeList(File root, FileFilter fileFilter, int mode)
{
Queue dirs = new LinkedList();
if (isDirectory(root))
dirs.offer(root);
LinkedList result = new LinkedList();
while (dirs.peek() != null)
expand(dirs.poll(), fileFilter, mode, result, dirs);
return result;
}
private static class FileTreeIterator implements Iterator {
private final Queue dirs = new LinkedList();
private final Queue files = new LinkedList();
private final FileFilter fileFilter;
private final int mode;
private FileTreeIterator(File root, FileFilter fileFilter, int mode) {
if (isDirectory(root))
this.dirs.offer(root);
this.fileFilter = fileFilter;
this.mode = mode;
}
public boolean hasNext() {
if (this.files.peek() == null)
expandUntilFilesFound();
return this.files.peek() != null;
}
public File next() {
if (this.files.peek() == null) {
expandUntilFilesFound();
if (this.files.peek() == null)
throw new NoSuchElementException();
}
return this.files.poll();
}
public void remove() {
throw new UnsupportedOperationException();
}
private void expandUntilFilesFound() {
while (this.dirs.peek() != null && this.files.peek() == null)
expand(this.dirs.poll());
}
private void expand(File directory) {
if (directory != null) {
FileTree.expand(directory, this.fileFilter, this.mode, this.files, this.dirs);
}
}
}
private static void expand(File file, FileFilter fileFilter, int mode,
Queue outFiles, Queue outDirs)
{
if (file != null)
{
File[] list = file.listFiles();
if (list != null)
{
for (File child : list)
{
if (child != null)
{
boolean isDir = child.isDirectory();
if (isDir)
{
outDirs.offer(child);
}
if ((!isDir && isDisplayFiles(mode)) || (isDir && isDisplayDirectories(mode)))
{
if (fileFilter == null || fileFilter.accept(child))
{
outFiles.offer(child);
}
}
}
}
}
}
}
private static boolean isDirectory(File file)
{
return file != null && file.exists() && file.isDirectory();
}
private static boolean isDisplayFiles(int mode)
{
return mode == FILES_ONLY || mode == FILES_AND_DIRECTORIES;
}
private static boolean isDisplayDirectories(int mode)
{
return mode == DIRECTORIES_ONLY || mode == FILES_AND_DIRECTORIES;
}
private static boolean validate(int mode)
{
return mode == FILES_ONLY
|| mode == DIRECTORIES_ONLY
|| mode == FILES_AND_DIRECTORIES;
}
}