Skip to content

Commit 8949c07

Browse files
author
Alexey Semenyuk
committed
8357930: Amendment for JDK-8333664
Reviewed-by: almatvee
1 parent e579cca commit 8949c07

20 files changed

+342
-203
lines changed

src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppImageFileExtras.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626

2727
import static jdk.jpackage.internal.AppImageFile.getBooleanExtraFieldValue;
2828

29+
import jdk.jpackage.internal.model.ExternalApplication;
2930
import jdk.jpackage.internal.model.MacApplication.ExtraAppImageFileField;
3031

3132
record MacAppImageFileExtras(boolean signed, boolean appStore) {
3233

33-
MacAppImageFileExtras(AppImageFile appImageFile) {
34-
this(getBooleanExtraFieldValue(ExtraAppImageFileField.SIGNED.fieldName(), appImageFile),
35-
getBooleanExtraFieldValue(ExtraAppImageFileField.APP_STORE.fieldName(), appImageFile));
34+
MacAppImageFileExtras(ExternalApplication app) {
35+
this(getBooleanExtraFieldValue(ExtraAppImageFileField.SIGNED.fieldName(), app),
36+
getBooleanExtraFieldValue(ExtraAppImageFileField.APP_STORE.fieldName(), app));
3637
}
3738
}

src/jdk.jpackage/share/classes/jdk/jpackage/internal/AppImageFile.java

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import jdk.jpackage.internal.model.Application;
4848
import jdk.jpackage.internal.model.ApplicationLayout;
4949
import jdk.jpackage.internal.model.ConfigException;
50+
import jdk.jpackage.internal.model.ExternalApplication;
5051
import jdk.jpackage.internal.model.Launcher;
5152
import jdk.jpackage.internal.util.XmlUtils;
5253
import org.w3c.dom.Document;
@@ -55,7 +56,7 @@
5556
import org.xml.sax.SAXException;
5657

5758

58-
final class AppImageFile {
59+
final class AppImageFile implements ExternalApplication {
5960

6061
AppImageFile(Application app) {
6162
this(new ApplicationData(app));
@@ -72,47 +73,33 @@ private AppImageFile(ApplicationData app) {
7273
addLauncherInfos = app.additionalLaunchers;
7374
}
7475

75-
/**
76-
* Returns list of additional launchers configured for the application.
77-
*
78-
* Returns empty list for application without additional launchers.
79-
*/
80-
List<LauncherInfo> getAddLaunchers() {
76+
@Override
77+
public List<LauncherInfo> getAddLaunchers() {
8178
return addLauncherInfos;
8279
}
8380

84-
/**
85-
* Returns application version. Never returns null or empty value.
86-
*/
87-
String getAppVersion() {
81+
@Override
82+
public String getAppVersion() {
8883
return appVersion;
8984
}
9085

91-
/**
92-
* Returns application name. Never returns null or empty value.
93-
*/
94-
String getAppName() {
86+
@Override
87+
public String getAppName() {
9588
return launcherName;
9689
}
9790

98-
/**
99-
* Returns main application launcher name. Never returns null or empty value.
100-
*/
101-
String getLauncherName() {
91+
@Override
92+
public String getLauncherName() {
10293
return launcherName;
10394
}
10495

105-
/**
106-
* Returns main class name. Never returns null or empty value.
107-
*/
108-
String getMainClass() {
96+
@Override
97+
public String getMainClass() {
10998
return mainClass;
11099
}
111100

112-
/**
113-
* Returns additional properties. Never returns null.
114-
*/
115-
Map<String, String> getExtra() {
101+
@Override
102+
public Map<String, String> getExtra() {
116103
return extra;
117104
}
118105

@@ -223,7 +210,7 @@ static AppImageFile load(Path appImageDir, ApplicationLayout appLayout) throws C
223210
}
224211
}
225212

226-
static boolean getBooleanExtraFieldValue(String fieldId, AppImageFile appImageFile) {
213+
static boolean getBooleanExtraFieldValue(String fieldId, ExternalApplication appImageFile) {
227214
Objects.requireNonNull(fieldId);
228215
Objects.requireNonNull(appImageFile);
229216
return Optional.ofNullable(appImageFile.getExtra().get(fieldId)).map(Boolean::parseBoolean).orElse(false);
@@ -318,16 +305,6 @@ private static String xpathQueryForExtraProperties(Set<String> excludeNames) {
318305
}
319306
}
320307

321-
record LauncherInfo(String name, boolean service, Map<String, String> extra) {
322-
LauncherInfo {
323-
Objects.requireNonNull(name);
324-
Objects.requireNonNull(extra);
325-
if (name.isBlank()) {
326-
throw new IllegalArgumentException();
327-
}
328-
}
329-
}
330-
331308
private record ApplicationData(String version, String mainLauncherName, String mainLauncherMainClassName,
332309
Map<String, String> extra, List<LauncherInfo> additionalLaunchers) {
333310

src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@
3333
import java.util.Objects;
3434
import java.util.Optional;
3535
import java.util.function.Function;
36-
import jdk.jpackage.internal.AppImageFile.LauncherInfo;
3736
import jdk.jpackage.internal.model.AppImageLayout;
3837
import jdk.jpackage.internal.model.Application;
3938
import jdk.jpackage.internal.model.ApplicationLaunchers;
4039
import jdk.jpackage.internal.model.ConfigException;
40+
import jdk.jpackage.internal.model.ExternalApplication;
41+
import jdk.jpackage.internal.model.ExternalApplication.LauncherInfo;
4142
import jdk.jpackage.internal.model.Launcher;
4243
import jdk.jpackage.internal.model.LauncherStartupInfo;
4344
import jdk.jpackage.internal.model.RuntimeBuilder;
@@ -83,21 +84,21 @@ ApplicationBuilder runtimeBuilder(RuntimeBuilder v) {
8384
return this;
8485
}
8586

86-
ApplicationBuilder initFromAppImage(AppImageFile appImageFile,
87+
ApplicationBuilder initFromExternalApplication(ExternalApplication app,
8788
Function<LauncherInfo, Launcher> mapper) {
8889
if (version == null) {
89-
version = appImageFile.getAppVersion();
90+
version = app.getAppVersion();
9091
}
9192
if (name == null) {
92-
name = appImageFile.getAppName();
93+
name = app.getAppName();
9394
}
9495
runtimeBuilder = null;
9596

96-
var mainLauncherInfo = new LauncherInfo(appImageFile.getLauncherName(), false, Map.of());
97+
var mainLauncherInfo = new LauncherInfo(app.getLauncherName(), false, Map.of());
9798

9899
launchers = new ApplicationLaunchers(
99100
mapper.apply(mainLauncherInfo),
100-
appImageFile.getAddLaunchers().stream().map(mapper).toList());
101+
app.getAddLaunchers().stream().map(mapper).toList());
101102

102103
return this;
103104
}

src/jdk.jpackage/share/classes/jdk/jpackage/internal/FileAssociationGroup.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.util.function.UnaryOperator;
3535
import java.util.stream.Stream;
3636
import jdk.jpackage.internal.model.FileAssociation;
37-
import jdk.jpackage.internal.util.CollectionUtils;
3837

3938
final record FileAssociationGroup(List<FileAssociation> items) {
4039

@@ -113,12 +112,12 @@ Builder description(String v) {
113112
}
114113

115114
Builder mimeTypes(Collection<String> v) {
116-
mimeTypes = CollectionUtils.toSet(v);
115+
mimeTypes = Set.copyOf(v);
117116
return this;
118117
}
119118

120119
Builder extensions(Collection<String> v) {
121-
extensions = CollectionUtils.toSet(v);
120+
extensions = Set.copyOf(v);
122121
return this;
123122
}
124123

src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@
5757
import java.util.Map;
5858
import java.util.Optional;
5959
import java.util.function.Function;
60-
import jdk.jpackage.internal.AppImageFile.LauncherInfo;
6160
import jdk.jpackage.internal.model.Application;
6261
import jdk.jpackage.internal.model.ApplicationLaunchers;
6362
import jdk.jpackage.internal.model.ApplicationLayout;
6463
import jdk.jpackage.internal.model.ConfigException;
64+
import jdk.jpackage.internal.model.ExternalApplication.LauncherInfo;
6565
import jdk.jpackage.internal.model.Launcher;
6666
import jdk.jpackage.internal.model.PackageType;
6767
import jdk.jpackage.internal.model.RuntimeLayout;
@@ -103,7 +103,7 @@ static ApplicationBuilder createApplicationBuilder(Map<String, ? super Object> p
103103

104104
if (hasPredefinedAppImage(params)) {
105105
final var appImageFile = PREDEFINED_APP_IMAGE_FILE.fetchFrom(params);
106-
appBuilder.initFromAppImage(appImageFile, launcherInfo -> {
106+
appBuilder.initFromExternalApplication(appImageFile, launcherInfo -> {
107107
var launcherParams = mapLauncherInfo(launcherInfo);
108108
return launcherMapper.apply(mergeParams(params, launcherParams));
109109
});

src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherData.java

Lines changed: 5 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,9 @@
2424
*/
2525
package jdk.jpackage.internal;
2626

27-
import jdk.internal.util.OperatingSystem;
2827
import jdk.jpackage.internal.model.ConfigException;
2928
import java.io.File;
3029
import java.io.IOException;
31-
import java.io.Reader;
32-
import java.lang.module.ModuleDescriptor;
3330
import java.lang.module.ModuleReference;
3431
import java.nio.file.Files;
3532
import java.nio.file.InvalidPathException;
@@ -38,9 +35,7 @@
3835
import java.util.Collections;
3936
import java.util.List;
4037
import java.util.Map;
41-
import java.util.Objects;
4238
import java.util.Optional;
43-
import java.util.Properties;
4439
import java.util.Set;
4540
import java.util.function.Supplier;
4641
import java.util.jar.Attributes;
@@ -76,7 +71,7 @@ String packageName() {
7671

7772
String moduleName() {
7873
verifyIsModular(true);
79-
return moduleInfo.name;
74+
return moduleInfo.name();
8075
}
8176

8277
List<Path> modulePath() {
@@ -95,7 +90,7 @@ List<Path> classPath() {
9590

9691
String getAppVersion() {
9792
if (isModular()) {
98-
return moduleInfo.version;
93+
return moduleInfo.version().orElse(null);
9994
}
10095

10196
return null;
@@ -145,15 +140,14 @@ private static LauncherData createModular(String mainModule,
145140
launcherData.modulePath).find(moduleName).orElse(null);
146141

147142
if (moduleRef != null) {
148-
launcherData.moduleInfo = ModuleInfo.fromModuleDescriptor(
149-
moduleRef.descriptor());
143+
launcherData.moduleInfo = ModuleInfo.fromModuleReference(moduleRef);
150144
} else if (params.containsKey(PREDEFINED_RUNTIME_IMAGE.getID())) {
151145
// Failed to find module in the specified module path list and
152146
// there is external runtime given to jpackage.
153147
// Lookup module in this runtime.
154148
Path cookedRuntime = PREDEFINED_RUNTIME_IMAGE.fetchFrom(params);
155149
launcherData.moduleInfo = ModuleInfo.fromCookedRuntime(moduleName,
156-
cookedRuntime);
150+
cookedRuntime).orElse(null);
157151
}
158152

159153
if (launcherData.moduleInfo == null) {
@@ -162,7 +156,7 @@ private static LauncherData createModular(String mainModule,
162156
}
163157

164158
if (launcherData.qualifiedClassName == null) {
165-
launcherData.qualifiedClassName = launcherData.moduleInfo.mainClass;
159+
launcherData.qualifiedClassName = launcherData.moduleInfo.mainClass().orElse(null);
166160
if (launcherData.qualifiedClassName == null) {
167161
throw new ConfigException(I18N.getString("ERR_NoMainClass"), null);
168162
}
@@ -310,76 +304,4 @@ private static List<Path> getPathListParameter(String paramName,
310304
private List<Path> classPath;
311305
private List<Path> modulePath;
312306
private ModuleInfo moduleInfo;
313-
314-
private static final class ModuleInfo {
315-
String name;
316-
String version;
317-
String mainClass;
318-
319-
static ModuleInfo fromModuleDescriptor(ModuleDescriptor md) {
320-
ModuleInfo result = new ModuleInfo();
321-
result.name = md.name();
322-
result.mainClass = md.mainClass().orElse(null);
323-
324-
ModuleDescriptor.Version ver = md.version().orElse(null);
325-
if (ver != null) {
326-
result.version = ver.toString();
327-
} else {
328-
result.version = md.rawVersion().orElse(null);
329-
}
330-
331-
return result;
332-
}
333-
334-
static ModuleInfo fromCookedRuntime(String moduleName,
335-
Path cookedRuntime) {
336-
Objects.requireNonNull(moduleName);
337-
338-
// We can't extract info about version and main class of a module
339-
// linked in external runtime without running ModuleFinder in that
340-
// runtime. But this is too much work as the runtime might have been
341-
// coocked without native launchers. So just make sure the module
342-
// is linked in the runtime by simply analysing the data
343-
// of `release` file.
344-
345-
final Path releaseFile;
346-
if (!OperatingSystem.isMacOS()) {
347-
releaseFile = cookedRuntime.resolve("release");
348-
} else {
349-
// On Mac `cookedRuntime` can be runtime root or runtime home.
350-
Path runtimeHome = cookedRuntime.resolve("Contents/Home");
351-
if (!Files.isDirectory(runtimeHome)) {
352-
runtimeHome = cookedRuntime;
353-
}
354-
releaseFile = runtimeHome.resolve("release");
355-
}
356-
357-
try (Reader reader = Files.newBufferedReader(releaseFile)) {
358-
Properties props = new Properties();
359-
props.load(reader);
360-
String moduleList = props.getProperty("MODULES");
361-
if (moduleList == null) {
362-
return null;
363-
}
364-
365-
if ((moduleList.startsWith("\"") && moduleList.endsWith("\""))
366-
|| (moduleList.startsWith("\'") && moduleList.endsWith(
367-
"\'"))) {
368-
moduleList = moduleList.substring(1, moduleList.length() - 1);
369-
}
370-
371-
if (!List.of(moduleList.split("\\s+")).contains(moduleName)) {
372-
return null;
373-
}
374-
} catch (IOException|IllegalArgumentException ex) {
375-
Log.verbose(ex);
376-
return null;
377-
}
378-
379-
ModuleInfo result = new ModuleInfo();
380-
result.name = moduleName;
381-
382-
return result;
383-
}
384-
}
385307
}

src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherStartupInfoBuilder.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ LauncherStartupInfo create() {
4343

4444
LauncherStartupInfoBuilder launcherData(LauncherData launcherData) {
4545
if (launcherData.isModular()) {
46-
decorator = new ModuleStartupInfo(launcherData.moduleName(),
47-
launcherData.modulePath());
46+
decorator = new ModuleStartupInfo(launcherData.moduleName());
4847
} else {
4948
decorator = new JarStartupInfo(launcherData.mainJarName(),
5049
launcherData.isClassNameFromMainJar());
@@ -64,14 +63,12 @@ LauncherStartupInfoBuilder defaultParameters(List<String> v) {
6463
return this;
6564
}
6665

67-
private static record ModuleStartupInfo(String moduleName,
68-
List<Path> modulePath) implements UnaryOperator<LauncherStartupInfo> {
66+
private static record ModuleStartupInfo(String moduleName) implements UnaryOperator<LauncherStartupInfo> {
6967

7068
@Override
7169
public LauncherStartupInfo apply(LauncherStartupInfo base) {
7270
return LauncherModularStartupInfo.create(base,
73-
new LauncherModularStartupInfoMixin.Stub(moduleName,
74-
modulePath));
71+
new LauncherModularStartupInfoMixin.Stub(moduleName));
7572
}
7673
}
7774

0 commit comments

Comments
 (0)