1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.eluder.coveralls.maven.plugin.source;
26
27 import java.io.BufferedInputStream;
28 import java.io.File;
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.nio.charset.Charset;
32 import java.nio.file.Files;
33 import java.nio.file.Path;
34 import java.util.HashMap;
35 import java.util.Map;
36
37 import org.apache.commons.io.FilenameUtils;
38 import org.codehaus.plexus.util.DirectoryScanner;
39 import org.codehaus.plexus.util.SelectorUtils;
40
41
42
43
44 public class ScanSourceLoader extends AbstractSourceLoader {
45
46
47 private final Map<String, String[]> cache = new HashMap<>();
48
49
50 private final File sourceDirectory;
51
52
53
54
55
56
57
58
59
60
61
62 public ScanSourceLoader(final File base, final File sourceDirectory, final Charset sourceEncoding) {
63 super(base.toURI(), sourceDirectory.toURI(), sourceEncoding);
64 this.sourceDirectory = sourceDirectory;
65 }
66
67 @Override
68 protected InputStream locate(final String sourceFile) throws IOException {
69 final var path = Path.of(this.sourceDirectory.toString(), this.getFileName(sourceFile));
70
71 if (Files.exists(path)) {
72 if (!Files.isRegularFile(path)) {
73 throw new IllegalArgumentException(path.toAbsolutePath() + " is not file");
74 }
75 return new BufferedInputStream(Files.newInputStream(path));
76 }
77 return null;
78 }
79
80
81
82
83
84
85
86
87
88 private String[] scanFor(final String extension) {
89 return this.cache.computeIfAbsent(extension, ext -> {
90 final var scanner = new DirectoryScanner();
91 scanner.setBasedir(this.sourceDirectory);
92 scanner.addDefaultExcludes();
93 scanner.setIncludes(new String[] { "**/*." + ext });
94 scanner.scan();
95 return scanner.getIncludedFiles();
96 });
97 }
98
99 @Override
100 protected String getFileName(final String sourceFile) {
101 final var extension = FilenameUtils.getExtension(sourceFile);
102 final var matchingExtensionFiles = this.scanFor(extension);
103
104 for (final String matchingExtensionFile : matchingExtensionFiles) {
105 if (SelectorUtils.matchPath("**/" + sourceFile, matchingExtensionFile, true)) {
106 return matchingExtensionFile;
107 }
108 }
109
110 return sourceFile;
111 }
112
113 }