From 2abb94814d7338b34032a0e241c22fc60b43a822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kohlschu=CC=88tter?= Date: Mon, 25 Sep 2023 20:33:47 +0200 Subject: [PATCH] Do not try to translate classes in META-INF/versions In a multirelease-jar environment, there could be classes under META-INF/versions, which retrolambda would try to translate. As per definition, these are Java classes newer than Java 1.8, so they shouldn't be processed at all, especially since it is expected that there is at least some version (hopefully 1.8 or older) of that class in the path that is not prefixed by META-INF/versions. Extend FilteringFileVisitor to never visit /META-INF/versions, and modify FilteringFileVisitor so it's usable in all cases, even when no other filtering is required. --- .../main/java/net/orfjackal/retrolambda/Retrolambda.java | 4 +--- .../orfjackal/retrolambda/files/FilteringFileVisitor.java | 7 +++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java index 07d292f0..c72abd29 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java @@ -103,9 +103,7 @@ protected void visitResource(Path relativePath, byte[] content) throws IOExcepti } static void visitFiles(Path inputDir, List includedFiles, FileVisitor visitor) throws IOException { - if (includedFiles != null) { - visitor = new FilteringFileVisitor(includedFiles, visitor); - } + visitor = new FilteringFileVisitor(includedFiles, visitor); Files.walkFileTree(inputDir, visitor); } diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/files/FilteringFileVisitor.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/files/FilteringFileVisitor.java index b4733ada..1c464653 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/files/FilteringFileVisitor.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/files/FilteringFileVisitor.java @@ -15,7 +15,7 @@ public class FilteringFileVisitor implements FileVisitor { private final FileVisitor target; public FilteringFileVisitor(Collection fileFilter, FileVisitor target) { - this.fileFilter = new HashSet<>(fileFilter); + this.fileFilter = fileFilter == null ? null : new HashSet<>(fileFilter); this.target = target; } @@ -26,12 +26,15 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (dir.toString().endsWith("/META-INF/versions")) { + return FileVisitResult.SKIP_SUBTREE; + } return target.preVisitDirectory(dir, attrs); } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (fileFilter.contains(file)) { + if (fileFilter == null || fileFilter.contains(file)) { return target.visitFile(file, attrs); } else { return FileVisitResult.CONTINUE;