From 085cb4359ba7877c8e026b52e13d5491ba469d78 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Tue, 17 Jul 2012 22:16:47 -0400 Subject: [PATCH] SHL-23 - Create docbook based reference guide --- .../docbook/images/shell-arch-overview.png | Bin 0 -> 25393 bytes .../reference/dev-guide/dev-spring-shell.xml | 17 +- .../docbook/reference/introduction.xml | 2 +- .../src/reference/docbook/reference/shell.xml | 145 +++++++++++++++--- .../shell/plugin/BannerProvider.java | 6 +- 5 files changed, 138 insertions(+), 32 deletions(-) create mode 100644 docs/src/reference/docbook/images/shell-arch-overview.png diff --git a/docs/src/reference/docbook/images/shell-arch-overview.png b/docs/src/reference/docbook/images/shell-arch-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7f791e826eaa7d3848f23c88a27b247530492b GIT binary patch literal 25393 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 literal 0 HcmV?d00001 diff --git a/docs/src/reference/docbook/reference/dev-guide/dev-spring-shell.xml b/docs/src/reference/docbook/reference/dev-guide/dev-spring-shell.xml index 34e6922e..1ac18fde 100644 --- a/docs/src/reference/docbook/reference/dev-guide/dev-spring-shell.xml +++ b/docs/src/reference/docbook/reference/dev-guide/dev-spring-shell.xml @@ -9,18 +9,19 @@ xmlns:ns="http://docbook.org/ns/docbook"> Developing Spring Shell Applications - The commands are - - - - - - + Contributing commands to the shell is very easy. There are only a few + annotations you need to learn. The implementation style of the command is in + the style of developing an application that uses dependency injection as you + can leverage all the features of the Spring container.
Marker Interface - The marker interface.... + The first step to creating a command is to implement the market + interface CommandMarker and to annotate your class with Spring's + @Component annotation. (Note there is an open JIRA issue to provide a + @CliCommand meta-annotation to avoid having to use a market interface) + Taking the
diff --git a/docs/src/reference/docbook/reference/introduction.xml b/docs/src/reference/docbook/reference/introduction.xml index 825f2b95..b9552d18 100644 --- a/docs/src/reference/docbook/reference/introduction.xml +++ b/docs/src/reference/docbook/reference/introduction.xml @@ -2,6 +2,6 @@ Document structure - This part of the reference documentation explains the core componets + This part of the reference documentation explains the core components of the Spring Shell. diff --git a/docs/src/reference/docbook/reference/shell.xml b/docs/src/reference/docbook/reference/shell.xml index 81558b7a..bbae8319 100644 --- a/docs/src/reference/docbook/reference/shell.xml +++ b/docs/src/reference/docbook/reference/shell.xml @@ -22,15 +22,30 @@ started. The essential boostrapping code that looks for your contributions looks like thisnew ClassPathXmlApplicationContext("classpath*:/META-INF/spring/spring-shell-plugin.xml"); - In the spring-shell-plugin.xml file you should - declare the commands and any collaboration objects that support the - commands actions. An easy way to declare the commands is to use Spring's - component scanning functionality. + In the spring-shell-plugin.xml file you should + define the command classes and any other collaboration objects that + support the commands actions. The plugin model is depicted in the + following diagram - Here is an example spring-shell-plugin.xml that - from the sample application. + + + + + - <beans xmlns="http://www.springframework.org/schema/beans" + Note that the current plugin model loads all plugins under the same + class loader. An open JIRA issus is to provide a classloader per plugin to + provide isolation. + +
+ Commands + + An easy way to declare the commands is to use Spring's component + scanning functionality.Here is an example + spring-shell-plugin.xml that from the sample + application. + + <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd @@ -40,25 +55,26 @@ </beans> - The commands are Spring components, demarcated as such using the - @Component annotation. For example, the - HelloWorldCommands class from the sample - application looks like this + The commands are Spring components, demarcated as such using the + @Component annotation. For example, the + HelloWorldCommands class from the sample + application looks like this - @Component + @Component public class HelloWorldCommands implements CommandMarker { - // methods with @Cli annotations go here - // use any Spring annotations for Dependency Injection or other Spring interfaces as required. + // methods with @Cli annotations go here + } - One the commands are registered and instantiated by the Spring - container, they are registered with the core shell parser so that the - @Cli annotationscan be processed. The way the commands - are identified is through the use of the - CommandMarker interface. + One the commands are registered and instantiated by the Spring + container, they are registered with the core shell parser so that the + @Cli annotations can be processed. The way the + commands are identified is through the use of the + CommandMarker interface. +
Converters @@ -67,7 +83,7 @@ public class HelloWorldCommands implements CommandMarker { org.springframework.shell.core.Converter interface provides the contract to convert the strings that are entered in the command to rich Java types passed into the arguments of - @Cli-annotated methods. + @Cli-annotated methods. By default converters for common types are registered. These cover primitive types (boolean, int, float...) as well as Date, Character, and @@ -106,7 +122,94 @@ public class HelloWorldCommands implements CommandMarker { executed. +
- +
+ Customizing the shell + + There are a few extension points that allow you to customize the + shell. The extension points are the interfaces + + + + BannerProvider - Specifies the + banner text , welcome message, and version number that will be + displayed when the shell is started + + + + PromptProvider - Specifies the + command prompt text + + + + HistoryFileNameProvider - + Specifies the name of the command history file + + + + There is a default implementation for these interfaces but you + should create your own implementations for your own shell application. Use + Spring's @Ordered annotation to set the priority of the + provider. This allows your provider implementations to take precidence + over any other implementations that maybe present on the classpath from + other plugins. + + To make cool "ASCII art" + banners the website http://patorjk.com/software/taag + is quite neat! +
+ +
+ Communicating between plugins + + As this is a standard Spring application you can use Spring's + ApplicationContext event infrastructure to communicate across + plugins. +
+ +
+ Command method interception + + It has shown to be useful to provide a simple form of interception + around the invocation of a command method. This enables the command class + to check for updates to state, such as configuration information modified + by other plugins, before the command is executed. The interface + ExecutionProcess should be implemented + instead of CommandMarker to access this + functionlatiy. The ExecutionProcess + interface is shown below + + public interface ExecutionProcessor extends CommandMarker { + + /** + * Method called before invoking the target command (described by {@link ParseResult}). + * Additionally, for advanced cases, the parse result itself effectively changing the invocation + * calling site. + * + * @param invocationContext target command context + * @return the invocation target + */ + ParseResult beforeInvocation(ParseResult invocationContext); + + /** + * Method called after successfully invoking the target command (described by {@link ParseResult}). + * + * @param invocationContext target command context + * @param result the invocation result + */ + void afterReturningInvocation(ParseResult invocationContext, Object result); + + /** + * Method called after invoking the target command (described by {@link ParseResult}) had thrown an exception . + * + * @param invocationContext target command context + * @param thrown the thrown object + */ + void afterThrowingInvocation(ParseResult invocationContext, Throwable thrown); + +}
diff --git a/src/main/java/org/springframework/shell/plugin/BannerProvider.java b/src/main/java/org/springframework/shell/plugin/BannerProvider.java index a1c3c400..39d17248 100644 --- a/src/main/java/org/springframework/shell/plugin/BannerProvider.java +++ b/src/main/java/org/springframework/shell/plugin/BannerProvider.java @@ -16,9 +16,11 @@ package org.springframework.shell.plugin; + /** - * Banner provider. Plugin should implement this interface to replace the version banner. - * getOrder indicate the priority, higher values can be interpreted as lower priority + * Banner provider. Plugins should implement this interface to replace the version banner. + * Use the @Order annotation to specify the priority of the banner to be display, higher + * values can be interpreted as lower priority * * @author Jarred Li * @since 1.0