< prev index next >

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

Print this page

        

@@ -34,10 +34,12 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.stream.Collectors;
+import jdk.tools.jlink.internal.ModuleSorter;
 import jdk.tools.jlink.internal.Utils;
 import jdk.tools.jlink.plugin.ResourcePool;
 import jdk.tools.jlink.plugin.ResourcePoolBuilder;
 import jdk.tools.jlink.plugin.ResourcePoolEntry;
 import jdk.tools.jlink.plugin.ResourcePoolModule;

@@ -69,11 +71,11 @@
         return PluginsResourceBundle.getDescription(NAME);
     }
 
     @Override
     public Set<State> getState() {
-        return EnumSet.of(State.FUNCTIONAL);
+        return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL);
     }
 
     @Override
     public boolean hasArguments() {
         return true;

@@ -85,10 +87,14 @@
     }
 
     @Override
     public void configure(Map<String, String> config) {
         String operation = config.get(NAME);
+        if (operation == null) {
+            return;
+        }
+
         switch (operation) {
             case "add": {
                 // leave it to open-ended! source, java_version, java_full_version
                 // can be passed via this option like:
                 //

@@ -125,16 +131,50 @@
 
     @Override
     public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
         in.transformAndCopy(Function.identity(), out);
 
+        Optional<ResourcePoolModule> javaBase = in.moduleView().findModule("java.base");
+        javaBase.ifPresent(mod -> {
+            // fill release information available from transformed "java.base" module!
+            ModuleDescriptor desc = mod.descriptor();
+            desc.osName().ifPresent(s -> {
+                release.put("OS_NAME", quote(s));
+            });
+            desc.osVersion().ifPresent(s -> release.put("OS_VERSION", quote(s)));
+            desc.osArch().ifPresent(s -> release.put("OS_ARCH", quote(s)));
+            desc.version().ifPresent(s -> release.put("JAVA_VERSION",
+                    quote(parseVersion(s.toString()))));
+            desc.version().ifPresent(s -> release.put("JAVA_FULL_VERSION",
+                    quote(s.toString())));
+        });
+
+        // put topological sorted module names separated by space
+        release.put("MODULES",  new ModuleSorter(in.moduleView())
+                .sorted().map(ResourcePoolModule::name)
+                .collect(Collectors.joining(" ", "\"", "\"")));
+
         // create a TOP level ResourcePoolEntry for "release" file.
         out.add(ResourcePoolEntry.create("/java.base/release",
             ResourcePoolEntry.Type.TOP, releaseFileContent()));
         return out.build();
     }
 
+    // Parse version string and return a string that includes only version part
+    // leaving "pre", "build" information. See also: java.lang.Runtime.Version.
+    private static String parseVersion(String str) {
+        return Runtime.Version.parse(str).
+            version().
+            stream().
+            map(Object::toString).
+            collect(Collectors.joining("."));
+    }
+
+    private static String quote(String str) {
+        return "\"" + str + "\"";
+    }
+
     private byte[] releaseFileContent() {
         Properties props = new Properties();
         props.putAll(release);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try {
< prev index next >