|
1 | 1 | /* |
2 | | - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | 4 | * |
5 | 5 | * This code is free software; you can redistribute it and/or modify it |
|
26 | 26 |
|
27 | 27 | import java.io.IOException; |
28 | 28 | import java.io.PrintWriter; |
| 29 | +import java.lang.classfile.ClassModel; |
29 | 30 | import java.lang.constant.ClassDesc; |
30 | 31 | import java.lang.module.Configuration; |
31 | 32 | import java.lang.module.ModuleFinder; |
32 | 33 | import java.lang.module.ResolvedModule; |
33 | | -import java.net.URI; |
34 | 34 | import java.nio.file.Files; |
35 | 35 | import java.nio.file.Path; |
36 | 36 | import java.util.*; |
37 | 37 | import java.util.jar.JarFile; |
38 | 38 | import java.util.jar.Manifest; |
39 | 39 | import java.util.stream.Collectors; |
| 40 | +import java.util.stream.Stream; |
40 | 41 | import java.util.zip.ZipFile; |
41 | 42 |
|
42 | 43 | class JNativeScanTask { |
@@ -76,11 +77,26 @@ public void run() throws JNativeScanFatalError { |
76 | 77 | Set<String> errors = new LinkedHashSet<>(); |
77 | 78 | Diagnostics diagnostics = (context, error) -> |
78 | 79 | errors.add("Error while processing method: " + context + ": " + error.getMessage()); |
79 | | - SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods; |
80 | | - try(ClassResolver classesToScan = ClassResolver.forClassFileSources(toScan, version); |
81 | | - ClassResolver systemClassResolver = ClassResolver.forSystemModules(version)) { |
82 | | - NativeMethodFinder finder = NativeMethodFinder.create(diagnostics, classesToScan, systemClassResolver); |
83 | | - allRestrictedMethods = finder.findAll(); |
| 80 | + SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods |
| 81 | + = new TreeMap<>(Comparator.comparing(ClassFileSource::path)); |
| 82 | + try(SystemClassResolver systemClassResolver = SystemClassResolver.forRuntimeVersion(version)) { |
| 83 | + NativeMethodFinder finder = NativeMethodFinder.create(diagnostics, systemClassResolver); |
| 84 | + |
| 85 | + for (ClassFileSource source : toScan) { |
| 86 | + SortedMap<ClassDesc, List<RestrictedUse>> perClass |
| 87 | + = new TreeMap<>(Comparator.comparing(JNativeScanTask::qualName)); |
| 88 | + try (Stream<ClassModel> stream = source.classModels()) { |
| 89 | + stream.forEach(classModel -> { |
| 90 | + List<RestrictedUse> restrictedUses = finder.find(classModel); |
| 91 | + if (!restrictedUses.isEmpty()) { |
| 92 | + perClass.put(classModel.thisClass().asSymbol(), restrictedUses); |
| 93 | + } |
| 94 | + }); |
| 95 | + } |
| 96 | + if (!perClass.isEmpty()) { |
| 97 | + allRestrictedMethods.put(source, perClass); |
| 98 | + } |
| 99 | + } |
84 | 100 | } catch (IOException e) { |
85 | 101 | throw new RuntimeException(e); |
86 | 102 | } |
@@ -115,7 +131,7 @@ private List<ClassFileSource> findAllClassPathJars() throws JNativeScanFatalErro |
115 | 131 | jarsToScan.offer(otherJar); |
116 | 132 | } |
117 | 133 | } |
118 | | - result.add(new ClassFileSource.ClassPathJar(jar)); |
| 134 | + result.add(new ClassFileSource.ClassPathJar(jar, version)); |
119 | 135 | } |
120 | 136 | } else if (Files.isDirectory(path)) { |
121 | 137 | result.add(new ClassFileSource.ClassPathDirectory(path)); |
|
0 commit comments