< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java

Print this page
rev 47453 : imported patch jdk-new-asm-update.patch


  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);


< prev index next >