1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.eluder.coveralls.maven.plugin.source;
25
26 import org.apache.commons.io.FilenameUtils;
27 import org.codehaus.plexus.util.DirectoryScanner;
28 import org.codehaus.plexus.util.SelectorUtils;
29
30 import java.io.BufferedInputStream;
31 import java.io.File;
32 import java.io.FileInputStream;
33 import java.io.IOException;
34 import java.io.InputStream;
35 import java.util.HashMap;
36 import java.util.Map;
37
38 public class ScanSourceLoader extends AbstractSourceLoader {
39
40 private final Map<String, String[]> cache = new HashMap<>();
41
42 private final File sourceDirectory;
43
44 public ScanSourceLoader(final File base, final File sourceDirectory, final String sourceEncoding) {
45 super(base.toURI(), sourceDirectory.toURI(), sourceEncoding);
46 this.sourceDirectory = sourceDirectory;
47 }
48
49 @Override
50 protected InputStream locate(final String sourceFile) throws IOException {
51 File file = new File(sourceDirectory, getFileName(sourceFile));
52
53 if (file.exists()) {
54 if (!file.isFile()) {
55 throw new IllegalArgumentException(file.getAbsolutePath() + " is not file");
56 }
57 return new BufferedInputStream(new FileInputStream(file));
58 }
59 return null;
60 }
61
62 private String[] scanFor(final String extension) {
63 if (!cache.containsKey(extension)) {
64 DirectoryScanner scanner = new DirectoryScanner();
65 scanner.setBasedir(sourceDirectory);
66 scanner.addDefaultExcludes();
67 scanner.setIncludes(new String[] {"**/*." + extension});
68 scanner.scan();
69
70 cache.put(extension, scanner.getIncludedFiles());
71 }
72 return cache.get(extension);
73 }
74
75 @Override
76 protected String getFileName(final String sourceFile) {
77 String extension = FilenameUtils.getExtension(sourceFile);
78 String[] matchingExtensionFiles = scanFor(extension);
79
80 for (String matchingExtensionFile : matchingExtensionFiles) {
81 if (SelectorUtils.matchPath("**/" + sourceFile, matchingExtensionFile, true)) {
82 return matchingExtensionFile;
83 }
84 }
85
86 return sourceFile;
87 }
88
89 }