/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.coverage.reporting;
import java.io.*;
import java.util.*;
import javax.annotation.*;
final class SourceFiles
{
@Nonnull private final List<File> srcDirs = new ArrayList<File>();
@Nonnull
List<File> buildListOfSourceDirectories(@Nonnull String[] sourceDirs)
{
if (sourceDirs.length > 0) {
buildListWithSpecifiedDirectories(sourceDirs);
}
else {
buildListWithAllSrcSubDirectories();
}
return srcDirs;
}
private void buildListWithSpecifiedDirectories(@Nonnull String[] dirs)
{
for (String dir : dirs) {
File srcDir = new File(dir);
if (srcDir.isDirectory()) {
srcDirs.add(srcDir);
}
}
if (srcDirs.isEmpty()) {
throw new IllegalStateException("None of the specified source directories exist");
}
}
private void buildListWithAllSrcSubDirectories()
{
String curDirName = new File(System.getProperty("user.dir")).getName();
addSrcSubDirs(new File("../" + curDirName));
}
private void addSrcSubDirs(@Nonnull File dir)
{
File[] files = dir.listFiles();
if (files == null) return;
for (File subDir : files) {
if (subDir.isDirectory()) {
String subDirName = subDir.getName();
if ("src".equals(subDirName)) {
srcDirs.add(subDir);
}
else if (!isDirectoryToIgnore(subDirName)) {
addSrcSubDirs(subDir);
}
}
}
}
private static final String IGNORED_DIRS = "bin build classes generated-sources out test tst web ";
private static boolean isDirectoryToIgnore(@Nonnull String subDirName)
{
int p = IGNORED_DIRS.indexOf(subDirName);
return p >= 0 && IGNORED_DIRS.charAt(p + subDirName.length()) == ' ';
}
}