View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
5    */
6   package mockit.coverage.reporting;
7   
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   
10  import java.io.File;
11  import java.nio.file.Path;
12  import java.util.ArrayList;
13  import java.util.List;
14  
15  final class SourceFiles {
16      @NonNull
17      private final List<File> srcDirs = new ArrayList<>();
18  
19      @NonNull
20      List<File> buildListOfSourceDirectories(@NonNull String[] sourceDirs) {
21          if (sourceDirs.length > 0) {
22              buildListWithSpecifiedDirectories(sourceDirs);
23          } else {
24              buildListWithAllSrcSubDirectories();
25          }
26  
27          return srcDirs;
28      }
29  
30      private void buildListWithSpecifiedDirectories(@NonNull String[] dirs) {
31          for (String dir : dirs) {
32              File srcDir = Path.of(dir).toFile();
33  
34              if (srcDir.isDirectory()) {
35                  srcDirs.add(srcDir);
36              }
37          }
38  
39          if (srcDirs.isEmpty()) {
40              throw new IllegalStateException("None of the specified source directories exist");
41          }
42      }
43  
44      private void buildListWithAllSrcSubDirectories() {
45          String curDirName = Path.of(System.getProperty("user.dir")).toFile().getName();
46          addSrcSubDirs(Path.of("../" + curDirName).toFile());
47      }
48  
49      private void addSrcSubDirs(@NonNull File dir) {
50          File[] files = dir.listFiles();
51          if (files == null) {
52              return;
53          }
54  
55          for (File subDir : files) {
56              if (subDir.isDirectory()) {
57                  String subDirName = subDir.getName();
58  
59                  if ("src".equals(subDirName)) {
60                      srcDirs.add(subDir);
61                  } else if (!isDirectoryToIgnore(subDirName)) {
62                      addSrcSubDirs(subDir);
63                  }
64              }
65          }
66      }
67  
68      private static final String IGNORED_DIRS = "bin build classes generated-sources out test tst web ";
69  
70      private static boolean isDirectoryToIgnore(@NonNull String subDirName) {
71          int p = IGNORED_DIRS.indexOf(subDirName);
72          return p >= 0 && IGNORED_DIRS.charAt(p + subDirName.length()) == ' ';
73      }
74  }