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