001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020
021 package net.sourceforge.pmd.util;
022
023 import java.io.File;
024 import java.io.FilenameFilter;
025 import java.util.ArrayList;
026 import java.util.List;
027
028 /**
029 * A utility class for finding files within a directory.
030 */
031 public class FileFinder {
032
033 private FilenameFilter filter;
034 private static final String FILE_SEP = System.getProperty("file.separator");
035
036 public List<File> findFilesFrom(String dir, FilenameFilter filter, boolean recurse) {
037 this.filter = filter;
038 List<File> files = new ArrayList<File>();
039 scanDirectory(new File(dir), files, recurse);
040 return files;
041 }
042
043 /**
044 * Implements a tail recursive file scanner
045 */
046 private void scanDirectory(File dir, List<File> list, boolean recurse) {
047 String[] candidates = dir.list(filter);
048 if (candidates == null) {
049 return;
050 }
051 for (int i = 0; i < candidates.length; i++) {
052 File tmp = new File(dir + FILE_SEP + candidates[i]);
053 if (tmp.isDirectory()) {
054 if (recurse) {
055 scanDirectory(tmp, list, true);
056 }
057 } else {
058 list.add(new File(dir + FILE_SEP + candidates[i]));
059 }
060 }
061 }
062 }