The sample application named 'helloworld' contains three
'hw
' commands, they are 'hw simple
',
'hw complex
' and 'hw enum
' and
demonstrate simple to intermediate level usage of the
@Cli
annotation classes for creating commands.
The example code is located in the distribution directory
<spring-shell-install-dir>/samples/helloworld
.
To build the example cd to the helloworld directory and execute
gradlew installApp
(you first need to add the gradlew
gradle wrapper to your path). To run the application cd to
build\install\helloworld\bin
and execute the helloworld
script.
The HelloWorldCommands
class is show
below
package org.springframework.shell.samples.helloworld.commands; import org.springframework.shell.core.CommandMarker; import org.springframework.shell.core.annotation.CliAvailabilityIndicator; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; import org.springframework.stereotype.Component; @Component public class HelloWorldCommands implements CommandMarker { private boolean simpleCommandExecuted = false; @CliAvailabilityIndicator({"hw simple"}) public boolean isSimpleAvailable() { //always available return true; } @CliAvailabilityIndicator({"hw complex", "hw enum"}) public boolean isComplexAvailable() { if (simpleCommandExecuted) { return true; } else { return false; } } @CliCommand(value = "hw simple", help = "Print a simple hello world message") public String simple( @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final String message, @CliOption(key = { "location" }, mandatory = false, help = "Where you are saying hello", specifiedDefaultValue="At work") final String location) { simpleCommandExecuted = true; return "Message = [" + message + "] Location = [" + location + "]"; } @CliCommand(value = "hw complex", help = "Print a complex hello world message") public String hello( @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final String message, @CliOption(key = { "name1"}, mandatory = true, help = "Say hello to the first name") final String name1, @CliOption(key = { "name2" }, mandatory = true, help = "Say hello to a second name") final String name2, @CliOption(key = { "time" }, mandatory = false, specifiedDefaultValue="now", help = "When you are saying hello") final String time, @CliOption(key = { "location" }, mandatory = false, help = "Where you are saying hello") final String location) { return "Hello " + name1 + " and " + name2 + ". Your special message is " + message + ". time=[" + time + "] location=[" + location + "]"; } @CliCommand(value = "hw enum", help = "Print a simple hello world message from an enumerated value") public String eenum( @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final MessageType message){ return "Hello. Your special enumerated message is " + message; } enum MessageType { Type1("type1"), Type2("type2"), Type3("type3"); private String type; private MessageType(String type){ this.type = type; } public String getType(){ return type; } } }
The use of the @CliAvailabilityIndicator
annotation on two methods, isSimpleAvailable
and
isComplexAvailable
shows how you can enable the
presence of the 'hw complex
' and 'hw
enum
' commands only if the 'hw simple
'
command was executed.
Here is an example session showing the behavior.
The 'hw enum
' command shows how the shell
supports the use of an enumeration as command method arguments.