From ba158edd816d66e1e67e03d385e6714c3d2ecbc1 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Wed, 4 Dec 2024 22:41:55 +0000 Subject: [PATCH] 8334319: Missing keys in jpackage resource bundle Reviewed-by: naoto, almatvee --- .../jdk/jpackage/internal/WinMsiBundler.java | 37 +++++++------- .../resources/WinResources.properties | 2 + .../jpackage/test/JPackageStringBundle.java | 7 ++- test/jdk/tools/jpackage/share/ErrorTest.java | 49 ++++++++++++++----- 4 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java index f724e08fc89..1c96b5885e7 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java @@ -333,14 +333,7 @@ public class WinMsiBundler extends AbstractBundler { FileAssociation.verify(FileAssociation.fetchFrom(params)); - var serviceInstallerResource = initServiceInstallerResource(params); - if (serviceInstallerResource != null) { - if (!Files.exists(serviceInstallerResource.getExternalPath())) { - throw new ConfigException(I18N.getString( - "error.missing-service-installer"), I18N.getString( - "error.missing-service-installer.advice")); - } - } + initServiceInstallerResource(params); return true; } catch (RuntimeException re) { @@ -407,11 +400,15 @@ public class WinMsiBundler extends AbstractBundler { ensureByMutationFileIsRTF(destFile); } - var serviceInstallerResource = initServiceInstallerResource(params); - if (serviceInstallerResource != null) { - var serviceInstallerPath = serviceInstallerResource.getExternalPath(); - params.put(SERVICE_INSTALLER.getID(), new InstallableFile( - serviceInstallerPath, serviceInstallerPath.getFileName())); + try { + var serviceInstallerResource = initServiceInstallerResource(params); + if (serviceInstallerResource != null) { + var serviceInstallerPath = serviceInstallerResource.getExternalPath(); + params.put(SERVICE_INSTALLER.getID(), new InstallableFile( + serviceInstallerPath, serviceInstallerPath.getFileName())); + } + } catch (ConfigException ex) { + throw new PackagerException(ex); } } @@ -763,7 +760,7 @@ public class WinMsiBundler extends AbstractBundler { } private static OverridableResource initServiceInstallerResource( - Map params) { + Map params) throws ConfigException { if (StandardBundlerParam.isRuntimeInstaller(params)) { // Runtime installer doesn't install launchers, // service installer not needed @@ -781,12 +778,16 @@ public class WinMsiBundler extends AbstractBundler { var result = createResource(null, params) .setPublicName("service-installer.exe") .setSourceOrder(OverridableResource.Source.External); - if (result.getResourceDir() == null) { - return null; + if (result.getResourceDir() != null) { + result.setExternal(result.getResourceDir().resolve(result.getPublicName())); + + if (Files.exists(result.getExternalPath())) { + return result; + } } - return result.setExternal(result.getResourceDir().resolve( - result.getPublicName())); + throw new ConfigException(I18N.getString("error.missing-service-installer"), + I18N.getString("error.missing-service-installer.advice")); } private Path installerIcon; diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties index 584342397a6..506ffa59ed6 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties @@ -57,6 +57,8 @@ error.unlock-resource=Failed to unlock: {0} error.read-wix-l10n-file=Failed to parse {0} file error.extract-culture-from-wix-l10n-file=Failed to read value of culture from {0} file error.short-path-conv-fail=Failed to get short version of "{0}" path +error.missing-service-installer='service-installer.exe' service installer not found in the resource directory +error.missing-service-installer.advice=Add 'service-installer.exe' service installer to the resource directory message.icon-not-ico=The specified icon "{0}" is not an ICO file and will not be used. The default icon will be used in it's place. message.potential.windows.defender.issue=Warning: Windows Defender may prevent jpackage from functioning. If there is an issue, it can be addressed by either disabling realtime monitoring, or adding an exclusion for the directory "{0}". diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java index 4757f54fdfd..fff08d35410 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageStringBundle.java @@ -56,7 +56,12 @@ public enum JPackageStringBundle { } private String getFormattedString(String key, Object[] args) { - return MessageFormat.format(getString(key), args); + var str = getString(key); + if (args.length != 0) { + return MessageFormat.format(str, args); + } else { + return str; + } } public CannedFormattedString cannedFormattedString(String key, String ... args) { diff --git a/test/jdk/tools/jpackage/share/ErrorTest.java b/test/jdk/tools/jpackage/share/ErrorTest.java index ed7338a76dd..c14da0da0f0 100644 --- a/test/jdk/tools/jpackage/share/ErrorTest.java +++ b/test/jdk/tools/jpackage/share/ErrorTest.java @@ -31,7 +31,10 @@ import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.CannedFormattedString; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JPackageStringBundle; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.RunnablePackageTest; import jdk.jpackage.test.TKit; +import static jdk.internal.util.OperatingSystem.WINDOWS; /* * @test @@ -113,14 +116,9 @@ public final class ErrorTest { public static void test(String javaAppDesc, String[] jpackageArgs, String[] removeArgs, CannedFormattedString... expectedErrors) { // Init default jpackage test command line. - var cmd = JPackageCommand.helloAppImage(javaAppDesc) - // Disable default logic adding `--verbose` option - // to jpackage command line. - // It will affect jpackage error messages if the command line is malformed. - .ignoreDefaultVerbose(true) - // Ignore external runtime as it will interfer - // with jpackage arguments in this test. - .ignoreDefaultRuntime(true); + var cmd = JPackageCommand.helloAppImage(javaAppDesc); + + defaultInit(cmd, expectedErrors); // Add arguments if requested. Optional.ofNullable(jpackageArgs).ifPresent(cmd::addArguments); @@ -129,13 +127,42 @@ public final class ErrorTest { Optional.ofNullable(removeArgs).map(List::of).ifPresent( args -> args.forEach(cmd::removeArgumentWithValue)); + cmd.execute(1); + } + + @Test(ifOS = WINDOWS) + public static void testWinService() { + + CannedFormattedString[] expectedErrors = new CannedFormattedString[] { + JPackageStringBundle.MAIN.cannedFormattedString("error.missing-service-installer"), + JPackageStringBundle.MAIN.cannedFormattedString("error.missing-service-installer.advice") + }; + + new PackageTest().configureHelloApp() + .addInitializer(cmd -> { + defaultInit(cmd, expectedErrors); + cmd.addArgument("--launcher-as-service"); + }) + .setExpectedExitCode(1) + .run(RunnablePackageTest.Action.CREATE); + } + + private static void defaultInit(JPackageCommand cmd, CannedFormattedString... expectedErrors) { + + // Disable default logic adding `--verbose` option + // to jpackage command line. + // It will affect jpackage error messages if the command line is malformed. + cmd.ignoreDefaultVerbose(true); + + // Ignore external runtime as it will interfer + // with jpackage arguments in this test. + cmd.ignoreDefaultRuntime(true); + // Configure jpackage output verifier to look up the list of provided - // errors in the order they specified. + // errors in the order they are specified. cmd.validateOutput(Stream.of(expectedErrors) .map(CannedFormattedString::getValue) .map(TKit::assertTextStream) .reduce(TKit.TextStreamVerifier::andThen).get()); - - cmd.execute(1); } }