diff --git a/docs/src/reference/asciidoc/getting-started.adoc b/docs/src/reference/asciidoc/getting-started.adoc new file mode 100644 index 00000000..bf145fdb --- /dev/null +++ b/docs/src/reference/asciidoc/getting-started.adoc @@ -0,0 +1,307 @@ +[[statemachine-getting-started]] += Getting started +If you’re just getting started with Spring Statemachine, +this is the section for you! Here we answer the basic +“what?”, “how?” and “why?” questions. You’ll find a gentle +introduction to Spring Statemachine. We’ll then build our +first Spring Statemachine application, discussing some +core principles as we go. + +== System Requirements +Spring Statemachine {revnumber} is built and tested with +JDK 7 and Spring Framework {spring-version} and doesn't +require any other dependencies outside of Spring Framework +within its core system. + +Other optional parts like <> has dependencies to +a `Zookeeper`, while <> has dependencies +to spring-shell and spring-boot which pulls other dependencies +beyond framework itself. + +== Modules +The following modules are available for Spring Statemachine. + +|=== +|Module |Description + +|spring-statemachine-core +|Core system of a Spring Statemachine. + +|spring-statemachine-recipes-common +|Common recipes which doesn't require dependencies outside of a core +framework. + +|spring-statemachine-zookeeper +|`Zookeeper` integration for a distributed state machine. + +|spring-statemachine-test +|Support module for state machine testing. +|=== + +== Using Gradle +Here is a typical `build.gradle` file: + +[source,groovy,indent=0] +---- +buildscript { + repositories { + maven { url "http://repo.spring.io/libs-release" } + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE") + } +} + +apply plugin: 'base' +apply plugin: 'java' +apply plugin: 'eclipse' +apply plugin: 'idea' +apply plugin: 'spring-boot' +version = '0.1.0' +archivesBaseName = 'gs-statemachine' + +repositories { + mavenCentral() + maven { url "http://repo.spring.io/libs-release" } + maven { url "http://repo.spring.io/libs-milestone" } + maven { url "http://repo.spring.io/libs-snapshot" } +} + +dependencies { + compile("org.springframework.statemachine:spring-statemachine-core:1.0.0.BUILD-SNAPSHOT") + compile("org.springframework.boot:spring-boot-starter:1.2.3.RELEASE") + testCompile("org.springframework.statemachine:spring-statemachine-test:1.0.0.BUILD-SNAPSHOT") +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.11' +} +---- + +Having a normal project structure you'd build this with command: +[source,text,indent=0] +---- +# ./gradlew clean build +---- + +Expected Spring Boot packaged fat-jar would be `build/libs/gs-statemachine-0.1.0.jar`. + +[NOTE] +==== +You don't need repos `libs-milestone` and `libs-snapshot` for +production development. +==== + +== Using Maven +Here is a typical `pom.xml` file: + +[source,xml,indent=0] +---- + + + 4.0.0 + + org.springframework + gs-statemachine + 0.1.0 + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.2.3.RELEASE + + + + + org.springframework.statemachine + spring-statemachine-core + 1.0.0.BUILD-SNAPSHOT + + + org.springframework.boot + spring-boot-starter + 1.0.0.BUILD-SNAPSHOT + + + org.springframework.statemachine + spring-statemachine-test + 1.0.0.BUILD-SNAPSHOT + test + + + + + + + maven-compiler-plugin + 2.3.2 + + + org.springframework.boot + spring-boot-maven-plugin + + + maven-failsafe-plugin + + + package + + integration-test + verify + + + + + + + + + + spring-release + http://repo.spring.io/libs-release + false + + + spring-milestone + http://repo.spring.io/libs-milestone + false + + + spring-snapshot + http://repo.spring.io/libs-snapshot + true + + + + + + spring-release + http://repo.spring.io/libs-release + false + + + + +---- + +Having a normal project structure you'd build this with command: +[source,text,indent=0] +---- +# mvn clean package +---- + +Expected Spring Boot packaged fat-jar would be `target/gs-statemachine-0.1.0.jar`. + +[NOTE] +==== +You don't need repos `libs-milestone` and `libs-snapshot` for +production development. +==== + +== Developing your first Spring Statemachine application +Lets start by creating a simple Spring Boot `Application` class +implementing `CommandLineRunner`. + +[source,java,indent=0] +---- +@SpringBootApplication +public class Application implements CommandLineRunner { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} +---- + +Add states and events: +[source,java,indent=0] +---- +public static enum States { + SI, S1, S2 +} + +public static enum Events { + E1, E2 +} +---- + +Add state machine configuration: +[source,java,indent=0] +---- +@Configuration +@EnableStateMachine +static class StateMachineConfig + extends EnumStateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineConfigurationConfigurer config) + throws Exception { + config + .withConfiguration() + .autoStartup(true) + .listener(listener()); + } + + @Override + public void configure(StateMachineStateConfigurer states) + throws Exception { + states + .withStates() + .initial(States.SI) + .states(EnumSet.allOf(States.class)); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) + throws Exception { + transitions + .withExternal() + .source(States.SI).target(States.S1).event(Events.E1) + .and() + .withExternal() + .source(States.S1).target(States.S2).event(Events.E2); + } + + @Bean + public StateMachineListener listener() { + return new StateMachineListenerAdapter() { + @Override + public void stateChanged(State from, State to) { + System.out.println("State change to " + to.getId()); + } + }; + } +} +---- + +Implement `CommandLineRunner`, autowire `StateMachine`: +[source,java,indent=0] +---- +@Autowired +private StateMachine stateMachine; + +@Override +public void run(String... args) throws Exception { + stateMachine.sendEvent(Events.E1); + stateMachine.sendEvent(Events.E2); +} +---- + +Depending whether you build your application using `Gradle` or `Maven` +it's run `java -jar build/libs/gs-statemachine-0.1.0.jar` or +`java -jar target/gs-statemachine-0.1.0.jar` respectively. + +What is expected for running this command is a normal Spring Boot output +but if you look closely you see lines: + +[source,text,indent=0] +---- +State change to SI +State change to S1 +State change to S2 +---- + diff --git a/docs/src/reference/asciidoc/index.adoc b/docs/src/reference/asciidoc/index.adoc index 3db822bb..4f7881ab 100644 --- a/docs/src/reference/asciidoc/index.adoc +++ b/docs/src/reference/asciidoc/index.adoc @@ -15,9 +15,8 @@ include::preface.adoc[] include::introduction.adoc[] -[[springandsm]] +include::getting-started.adoc[] include::sm.adoc[] - include::recipes.adoc[] include::sm-examples.adoc[] include::faq.adoc[] diff --git a/docs/src/reference/asciidoc/introduction.adoc b/docs/src/reference/asciidoc/introduction.adoc index 2b38a2ec..8d63119e 100644 --- a/docs/src/reference/asciidoc/introduction.adoc +++ b/docs/src/reference/asciidoc/introduction.adoc @@ -19,13 +19,6 @@ and <> to get a generic idea of what state machines are mostly because rest of a documentation expects reader to be fairly familiar with state machine concepts. -== Requirements -Spring Statemachine {revnumber} is built and tested with JDK 7 and Spring -Framework {spring-version} and doesn't require any other dependencies -outside of Spring Framework. Samples require spring-shell and -spring-boot which pulls other dependencies beyond framework -itself. - == Background State machines are powerful because behaviour is always guaranteed to be consistent and relatively easily debugged due to ways how operational diff --git a/docs/src/reference/asciidoc/sm-examples.adoc b/docs/src/reference/asciidoc/sm-examples.adoc index d5e1dc1f..b2f5f41e 100644 --- a/docs/src/reference/asciidoc/sm-examples.adoc +++ b/docs/src/reference/asciidoc/sm-examples.adoc @@ -8,7 +8,24 @@ configuration and what an application does with a state machine. For complete examples go and study the samples repository. Samples are build directly from a main source distribution during a -normal build cycle. +normal build cycle. Samples in this chapter are: + +<> Turnstile. + +<> Showcase. + +<> CD Player. + +<> Tasks. + +<> Washer. + +<> Persist. + +<> Zookeeper. + +<> Web. + [source,text] ---- @@ -204,6 +221,7 @@ What happens in above sample: match to its dummy transition without guard or action, not never happens. +[[statemachine-examples-cdplayer]] == CD Player CD Player is a sample which resembles better use case of most of use have used in a real world. CD Player itself is a really simple entity where @@ -627,6 +645,7 @@ In above if we simulate failure for either task T2 or T3, state machine goes to MANUAL state where problem needs to be fixed manually before we're able to go back to READY state. +[[statemachine-examples-washer]] == Washer Washer is a sample demonstrating a use of a history state to recover a diff --git a/docs/src/reference/asciidoc/sm.adoc b/docs/src/reference/asciidoc/sm.adoc index ae212679..2aeb31f6 100644 --- a/docs/src/reference/asciidoc/sm.adoc +++ b/docs/src/reference/asciidoc/sm.adoc @@ -1,18 +1,38 @@ [[statemachine]] -= Spring and Statemachine += Using Spring Statemachine This part of the reference documentation explains the core functionality that Spring Statemachine provides to any Spring based application. -<> describes the generic configuration support. +<> the generic configuration support. -<> describes the generic state machine factory support. +<> the generic state machine factory support. -<> describes the use of triggers. +<> the actions support. -<> describes the use of state machine listeners. +<> the guard support. -<> describes the generic Spring application context support. +<> the extended state support. + +<> the state context support. + +<> the use of triggers. + +<> the use of state machine listeners. + +<> the generic Spring application context support. + +<> the state machine internal accessor support. + +<> the state machine error handling support. + +<> the state machine interceptor support. + +<> the state machine persisting support. + +<> the distributed state machine support. + +<> the state machine testing support. [[sm-config]] == Statemachine Configuration