1
2
3
4
5 package mockit.coverage.reporting;
6
7 import edu.umd.cs.findbugs.annotations.NonNull;
8
9 import java.io.BufferedInputStream;
10 import java.io.BufferedOutputStream;
11 import java.io.File;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.OutputStream;
15 import java.nio.file.Files;
16 import java.nio.file.Path;
17 import java.security.CodeSource;
18
19 import mockit.internal.util.Utilities;
20
21 final class StaticFiles {
22 @NonNull
23 private final String outputDir;
24 private long lastModifiedTimeOfCoverageJar;
25
26 StaticFiles(@NonNull String outputDir) {
27 this.outputDir = outputDir;
28 }
29
30 void copyToOutputDir(boolean withSourceFilePages) throws IOException {
31 copyFile("index.css");
32 copyFile("coverage.js");
33 copyFile("logo.png");
34 copyFile("package.png");
35 copyFile("class.png");
36 copyFile("abstractClass.png");
37 copyFile("interface.png");
38 copyFile("annotation.png");
39 copyFile("exception.png");
40 copyFile("enum.png");
41
42 if (withSourceFilePages) {
43 copyFile("source.css");
44 copyFile("prettify.js");
45 }
46 }
47
48 private void copyFile(@NonNull String fileName) throws IOException {
49 File outputFile = Path.of(outputDir, fileName).toFile();
50
51 if (outputFile.exists() && outputFile.lastModified() > getLastModifiedTimeOfCoverageJar()) {
52 return;
53 }
54
55 try (OutputStream output = new BufferedOutputStream(Files.newOutputStream(outputFile.toPath()));
56 InputStream input = new BufferedInputStream(StaticFiles.class.getResourceAsStream(fileName))) {
57 int b;
58
59 while ((b = input.read()) != -1) {
60 output.write(b);
61 }
62 }
63 }
64
65 private long getLastModifiedTimeOfCoverageJar() {
66 if (lastModifiedTimeOfCoverageJar == 0) {
67 CodeSource codeSource = getClass().getProtectionDomain().getCodeSource();
68
69 if (codeSource == null) {
70 lastModifiedTimeOfCoverageJar = -1;
71 } else {
72 String pathToThisJar = Utilities.getClassFileLocationPath(codeSource);
73 lastModifiedTimeOfCoverageJar = Path.of(pathToThisJar).toFile().lastModified();
74 }
75 }
76
77 return lastModifiedTimeOfCoverageJar;
78 }
79 }