[ https://issues.apache.org/jira/browse/DERBY-3543?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Zaun updated DERBY-3543: ------------------------------- Attachment: DERBY-3542-0_experimental.diff DERBY-3542-0_experimental.stat Having had a closer look into this issue, I'm attaching an experimental patch for comments (I quickly tested the patch but did not run any test suites). As stated above, this issue is unrelated to DERBY-2109: The usage text is not printed if any command-line argument has been given, even if a command is still missing. For instance: java org.apache.derby.drda.NetworkServerControl prints the usage text while java org.apache.derby.drda.NetworkServerControl -h localhost does not. The patch results changes the behaviour to that a usage message is always printed when no command has been given, regardless of whether any options have been specified. There are a number of finepoints described below. -------------------------------------------------------------------------------------- First, there is a swallowed exception, I'd call it a bug, in method NetworkServerControlImpl.findCommand(String[]), around line 2145: // didn't find command consolePropertyMessage("DRDA_UnknownCommand.U", (String) commandArgs.firstElement()); a) When no actual command was given, the Vector commandArgs is still empty. b) It then happens that commandArgs.firstElement() throws a NoSuchElementException. c) Unfortunately, this exception is swallowed by the following catch clause: } catch (Exception e) { if (e.getMessage().equals(NetworkServerControlImpl.UNEXPECTED_ERR)) throw e; //Ignore expected exceptions, they will have been //handled by the consolePropertyMessage routine } A fix is very simple: move a closing brace "}" a few lines down, so that the block structure becomes: if (commandArgs.size() > 0) { ... // didn't find command consolePropertyMessage("DRDA_UnknownCommand.U", (String) commandArgs.firstElement()); } When no actual command was given, the block is not executed. The method findCommand(String[]) ends with: return COMMAND_UNKNOWN; -------------------------------------------------------------------------------------- Second, and more importantly, the method NetworkServerControlImpl.parseArgs(String[]) shows some twisted logic: int command = COMMAND_START; if (args.length > 0) command = findCommand(args); else { consolePropertyMessage("DRDA_NoArgs.U"); } return command; a) It assigns a default command ("start"). b) However, if no command (or option) it calls consolePropertyMessage("DRDA_NoArgs.U"); which prints a usage message and EXITS -- as I've found out to my surprise. I didn't expect a method named consolePropertyMessage() to have such dramatic side-effects. c) The usage message clearly indicates that there's no default command: Usage: NetworkServerControl <commands> Commands: start [-h <host>] [-p <portnumber>] [-noSecurityManager] [-ssl <sslmode>] shutdown [-h <host>][-p <portnumber>] [-ssl <sslmode>] [-user <username>] [-pass word <password>] ping [-h <host>][-p <portnumber>] [-ssl <sslmode>] sysinfo [-h <host>][-p <portnumber>] [-ssl <sslmode>] runtimeinfo [-h <host>][-p <portnumber>] [-ssl <sslmode>] logconnections {on|off}[-h <host>][-p <portnumber>] [-ssl <sslmode>] maxthreads <max>[-h <host>][-p <portnumber>] [-ssl <sslmode>] timeslice <milliseconds>[-h <host>][-p <portnumber>] [-ssl <sslmode>] trace {on|off} [-s <session id>][-h <host>][-p <portnumber>] [-ssl <sslmode>] tracedirectory <traceDirectory>[-h <host>][-p <portnumber>] [-ssl <sslmode>] d) If, however, any command-line argument was given and findCommand() runs into any problems it returns COMMAND_UNKNOWN, in which case the assigned default command has got overridden. To summarize: Perhaps, there once was such a thing as a default command ("start") in the past, but points b), c), and d) indicate to me that this has not been supported for a while. So, under the assumption that users MUST provide a command to NetworkServerControl and if they have not done so that - a usage message is to be printed regardless of whether additional options were provided or not and - NetworkServerControl should then exit the method parseArgs(String[]) can be nicely cleaned up and implemented as: int command = findCommand(args); if (command == COMMAND_UNKNOWN) { consolePropertyMessage("DRDA_NoArgs.U"); } return command; -------------------------------------------------------------------------------------- > NetworkServerControl with user password but no command does not give usage > message > ---------------------------------------------------------------------------------- > > Key: DERBY-3543 > URL: https://issues.apache.org/jira/browse/DERBY-3543 > Project: Derby > Issue Type: Bug > Components: Network Server > Affects Versions: 10.4.1.0, 10.5.0.0 > Reporter: Kathey Marsden > Priority: Minor > Attachments: DERBY-3542-0_experimental.diff, > DERBY-3542-0_experimental.stat > > > I noticed that > java org.apache.derby.drda.NetworkServerControl -user mary -password mypass > with no actual command just completes with no usage message. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.