package fileWalker; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.LinkedList; import java.util.List; class UnorderedFileWalkerImpl extends SimpleFileVisitor<Path> { private FileNameMatcher matcher = new FileNameMatcher(); private List<SourceFileListener> listeners = new LinkedList<SourceFileListener>(); public void setFilenameFilter(String pattern) { matcher.setFilenameFilter(pattern); } public void addListener(SourceFileListener listener) { listeners.add(listener); } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { notifyListenersOfDirEntry(dir); return FileVisitResult.CONTINUE; } private void notifyListenersOfDirEntry(Path dir) { for (SourceFileListener listener : listeners) { listener.preVisitDirectory(dir); } } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) { notifyListenersOfDirExit(dir); return FileVisitResult.CONTINUE; } private void notifyListenersOfDirExit(Path dir) { for (SourceFileListener listener : listeners) { listener.postVisitDirectory(dir); } } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { if (!matcher.fileMatches(file)) { return FileVisitResult.CONTINUE; } notifyListenersOfFile(file); return FileVisitResult.CONTINUE; } private void notifyListenersOfFile(Path filename) { for (SourceFileListener listener : listeners) { listener.visitFile(filename); } } }