View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }