package cucumber.runtime.io; import java.io.File; import java.io.FileFilter; import java.util.Iterator; import static cucumber.runtime.io.Helpers.hasSuffix; import static java.util.Arrays.asList; public class FileResourceIterator implements Iterator<Resource> { private final FlatteningIterator<Resource> flatteningIterator = new FlatteningIterator<Resource>(); public FileResourceIterator(File root, File file, final String suffix) { FileFilter filter = new FileFilter() { @Override public boolean accept(File file) { return file.isDirectory() || hasSuffix(suffix, file.getPath()); } }; flatteningIterator.push(new FileIterator(root, file, filter)); } @Override public boolean hasNext() { return flatteningIterator.hasNext(); } @Override public Resource next() { return flatteningIterator.next(); } @Override public void remove() { throw new UnsupportedOperationException(); } /** * Iterator to iterate over all the files contained in a directory. It returns * a File object for non directories or a new FileIterator obejct for directories. */ private static class FileIterator implements Iterator<Object> { private final Iterator<File> files; private final FileFilter filter; private final File root; FileIterator(File root, File file, FileFilter filter) { this.root = root; if (file.isDirectory()) { this.files = asList(file.listFiles(filter)).iterator(); } else if (file.isFile()) { this.files = asList(file).iterator(); } else { throw new IllegalArgumentException("Not a file or directory: " + file.getAbsolutePath()); } this.filter = filter; } @Override public Object next() { File next = files.next(); if (next.isDirectory()) { return new FileIterator(root, next, filter); } else { return new FileResource(root, next); } } @Override public boolean hasNext() { return files.hasNext(); } @Override public void remove() { files.remove(); } } }