diff --git a/pom.xml b/pom.xml index c035f48..bbdfe39 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.utplsql cli - 3.1.2-SNAPSHOT + 3.1.3-SNAPSHOT jar cli diff --git a/src/main/java/org/utplsql/cli/Cli.java b/src/main/java/org/utplsql/cli/Cli.java index 11a445e..a2e9202 100644 --- a/src/main/java/org/utplsql/cli/Cli.java +++ b/src/main/java/org/utplsql/cli/Cli.java @@ -3,9 +3,6 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; -import org.utplsql.api.exception.DatabaseNotCompatibleException; -import org.utplsql.api.exception.UtPLSQLNotInstalledException; -import org.utplsql.cli.exception.DatabaseConnectionFailed; public class Cli { @@ -26,36 +23,31 @@ static int runWithExitCode( String[] args ) { JCommander jc = new JCommander(); jc.setProgramName("utplsql"); - CommandProvider cmdProvider = new CommandProvider(); + CommandProvider cmdProvider = new CommandProvider(jc); cmdProvider.commands().forEach(cmd -> jc.addCommand(cmd.getCommand(), cmd)); int exitCode = DEFAULT_ERROR_CODE; - try { - jc.parse(args); + if ( args.length >= 1 && args[0].equals("-h") ) // Help? + { + exitCode = 0; + jc.usage(); + } + else { + try { + jc.parse(args); - exitCode = cmdProvider.getCommand(jc.getParsedCommand()).run(); + exitCode = cmdProvider.getCommand(jc.getParsedCommand()).run(); - } catch (ParameterException e) { - if (jc.getParsedCommand() != null) { - System.err.println(e.getMessage()); - jc.usage(jc.getParsedCommand()); - } else { - jc.usage(); + } catch (ParameterException e) { + exitCode = new HelpCommand(jc, e.getMessage()).run(); + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } return exitCode; } - private static class HelpCommand { - - @Parameter(names = {HELP_CMD, "--help"}, help = true) - public boolean callHelp; - - } - } diff --git a/src/main/java/org/utplsql/cli/CommandProvider.java b/src/main/java/org/utplsql/cli/CommandProvider.java index 898eb2a..5298143 100644 --- a/src/main/java/org/utplsql/cli/CommandProvider.java +++ b/src/main/java/org/utplsql/cli/CommandProvider.java @@ -1,5 +1,7 @@ package org.utplsql.cli; +import com.beust.jcommander.JCommander; + import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; @@ -7,8 +9,10 @@ public class CommandProvider { private Map commands; + private JCommander jCommander; - public CommandProvider() { + public CommandProvider( JCommander jCommander ) { + this.jCommander = jCommander; init(); } @@ -18,6 +22,7 @@ private void init() { addCommand(new RunCommand()); addCommand(new VersionInfoCommand()); addCommand(new ReportersCommand()); + addCommand(new HelpCommand(jCommander)); } private void addCommand( ICommand command ) { @@ -28,7 +33,7 @@ public ICommand getCommand( String key ) { if ( commands.containsKey(key)) return commands.get(key.toLowerCase()); else - return new HelpCommand("Unknown command: '" + key + "'"); + return new HelpCommand(jCommander, "Unknown command: '" + key + "'"); } public Stream commands() { diff --git a/src/main/java/org/utplsql/cli/HelpCommand.java b/src/main/java/org/utplsql/cli/HelpCommand.java index 3476a07..6d0c27b 100644 --- a/src/main/java/org/utplsql/cli/HelpCommand.java +++ b/src/main/java/org/utplsql/cli/HelpCommand.java @@ -1,19 +1,38 @@ package org.utplsql.cli; +import com.beust.jcommander.JCommander; + +/** Simple Help-Command which outputs an (optional) error message and the command line usage + * @author pesse + */ public class HelpCommand implements ICommand { private String errorMessage; + private JCommander jCommander; + + public HelpCommand(JCommander jCommander) { + this.jCommander = jCommander; + } - public HelpCommand( String errorMessage ) { + public HelpCommand( JCommander jCommander, String errorMessage ) { + this.jCommander = jCommander; this.errorMessage = errorMessage; } @Override public int run() { - if ( errorMessage != null ) + if ( errorMessage != null ) { System.out.println(errorMessage); - - return 1; + if (jCommander.getParsedCommand() != null) + jCommander.usage(jCommander.getParsedCommand()); + else + jCommander.usage(); + return 1; + } + else { + jCommander.usage(); + return 0; + } } @Override diff --git a/src/test/java/org/utplsql/cli/HelpCommandTest.java b/src/test/java/org/utplsql/cli/HelpCommandTest.java new file mode 100644 index 0000000..762ebe4 --- /dev/null +++ b/src/test/java/org/utplsql/cli/HelpCommandTest.java @@ -0,0 +1,49 @@ +package org.utplsql.cli; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.utplsql.cli.util.SystemOutCapturer; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class HelpCommandTest { + + + private SystemOutCapturer capturer; + + @BeforeEach + public void setupCaptureSystemOut() { + capturer = new SystemOutCapturer(); + } + + @Test + public void callHelp() { + + capturer.start(); + int result = TestHelper.runApp("-h"); + String output = capturer.stop(); + + assertEquals(0, result); + assertTrue(output.contains("Usage:")); + } + + @Test + public void callWithNoArgs() { + + capturer.start(); + int result = TestHelper.runApp(); + String output = capturer.stop(); + + assertEquals(1, result); + assertTrue(output.contains("Usage:")); + } + + @AfterEach + public void cleanupCaptureSystemOut() throws IOException { + capturer.stop(); + } +}