private static void addFilesUnder(File root, List<File> files, FileFilter fileFilter) {
    if (! fileFilter.accept(root)) return;
    if (root.isFile()) {
      files.add(root);
      return;
    }
    if (root.isDirectory()) {
      File[] children = root.listFiles();
      for (int i = 0; i < children.length; i++) {
        File child = children[i];
        addFilesUnder(child, files, fileFilter);
      }
    }
  }