41 import java.lang.module.ResolvedModule;
42 import java.net.URI;
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.Collections;
46 import java.util.EnumSet;
47 import java.util.HashMap;
48 import java.util.HashSet;
49 import java.util.LinkedHashMap;
50 import java.util.List;
51 import java.util.Map;
52 import java.util.Objects;
53 import java.util.Optional;
54 import java.util.Set;
55 import java.util.TreeSet;
56 import java.util.function.IntSupplier;
57 import java.util.function.Supplier;
58 import java.util.stream.Collectors;
59
60 import jdk.internal.module.Checks;
61 import jdk.internal.module.ClassFileAttributes;
62 import jdk.internal.module.ClassFileConstants;
63 import jdk.internal.module.DefaultRoots;
64 import jdk.internal.module.IllegalAccessMaps;
65 import jdk.internal.module.ModuleHashes;
66 import jdk.internal.module.ModuleInfo.Attributes;
67 import jdk.internal.module.ModuleInfoExtender;
68 import jdk.internal.module.ModuleReferenceImpl;
69 import jdk.internal.module.ModuleResolution;
70 import jdk.internal.module.ModuleTarget;
71 import jdk.internal.org.objectweb.asm.Attribute;
72 import jdk.internal.org.objectweb.asm.ClassReader;
73 import jdk.internal.org.objectweb.asm.ClassVisitor;
74 import jdk.internal.org.objectweb.asm.ClassWriter;
75 import jdk.internal.org.objectweb.asm.MethodVisitor;
76 import jdk.internal.org.objectweb.asm.Opcodes;
77
78 import static jdk.internal.org.objectweb.asm.Opcodes.*;
79
80 import jdk.tools.jlink.internal.ModuleSorter;
81 import jdk.tools.jlink.plugin.Plugin;
82 import jdk.tools.jlink.plugin.PluginException;
83 import jdk.tools.jlink.plugin.ResourcePool;
84 import jdk.tools.jlink.plugin.ResourcePoolBuilder;
85 import jdk.tools.jlink.plugin.ResourcePoolEntry;
86
87 /**
88 * Jlink plugin to reconstitute module descriptors and other attributes for system
89 * modules. The plugin generates implementations of SystemModules to avoid parsing
90 * module-info.class files at startup. It also generates SystemModulesMap to return
91 * the SystemModules implementation for a specific initial module.
92 *
93 * As a side effect, the plugin adds the ModulePackages class file attribute to the
94 * module-info.class files that don't have the attribute.
95 *
96 * @see jdk.internal.module.SystemModuleFinders
97 * @see jdk.internal.module.SystemModules
418 */
419 void validatePackages() {
420 Set<String> nonExistPackages = new TreeSet<>();
421 descriptor.exports().stream()
422 .map(Exports::source)
423 .filter(pn -> !packages.contains(pn))
424 .forEach(nonExistPackages::add);
425
426 descriptor.opens().stream()
427 .map(Opens::source)
428 .filter(pn -> !packages.contains(pn))
429 .forEach(nonExistPackages::add);
430
431 if (!nonExistPackages.isEmpty()) {
432 throw new PluginException("Packages that are exported or open in "
433 + descriptor.name() + " are not present: " + nonExistPackages);
434 }
435 }
436
437 boolean hasModulePackages() throws IOException {
438 Set<String> attrTypes = new HashSet<>();
439 ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) {
440 @Override
441 public void visitAttribute(Attribute attr) {
442 attrTypes.add(attr.type);
443 }
444 };
445
446 // prototype of attributes that should be parsed
447 Attribute[] attrs = new Attribute[] {
448 new ClassFileAttributes.ModulePackagesAttribute()
449 };
450
451 try (InputStream in = getInputStream()) {
452 // parse module-info.class
453 ClassReader cr = new ClassReader(in);
454 cr.accept(cv, attrs, 0);
455 return attrTypes.contains(ClassFileConstants.MODULE_PACKAGES);
456 }
457 }
458
459 /**
460 * Returns true if module-info.class should be rewritten to add the
461 * ModulePackages attribute.
462 */
463 boolean shouldRewrite() {
464 return addModulePackages;
465 }
466
467 /**
468 * Returns the bytes for the (possibly updated) module-info.class.
469 */
470 byte[] getBytes() throws IOException {
471 try (InputStream in = getInputStream()) {
472 if (shouldRewrite()) {
473 ModuleInfoRewriter rewriter = new ModuleInfoRewriter(in);
474 if (addModulePackages) {
475 rewriter.addModulePackages(packages);
|
41 import java.lang.module.ResolvedModule;
42 import java.net.URI;
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.Collections;
46 import java.util.EnumSet;
47 import java.util.HashMap;
48 import java.util.HashSet;
49 import java.util.LinkedHashMap;
50 import java.util.List;
51 import java.util.Map;
52 import java.util.Objects;
53 import java.util.Optional;
54 import java.util.Set;
55 import java.util.TreeSet;
56 import java.util.function.IntSupplier;
57 import java.util.function.Supplier;
58 import java.util.stream.Collectors;
59
60 import jdk.internal.module.Checks;
61 import jdk.internal.module.DefaultRoots;
62 import jdk.internal.module.IllegalAccessMaps;
63 import jdk.internal.module.ModuleHashes;
64 import jdk.internal.module.ModuleInfo.Attributes;
65 import jdk.internal.module.ModuleInfoExtender;
66 import jdk.internal.module.ModuleReferenceImpl;
67 import jdk.internal.module.ModuleResolution;
68 import jdk.internal.module.ModuleTarget;
69
70 import jdk.internal.org.objectweb.asm.ClassReader;
71 import jdk.internal.org.objectweb.asm.ClassVisitor;
72 import jdk.internal.org.objectweb.asm.ClassWriter;
73 import jdk.internal.org.objectweb.asm.MethodVisitor;
74 import jdk.internal.org.objectweb.asm.ModuleVisitor;
75 import jdk.internal.org.objectweb.asm.Opcodes;
76 import static jdk.internal.org.objectweb.asm.Opcodes.*;
77
78 import jdk.tools.jlink.internal.ModuleSorter;
79 import jdk.tools.jlink.plugin.Plugin;
80 import jdk.tools.jlink.plugin.PluginException;
81 import jdk.tools.jlink.plugin.ResourcePool;
82 import jdk.tools.jlink.plugin.ResourcePoolBuilder;
83 import jdk.tools.jlink.plugin.ResourcePoolEntry;
84
85 /**
86 * Jlink plugin to reconstitute module descriptors and other attributes for system
87 * modules. The plugin generates implementations of SystemModules to avoid parsing
88 * module-info.class files at startup. It also generates SystemModulesMap to return
89 * the SystemModules implementation for a specific initial module.
90 *
91 * As a side effect, the plugin adds the ModulePackages class file attribute to the
92 * module-info.class files that don't have the attribute.
93 *
94 * @see jdk.internal.module.SystemModuleFinders
95 * @see jdk.internal.module.SystemModules
416 */
417 void validatePackages() {
418 Set<String> nonExistPackages = new TreeSet<>();
419 descriptor.exports().stream()
420 .map(Exports::source)
421 .filter(pn -> !packages.contains(pn))
422 .forEach(nonExistPackages::add);
423
424 descriptor.opens().stream()
425 .map(Opens::source)
426 .filter(pn -> !packages.contains(pn))
427 .forEach(nonExistPackages::add);
428
429 if (!nonExistPackages.isEmpty()) {
430 throw new PluginException("Packages that are exported or open in "
431 + descriptor.name() + " are not present: " + nonExistPackages);
432 }
433 }
434
435 boolean hasModulePackages() throws IOException {
436 Set<String> packages = new HashSet<>();
437 ClassVisitor cv = new ClassVisitor(Opcodes.ASM6) {
438 @Override
439 public ModuleVisitor visitModule(String name,
440 int flags,
441 String version) {
442 return new ModuleVisitor(Opcodes.ASM6) {
443 public void visitPackage(String pn) {
444 packages.add(pn);
445 }
446 };
447 }
448 };
449
450 try (InputStream in = getInputStream()) {
451 // parse module-info.class
452 ClassReader cr = new ClassReader(in);
453 cr.accept(cv, 0);
454 return packages.size() > 0;
455 }
456 }
457
458 /**
459 * Returns true if module-info.class should be rewritten to add the
460 * ModulePackages attribute.
461 */
462 boolean shouldRewrite() {
463 return addModulePackages;
464 }
465
466 /**
467 * Returns the bytes for the (possibly updated) module-info.class.
468 */
469 byte[] getBytes() throws IOException {
470 try (InputStream in = getInputStream()) {
471 if (shouldRewrite()) {
472 ModuleInfoRewriter rewriter = new ModuleInfoRewriter(in);
473 if (addModulePackages) {
474 rewriter.addModulePackages(packages);
|