package org.smallmind.license; import java.io.File; import java.io.FileFilter; import java.util.Iterator; import java.util.LinkedList; import java.util.NoSuchElementException; import org.apache.maven.plugin.MojoExecutionException; public class LicensedFileIterable implements Iterable<File> { private final File directory; private final FileFilter[] fileFilters; public LicensedFileIterable (File directory, FileFilter[] fileFilters) throws MojoExecutionException { this.directory = directory; this.fileFilters = fileFilters; if (directory.exists()) { if (!directory.isDirectory()) { throw new MojoExecutionException("Specified file(" + directory.getAbsolutePath() + ") isn't a directory"); } } } public Iterator<File> iterator () { return new LicensedFileIterator(directory, fileFilters); } private class LicensedFileIterator implements Iterator<File> { private CompoundFileFilter compoundFileFilter; private LinkedList<File> directoryStack; private File currentFile; private LicensedFileIterator (File directory, FileFilter... fileFilters) { compoundFileFilter = new CompoundFileFilter(fileFilters); directoryStack = new LinkedList<>(); directoryStack.add(directory); currentFile = getNextFile(); } private File getNextFile () { File file; while (!directoryStack.isEmpty()) { if ((file = directoryStack.removeFirst()).exists()) { if (file.isDirectory()) { LinkedList<File> appendedList = new LinkedList<>(); for (File child : file.listFiles(compoundFileFilter)) { if (child.isFile()) { appendedList.addFirst(child); } else { appendedList.addLast(child); } } if (!appendedList.isEmpty()) { directoryStack.addAll(0, appendedList); } } else { return file; } } } return null; } public boolean hasNext () { return currentFile != null; } public File next () { File nextFile; if (currentFile == null) { throw new NoSuchElementException(); } nextFile = currentFile; currentFile = getNextFile(); return nextFile; } public void remove () { throw new UnsupportedOperationException(); } } }