in src/java/io/bazel/rulesscala/coverage/instrumenter/JacocoInstrumenter.java [96:144]
private SimpleFileVisitor createInstrumenterVisitor(
Instrumenter jacoco, Path instrumentedClassesDirectory, JarCreator jarCreator) {
return new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path inPath, BasicFileAttributes attrs) {
try {
return actuallyVisitFile(inPath, attrs);
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
Objects.requireNonNull(dir);
Objects.requireNonNull(attrs);
// Adding non-root directories to the jar
if (!dir.toString().equals("/")) {
jarCreator.addEntry(dir.toString(), dir);
}
return FileVisitResult.CONTINUE;
}
private FileVisitResult actuallyVisitFile(Path inPath, BasicFileAttributes attrs)
throws Exception {
if (inPath.toString().endsWith(".class")) {
// Create a tempPath (that is independent of the name), to avoid "File name too long"
// exceptions.
Path tempPath =
Files.createTempFile(instrumentedClassesDirectory, "instrumented", ".jar");
Files.delete(tempPath);
try (BufferedInputStream inStream =
new BufferedInputStream(Files.newInputStream(inPath));
BufferedOutputStream outStream =
new BufferedOutputStream(
Files.newOutputStream(tempPath, StandardOpenOption.CREATE_NEW)); ) {
jacoco.instrument(inStream, outStream, inPath.toString());
}
jarCreator.addEntry(inPath.toString(), tempPath);
jarCreator.addEntry(inPath.toString() + ".uninstrumented", inPath);
} else {
jarCreator.addEntry(inPath.toString(), inPath);
}
return FileVisitResult.CONTINUE;
}
};
}