< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java

Print this page

        

@@ -98,14 +98,15 @@
 import jdk.internal.joptsimple.OptionParser;
 import jdk.internal.joptsimple.OptionSet;
 import jdk.internal.joptsimple.OptionSpec;
 import jdk.internal.joptsimple.ValueConverter;
 import jdk.internal.loader.ResourceHelper;
-import jdk.internal.misc.JavaLangModuleAccess;
-import jdk.internal.misc.SharedSecrets;
 import jdk.internal.module.ModuleHashes;
+import jdk.internal.module.ModuleInfo;
 import jdk.internal.module.ModuleInfoExtender;
+import jdk.internal.module.ModulePath;
+import jdk.internal.module.ModuleResolution;
 import jdk.tools.jlink.internal.Utils;
 
 import static java.util.stream.Collectors.joining;
 
 /**

@@ -174,10 +175,11 @@
         String mainClass;
         String osName;
         String osArch;
         String osVersion;
         Pattern modulesToHash;
+        ModuleResolution moduleResolution;
         boolean dryrun;
         List<PathMatcher> excludes;
     }
 
     public int run(String[] args) {

@@ -253,12 +255,12 @@
     }
 
     private boolean describe() throws IOException {
         try (JmodFile jf = new JmodFile(options.jmodFile)) {
             try (InputStream in = jf.getInputStream(Section.CLASSES, MODULE_INFO)) {
-                ModuleDescriptor md = ModuleDescriptor.read(in);
-                printModuleDescriptor(md);
+                ModuleInfo.Attributes attrs = ModuleInfo.read(in, null);
+                printModuleDescriptor(attrs.descriptor(), attrs.recordedHashes());
                 return true;
             } catch (IOException e) {
                 throw new CommandException("err.module.descriptor.not.found");
             }
         }

@@ -268,13 +270,11 @@
         if (c.isEmpty()) { return ""; }
         return c.stream().map(e -> e.toString().toLowerCase(Locale.ROOT))
                   .collect(joining(" "));
     }
 
-    private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
-
-    private void printModuleDescriptor(ModuleDescriptor md)
+    private void printModuleDescriptor(ModuleDescriptor md, ModuleHashes hashes)
         throws IOException
     {
         StringBuilder sb = new StringBuilder();
         sb.append("\n").append(md.toNameAndVersion());
 

@@ -316,19 +316,28 @@
 
         md.osArch().ifPresent(v -> sb.append("\n  operating-system-architecture " + v));
 
         md.osVersion().ifPresent(v -> sb.append("\n  operating-system-version " + v));
 
-        JLMA.hashes(md).ifPresent(
-            hashes -> hashes.names().stream().sorted().forEach(
+        if (hashes != null) {
+            hashes.names().stream().sorted().forEach(
                 mod -> sb.append("\n  hashes ").append(mod).append(" ")
                          .append(hashes.algorithm()).append(" ")
-                         .append(hashes.hashFor(mod))));
+                             .append(toHex(hashes.hashFor(mod))));
+        }
 
         out.println(sb.toString());
     }
 
+    private String toHex(byte[] ba) {
+        StringBuilder sb = new StringBuilder(ba.length);
+        for (byte b: ba) {
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
     private boolean create() throws IOException {
         JmodFileWriter jmod = new JmodFileWriter();
 
         // create jmod with temporary name to avoid it being examined
         // when scanning the module path

@@ -365,10 +374,11 @@
         final String osName = options.osName;
         final String osArch = options.osArch;
         final String osVersion = options.osVersion;
         final List<PathMatcher> excludes = options.excludes;
         final Hasher hasher = hasher();
+        final ModuleResolution moduleResolution = options.moduleResolution;
 
         JmodFileWriter() { }
 
         /**
          * Writes the jmod to the given output stream.

@@ -473,10 +483,14 @@
                     } else {
                         warning("warn.no.module.hashes", descriptor.name());
                     }
                 }
 
+                if (moduleResolution != null && moduleResolution.value() != 0) {
+                    extender.moduleResolution(moduleResolution);
+                }
+
                 // write the (possibly extended or modified) module-info.class
                 out.writeEntry(extender.toByteArray(), Section.CLASSES, MODULE_INFO);
             }
         }
 

@@ -501,16 +515,16 @@
                 try (InputStream in = miSupplier.get()) {
                     descriptor = ModuleDescriptor.read(in);
                 }
 
                 URI uri = options.jmodFile.toUri();
-                ModuleReference mref = new ModuleReference(descriptor, uri, new Supplier<>() {
+                ModuleReference mref = new ModuleReference(descriptor, uri) {
                     @Override
-                    public ModuleReader get() {
+                    public ModuleReader open() {
                         throw new UnsupportedOperationException();
                     }
-                });
+                };
 
                 // compose a module finder with the module path and also
                 // a module finder that can find the jmod file being created
                 ModuleFinder finder = ModuleFinder.compose(options.moduleFinder,
                     new ModuleFinder() {

@@ -1078,10 +1092,32 @@
         @Override public Class<Version> valueType() { return Version.class; }
 
         @Override public String valuePattern() { return "module-version"; }
     }
 
+    static class WarnIfResolvedReasonConverter
+        implements ValueConverter<ModuleResolution>
+    {
+        @Override
+        public ModuleResolution convert(String value) {
+            if (value.equals("deprecated"))
+                return (new ModuleResolution(0)).withDeprecated();
+            else if (value.equals("deprecated-for-removal"))
+                return (new ModuleResolution(0)).withDeprecatedForRemoval();
+            else if (value.equals("incubating"))
+                return (new ModuleResolution(0)).withIncubating();
+            else
+                throw new CommandException("err.bad.WarnIfResolvedReason", value);
+        }
+
+        @Override public Class<ModuleResolution> valueType() {
+            return ModuleResolution.class;
+        }
+
+        @Override public String valuePattern() { return "reason"; }
+    }
+
     static class PatternConverter implements ValueConverter<Pattern> {
         @Override
         public Pattern convert(String value) {
             try {
                 if (value.startsWith("regex:")) {

@@ -1127,10 +1163,15 @@
 
         @Override
         public String format(Map<String, ? extends OptionDescriptor> options) {
             Map<String, OptionDescriptor> all = new HashMap<>();
             all.putAll(options);
+
+            // hidden options
+            all.remove("do-not-resolve-by-default");
+            all.remove("warn-if-resolved");
+
             all.put(CMD_FILENAME, new OptionDescriptor() {
                 @Override
                 public Collection<String> options() {
                     List<String> ret = new ArrayList<>();
                     ret.add(CMD_FILENAME);

@@ -1268,10 +1309,18 @@
         OptionSpec<String> osVersion
                 = parser.accepts("os-version", getMessage("main.opt.os-version"))
                         .withRequiredArg()
                         .describedAs(getMessage("main.opt.os-version.arg"));
 
+        OptionSpec<Void> doNotResolveByDefault
+                = parser.accepts("do-not-resolve-by-default");
+
+        OptionSpec<ModuleResolution> warnIfResolved
+                = parser.accepts("warn-if-resolved")
+                        .withRequiredArg()
+                        .withValuesConvertedBy(new WarnIfResolvedReasonConverter());
+
         OptionSpec<Void> version
                 = parser.accepts("version", getMessage("main.opt.version"));
 
         NonOptionArgumentSpec<String> nonOptions
                 = parser.nonOptions();

@@ -1313,11 +1362,11 @@
                 options.headerFiles = opts.valuesOf(headerFiles);
             if (opts.has(manPages))
                 options.manPages = opts.valuesOf(manPages);
             if (opts.has(modulePath)) {
                 Path[] dirs = opts.valuesOf(modulePath).toArray(new Path[0]);
-                options.moduleFinder = JLMA.newModulePath(Runtime.version(), true, dirs);
+                options.moduleFinder = new ModulePath(Runtime.version(), true, dirs);
             }
             if (opts.has(moduleVersion))
                 options.moduleVersion = opts.valueOf(moduleVersion);
             if (opts.has(mainClass))
                 options.mainClass = opts.valueOf(mainClass);

@@ -1325,10 +1374,17 @@
                 options.osName = opts.valueOf(osName);
             if (opts.has(osArch))
                 options.osArch = opts.valueOf(osArch);
             if (opts.has(osVersion))
                 options.osVersion = opts.valueOf(osVersion);
+            if (opts.has(warnIfResolved))
+                options.moduleResolution = opts.valueOf(warnIfResolved);
+            if (opts.has(doNotResolveByDefault)) {
+                if (options.moduleResolution == null)
+                    options.moduleResolution = new ModuleResolution(0);
+                options.moduleResolution = options.moduleResolution.withDoNotResolveByDefault();
+            }
             if (opts.has(hashModules)) {
                 options.modulesToHash = opts.valueOf(hashModules);
                 // if storing hashes then the module path is required
                 if (options.moduleFinder == null)
                     throw new CommandException("err.modulepath.must.be.specified")
< prev index next >