
se.somath.publisher.builder.FileTreeBuilder Maven / Gradle / Ivy
package se.somath.publisher.builder;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import se.somath.publisher.excpetion.TooManyFilesFoundException;
import se.somath.publisher.includer.DirectoryLocator;
import se.somath.publisher.includer.FileFilter;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
/**
* Inspired from http://mama.indstate.edu/users/ice/tree/
*/
public class FileTreeBuilder {
private static final int MAX_NUMBER_OF_FILES_IN_TREE = 2048;
private File rootDirectory;
private int counter;
/**
* Build a file tree and apply the default file filter
*
* @param root the root directory to build from
* @return a list of Strings with all files properly formatted
*/
public List buildFileTree(String root) {
DirectoryLocator locator = new DirectoryLocator();
rootDirectory = locator.locateDirectory(root);
IOFileFilter fileFilter = FileFilterUtils.and(FileFilter.createFileFilter(), FileFilter.createDirectoryFilter());
return buildFileTree(rootDirectory, fileFilter);
}
/**
* Build a file tree and apply the provided file filter
*
* @param root the root directory to build from
* @param fileFilter the file filter to apply
* @return a list of Strings with all files properly formatted
*/
List buildFileTree(File root, IOFileFilter fileFilter) {
File[] files = getFilteredFiles(root, fileFilter);
if (files != null) {
return buildTree(root, fileFilter, files);
} else {
return buildEmptyResult();
}
}
private List buildTree(File root, IOFileFilter fileFilter, File[] files) {
List result = new LinkedList();
result.add("");
String applicationName = root.getName();
result.add(applicationName);
for (int fileIndex = 0; fileIndex < files.length; fileIndex++) {
File file = files[fileIndex];
if (file.isFile()) {
String fileRow = "|-- " + file.getName();
result.add(fileRow);
}
if (file.isDirectory()) {
if (lastItem(files, fileIndex)) {
buildFileTree("", file, true, result, fileFilter);
} else {
buildFileTree("", file, false, result, fileFilter);
}
}
}
result.add("
");
return result;
}
private List buildEmptyResult() {
List result = new LinkedList();
result.add("");
result.add("No files found");
result.add("
");
return result;
}
private boolean lastItem(File[] files, int fileIndex) {
return fileIndex == files.length - 1;
}
private void buildFileTree(String prefix, File file, boolean isTail, List result, IOFileFilter fileFilter) {
if (counter > MAX_NUMBER_OF_FILES_IN_TREE) {
throw new TooManyFilesFoundException("Too many files found in <" + rootDirectory.getAbsolutePath() + ">");
}
counter++;
String line;
if (isTail) {
line = prefix + "`-- " + file.getName();
} else {
line = prefix + "|-- " + file.getName();
}
result.add(line);
File[] files = getFilteredFiles(file, fileFilter);
if (files != null) {
String newPrefix;
if (isTail) {
newPrefix = prefix + " ";
} else {
newPrefix = prefix + "| ";
}
for (int i = 0; i < files.length - 1; i++) {
File current = files[i];
buildFileTree(newPrefix, current, false, result, fileFilter);
}
if (hasChildren(files)) {
File last = files[files.length - 1];
buildFileTree(newPrefix, last, true, result, fileFilter);
}
}
}
private File[] getFilteredFiles(File root, IOFileFilter fileFilter) {
File[] files = root.listFiles();
if (files != null) {
List res = new LinkedList();
for (File candidate : files) {
if (fileFilter.accept(candidate)) {
res.add(candidate);
}
}
files = res.toArray(new File[res.size()]);
}
return files;
}
private boolean hasChildren(File[] children) {
return children.length >= 1;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy