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