package jdk.incubator.jpackage.internal;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Map;
import java.util.Optional;
import static jdk.incubator.jpackage.internal.MacBaseInstallerBundler.SIGNING_KEYCHAIN;
import static jdk.incubator.jpackage.internal.MacBaseInstallerBundler.SIGNING_KEY_USER;
import static jdk.incubator.jpackage.internal.StandardBundlerParam.MAIN_CLASS;
import static jdk.incubator.jpackage.internal.StandardBundlerParam.VERBOSE;
import static jdk.incubator.jpackage.internal.StandardBundlerParam.VERSION;
public class MacAppBundler extends AppImageBundler {
public MacAppBundler() {
setAppImageSupplier(MacAppImageBuilder::new);
setParamsValidator(MacAppBundler::doValidate);
}
private static final String TEMPLATE_BUNDLE_ICON = "java.icns";
public static final BundlerParamInfo<String> MAC_CF_BUNDLE_NAME =
new StandardBundlerParam<>(
Arguments.CLIOptions.MAC_BUNDLE_NAME.getId(),
String.class,
params -> null,
(s, p) -> s);
public static final BundlerParamInfo<String> DEFAULT_ICNS_ICON =
new StandardBundlerParam<>(
".mac.default.icns",
String.class,
params -> TEMPLATE_BUNDLE_ICON,
(s, p) -> s);
public static final BundlerParamInfo<String> DEVELOPER_ID_APP_SIGNING_KEY =
new StandardBundlerParam<>(
"mac.signing-key-developer-id-app",
String.class,
params -> {
String result = MacBaseInstallerBundler.findKey(
"Developer ID Application: "
+ SIGNING_KEY_USER.fetchFrom(params),
SIGNING_KEYCHAIN.fetchFrom(params),
VERBOSE.fetchFrom(params));
if (result != null) {
MacCertificate certificate = new MacCertificate(result);
if (!certificate.isValid()) {
Log.error(MessageFormat.format(I18N.getString(
"error.certificate.expired"), result));
}
}
return result;
},
(s, p) -> s);
public static final BundlerParamInfo<String> BUNDLE_ID_SIGNING_PREFIX =
new StandardBundlerParam<>(
Arguments.CLIOptions.MAC_BUNDLE_SIGNING_PREFIX.getId(),
String.class,
params -> getIdentifier(params) + ".",
(s, p) -> s);
static String getIdentifier(Map<String, ? super Object> params) {
String s = MAIN_CLASS.fetchFrom(params);
if (s == null) return null;
int idx = s.lastIndexOf(".");
if (idx >= 1) {
return s.substring(0, idx);
}
return s;
}
private static void doValidate(Map<String, ? super Object> params)
throws ConfigException {
if (StandardBundlerParam.getPredefinedAppImage(params) != null) {
return;
}
try {
String version = VERSION.fetchFrom(params);
CFBundleVersion.of(version);
} catch (IllegalArgumentException ex) {
throw new ConfigException(ex.getMessage(), I18N.getString(
"error.invalid-cfbundle-version.advice"), ex);
}
if (Optional.ofNullable(MacAppImageBuilder.
SIGN_BUNDLE.fetchFrom(params)).orElse(Boolean.FALSE)) {
String signingIdentity =
DEVELOPER_ID_APP_SIGNING_KEY.fetchFrom(params);
if (signingIdentity == null) {
throw new ConfigException(
I18N.getString("error.explicit-sign-no-cert"),
I18N.getString("error.explicit-sign-no-cert.advice"));
}
try {
ProcessBuilder pb = new ProcessBuilder("xcrun", "--help");
Process p = pb.start();
int code = p.waitFor();
if (code != 0) {
throw new ConfigException(
I18N.getString("error.no.xcode.signing"),
I18N.getString("error.no.xcode.signing.advice"));
}
} catch (IOException | InterruptedException ex) {
throw new ConfigException(ex);
}
}
}
}