diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/ShortErrorMessageHandler.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/ShortErrorMessageHandler.java index 8cafd4c693e..095ca7cc3a0 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/ShortErrorMessageHandler.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/ShortErrorMessageHandler.java @@ -4,7 +4,6 @@ import picocli.CommandLine; import picocli.CommandLine.IParameterExceptionHandler; import picocli.CommandLine.ParameterException; import picocli.CommandLine.UnmatchedArgumentException; -import picocli.CommandLine.Help; import picocli.CommandLine.Model.CommandSpec; import java.io.PrintWriter; @@ -14,8 +13,22 @@ public class ShortErrorMessageHandler implements IParameterExceptionHandler { public int handleParseException(ParameterException ex, String[] args) { CommandLine cmd = ex.getCommandLine(); PrintWriter writer = cmd.getErr(); + String errorMessage = ex.getMessage(); - writer.println(cmd.getColorScheme().errorText(ex.getMessage())); + if (ex instanceof UnmatchedArgumentException) { + UnmatchedArgumentException uae = (UnmatchedArgumentException) ex; + + String[] unmatched = getUnmatchedPartsByOptionSeparator(uae,"="); + String original = uae.getUnmatched().get(0); + + if (unmatched[0].equals(original)) { + unmatched = getUnmatchedPartsByOptionSeparator(uae," "); + } + + errorMessage = "Unknown option: '" + unmatched[0] + "'"; + } + + writer.println(cmd.getColorScheme().errorText(errorMessage)); UnmatchedArgumentException.printSuggestions(ex, writer); CommandSpec spec = cmd.getCommandSpec(); @@ -25,4 +38,8 @@ public class ShortErrorMessageHandler implements IParameterExceptionHandler { ? cmd.getExitCodeExceptionMapper().getExitCode(ex) : spec.exitCodeOnInvalidInput(); } + + private String[] getUnmatchedPartsByOptionSeparator(UnmatchedArgumentException uae, String separator) { + return uae.getUnmatched().get(0).split(separator); + } } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/OptionValidationTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/OptionValidationTest.java index 53ec93316d4..99be55e5b68 100644 --- a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/OptionValidationTest.java +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/OptionValidationTest.java @@ -47,4 +47,28 @@ public class OptionValidationTest { assertEquals("Unknown option: '--nosuch'\n" + "Try 'kc.sh build --help' for more information on the available options.", result.getErrorOutput()); } + + @Test + @Launch({"start", "--db-pasword mytestpw"}) + public void failUnknownOptionWhitespaceSeparatorNotShowingValue(LaunchResult result) { + assertEquals("Unknown option: '--db-pasword'\n" + + "Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" + + "Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput()); + } + + @Test + @Launch({"start", "--db-pasword=mytestpw"}) + public void failUnknownOptionEqualsSeparatorNotShowingValue(LaunchResult result) { + assertEquals("Unknown option: '--db-pasword'\n" + + "Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" + + "Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput()); + } + + @Test + @Launch({"start", "--db-username=foobar","--db-pasword=mytestpw", "--foobar=barfoo"}) + public void failWithFirstOptionOnMultipleUnknownOptions(LaunchResult result) { + assertEquals("Unknown option: '--db-pasword'\n" + + "Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" + + "Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput()); + } } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/StartCommandTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/StartCommandTest.java index 5ffe38cf5d5..1f4e62fb726 100644 --- a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/StartCommandTest.java +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/StartCommandTest.java @@ -54,6 +54,6 @@ public class StartCommandTest { @Launch({ "-v", "start", "--db=dev-mem" }) void failBuildPropertyNotAvailable(LaunchResult result) { CLIResult cliResult = (CLIResult) result; - cliResult.assertError("Unknown option: '--db=dev-mem'"); + cliResult.assertError("Unknown option: '--db'"); } } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/BuildCommandDistTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/BuildCommandDistTest.java index 439501ceced..ff89b06e6e6 100644 --- a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/BuildCommandDistTest.java +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/BuildCommandDistTest.java @@ -59,6 +59,6 @@ class BuildCommandDistTest { @Launch({ "build", "--db=postgres", "--db-username=myuser", "--db-password=mypassword", "--http-enabled=true" }) void testFailRuntimeOptions(LaunchResult result) { CLIResult cliResult = (CLIResult) result; - cliResult.assertError("Unknown options: '--db-username=myuser', '--db-password=mypassword', '--http-enabled=true'"); + cliResult.assertError("Unknown option: '--db-username'"); } }