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.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  }