package jdk.jpackage.internal;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import jdk.jpackage.internal.Arguments.CLIOptions;
import static jdk.jpackage.internal.StandardBundlerParam.LAUNCHER_DATA;
import static jdk.jpackage.internal.StandardBundlerParam.APP_NAME;
class AddLauncherArguments {
private final String name;
private final String filename;
private Map<String, String> allArgs;
private Map<String, ? super Object> bundleParams;
AddLauncherArguments(String name, String filename) {
this.name = name;
this.filename = filename;
}
private void initLauncherMap() {
if (bundleParams != null) {
return;
}
allArgs = Arguments.getPropertiesFromFile(filename);
allArgs.put(CLIOptions.NAME.getId(), name);
bundleParams = new HashMap<>();
String mainJar = getOptionValue(CLIOptions.MAIN_JAR);
String mainClass = getOptionValue(CLIOptions.APPCLASS);
String module = getOptionValue(CLIOptions.MODULE);
if (module != null && mainClass != null) {
Arguments.putUnlessNull(bundleParams, CLIOptions.MODULE.getId(),
module + "/" + mainClass);
} else if (module != null) {
Arguments.putUnlessNull(bundleParams, CLIOptions.MODULE.getId(),
module);
} else {
Arguments.putUnlessNull(bundleParams, CLIOptions.MAIN_JAR.getId(),
mainJar);
Arguments.putUnlessNull(bundleParams, CLIOptions.APPCLASS.getId(),
mainClass);
}
Arguments.putUnlessNull(bundleParams, CLIOptions.NAME.getId(),
getOptionValue(CLIOptions.NAME));
Arguments.putUnlessNull(bundleParams, CLIOptions.VERSION.getId(),
getOptionValue(CLIOptions.VERSION));
Arguments.putUnlessNull(bundleParams, CLIOptions.RELEASE.getId(),
getOptionValue(CLIOptions.RELEASE));
Arguments.putUnlessNull(bundleParams, CLIOptions.LINUX_CATEGORY.getId(),
getOptionValue(CLIOptions.LINUX_CATEGORY));
Arguments.putUnlessNull(bundleParams,
CLIOptions.WIN_CONSOLE_HINT.getId(),
getOptionValue(CLIOptions.WIN_CONSOLE_HINT));
String value = getOptionValue(CLIOptions.ICON);
Arguments.putUnlessNull(bundleParams, CLIOptions.ICON.getId(),
(value == null) ? null : Path.of(value));
if (allArgs.containsKey(CLIOptions.ARGUMENTS.getId())) {
String argumentStr = getOptionValue(CLIOptions.ARGUMENTS);
bundleParams.put(CLIOptions.ARGUMENTS.getId(),
Arguments.getArgumentList(argumentStr));
}
if (allArgs.containsKey(CLIOptions.JAVA_OPTIONS.getId())) {
String jvmargsStr = getOptionValue(CLIOptions.JAVA_OPTIONS);
bundleParams.put(CLIOptions.JAVA_OPTIONS.getId(),
Arguments.getArgumentList(jvmargsStr));
}
}
private String getOptionValue(CLIOptions option) {
if (option == null || allArgs == null) {
return null;
}
String id = option.getId();
if (allArgs.containsKey(id)) {
return allArgs.get(id);
}
return null;
}
Map<String, ? super Object> getLauncherMap() {
initLauncherMap();
return bundleParams;
}
static Map<String, ? super Object> merge(
Map<String, ? super Object> original,
Map<String, ? super Object> additional, String... exclude) {
Map<String, ? super Object> tmp = new HashMap<>(original);
List.of(exclude).forEach(tmp::remove);
tmp.remove(LAUNCHER_DATA.getID());
tmp.remove(APP_NAME.getID());
if (additional.containsKey(CLIOptions.MODULE.getId())) {
tmp.remove(CLIOptions.MAIN_JAR.getId());
tmp.remove(CLIOptions.APPCLASS.getId());
} else if (additional.containsKey(CLIOptions.MAIN_JAR.getId())) {
tmp.remove(CLIOptions.MODULE.getId());
}
if (additional.containsKey(CLIOptions.ARGUMENTS.getId())) {
tmp.remove(CLIOptions.ARGUMENTS.getId());
}
if (additional.containsKey(CLIOptions.JAVA_OPTIONS.getId())) {
tmp.remove(CLIOptions.JAVA_OPTIONS.getId());
}
tmp.putAll(additional);
return tmp;
}
}