|
22 | 22 | import org.gradle.api.tasks.Optional; |
23 | 23 | import org.gradle.api.tasks.OutputFile; |
24 | 24 | import org.gradle.api.tasks.TaskAction; |
| 25 | +import org.jetbrains.annotations.NotNull; |
25 | 26 | import org.objectweb.asm.ClassReader; |
26 | 27 | import org.objectweb.asm.ClassVisitor; |
27 | 28 | import org.objectweb.asm.ModuleVisitor; |
|
32 | 33 | import java.io.IOException; |
33 | 34 | import java.io.InputStream; |
34 | 35 | import java.nio.charset.StandardCharsets; |
| 36 | +import java.nio.file.FileVisitResult; |
35 | 37 | import java.nio.file.Files; |
36 | 38 | import java.nio.file.Path; |
| 39 | +import java.nio.file.SimpleFileVisitor; |
| 40 | +import java.nio.file.attribute.BasicFileAttributes; |
37 | 41 | import java.security.CodeSource; |
38 | 42 | import java.util.ArrayList; |
39 | 43 | import java.util.Arrays; |
|
45 | 49 | import java.util.regex.Pattern; |
46 | 50 | import java.util.zip.ZipEntry; |
47 | 51 |
|
| 52 | +import static java.nio.file.FileVisitResult.CONTINUE; |
| 53 | +import static java.nio.file.FileVisitResult.TERMINATE; |
| 54 | + |
48 | 55 | /** |
49 | 56 | * This task generates a file with a class to module mapping |
50 | 57 | * used to imitate modular behavior during unit tests so |
@@ -257,22 +264,23 @@ private void extractLocationsFromDirectory(File dir, List<Location> locations) t |
257 | 264 | * look through the directory to find the first unique class that isn't |
258 | 265 | * module-info.class (which may not be unique) and avoid anonymous classes |
259 | 266 | */ |
260 | | - private String extractClassNameFromDirectory(File dir) { |
261 | | - List<File> files = new ArrayList<>(List.of(dir)); |
262 | | - while (files.isEmpty() == false) { |
263 | | - File find = files.removeFirst(); |
264 | | - if (find.exists()) { |
265 | | - if (find.getName().endsWith(".class") |
266 | | - && find.getName().equals("module-info.class") == false |
267 | | - && find.getName().contains("$") == false) { |
268 | | - return find.getAbsolutePath().substring(dir.getAbsolutePath().length() + 1); |
269 | | - } else if (find.isDirectory()) { |
270 | | - files.addAll(Arrays.asList(find.listFiles())); |
| 267 | + private String extractClassNameFromDirectory(File dir) throws IOException { |
| 268 | + var visitor = new SimpleFileVisitor<Path>() { |
| 269 | + String result = null; |
| 270 | + |
| 271 | + @Override |
| 272 | + public @NotNull FileVisitResult visitFile(@NotNull Path candidate, @NotNull BasicFileAttributes attrs) { |
| 273 | + String name = candidate.getFileName().toString(); // Just the part after the last dir separator |
| 274 | + if (name.endsWith(".class") && (name.equals("module-info.class") || name.contains("$")) == false) { |
| 275 | + result = candidate.toAbsolutePath().toString().substring(dir.getAbsolutePath().length() + 1); |
| 276 | + return TERMINATE; |
| 277 | + } else { |
| 278 | + return CONTINUE; |
271 | 279 | } |
272 | 280 | } |
273 | | - |
274 | | - } |
275 | | - return null; |
| 281 | + }; |
| 282 | + Files.walkFileTree(dir.toPath(), visitor); |
| 283 | + return visitor.result; |
276 | 284 | } |
277 | 285 |
|
278 | 286 | /** |
|
0 commit comments