From 3602130cc0c0a3ad108ba488c751e8ebe95f8acf Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 13 Dec 2015 11:13:33 +0000 Subject: [PATCH] Add scope sample - Backport #137 fixes #143 - Tune docs for usage and sample. --- .../reference/asciidoc/images/sm-scope-1.png | Bin 0 -> 56053 bytes .../asciidoc/images/statechart12.png | Bin 0 -> 3198 bytes docs/src/reference/asciidoc/sm-examples.adoc | 59 ++++++++--- docs/src/reference/asciidoc/sm.adoc | 13 +++ settings.gradle | 1 + spring-statemachine-samples/build.gradle | 9 ++ .../src/main/java/demo/scope/Application.java | 27 +++++ .../java/demo/scope/StateMachineConfig.java | 94 ++++++++++++++++++ .../demo/scope/StateMachineController.java | 54 ++++++++++ .../scope/src/main/resources/logback.xml | 8 ++ .../src/main/resources/statechartmodel.txt | 12 +++ .../src/main/resources/templates/states.html | 16 +++ 12 files changed, 280 insertions(+), 13 deletions(-) create mode 100644 docs/src/reference/asciidoc/images/sm-scope-1.png create mode 100644 docs/src/reference/asciidoc/images/statechart12.png create mode 100644 spring-statemachine-samples/scope/src/main/java/demo/scope/Application.java create mode 100644 spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineConfig.java create mode 100644 spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineController.java create mode 100644 spring-statemachine-samples/scope/src/main/resources/logback.xml create mode 100644 spring-statemachine-samples/scope/src/main/resources/statechartmodel.txt create mode 100644 spring-statemachine-samples/scope/src/main/resources/templates/states.html diff --git a/docs/src/reference/asciidoc/images/sm-scope-1.png b/docs/src/reference/asciidoc/images/sm-scope-1.png new file mode 100644 index 0000000000000000000000000000000000000000..18e5057123a3f1e355536c8760ae3d431be58af7 GIT binary patch literal 56053 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 btghqByl%)Ms(+1ytoS9Fi%I9N-}(Old&&6X literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/statechart12.png b/docs/src/reference/asciidoc/images/statechart12.png new file mode 100644 index 0000000000000000000000000000000000000000..baf3c38be0aa32d49cf02f01583781f27c85784e GIT binary patch literal 3198 zcmaJ^3pkWp7apR{QAauDl9Ed~$%y3Ep(xiikyCb>>(Ix;TN2&Zz1=B{eq-SWt74Z%i=dr(Rc3oxt;EORJ|{dxnG=i(NMqWtXZ_k1 zurQQZ>W7Gc0~TP7-{8rh_Xtx*US*Nw+SW;p7!aI!>nrJOv*)AK`xg8q;#@gjkRgB;ktzP{U(ld^Jh zn6tgkaWURxf#;J{cs%^i`xzM-4s4mi@$vDJl9B@r1+6_pL+%S2_p1l>+goItWbGQ; z9vj(MThnN?#4Y{-0rtb1?Qi2UZgBDs6n^{x2yt4;Y-!#N_pn?WnHjni^yKb2NF2IV zFgi9?iDOY26z3BO+pQRc6F5nnWKSoZPVegac^yI!OeT@^f|Q=3{t%gR#i*-f#eAz) zR7b+Fb11RHx%$JJTVm?Xv-auf=@}Rp=<50?hGApmEM>CSpNYI=>4-yUCdtry$5934Y>+?EX znnpOSo$7WRjZR7i3B*K#@hMY*`)|Ls&5rdl7rZHpa_qT@0dI%W zB!WMO!wLB^y8HG{ByRTb#)n$;!O7*%k;;R%&cT!Q<$HA~3pniEB5)&jxTq#E(K)XglMfT=5I&j@klMnU7Bn<8)J1MYF4eZS zo;Y>t6wmo}WhFCP$v(hySvWzN;BsG3>HcjY{+Q6qmoHzu_%tg^HRQ`YGfvqg;Kfv- z5-vF#m3}a2>eHLsv$L~29&h7(*@##wHgFtbdtxx>O5GzPA_h4p(~ZktzjoA4rF`KK zqPl6P*u%q*9zAkxDWq5u2VJpcb<|pJB#}teNI`jA<1@Xe^Yek&I9qic*1(sd(+LD& z413F&d=jQ3#WvT$2|qW!I05H|qDx)o#u>^tXU-_5V9{taicy_0quw%8IYD;9*UHMf z?N?isaQ2>`;f)iUXFI(fxqGi zCf7dI{QdW}EjJjGOXQov!Mw>0aOh$1WQSYaAvqM7eyOBMn~! zmhm)`p)=*Bm5g^GN2!PhUd+zPI$_mkhtl0ApZqy);pgu^TN}QZoA ztvP%}7((--V$2qy{X(aG!pZKxGFn*Vr7u??TO^T2rx#tQc7#}|&LMr3*C*-%BV>DL z42gaoRJ!0l5VJ|umq@4BA{KPlBsUtj;l;u40H4DlW*^+hi*OK z&#^-Z!EsM@3j_j?qJR?&g>!v=(QdFdd7;%xMtKDBu< zIa&RR{zvDW&r4KMFn=GRD}YvVpV27JBT?)8T<@h<6l)8jAzmYY5I@=m7(x>~xGutY zlVz*<^=q01WJn4IQExpY0edK}1D~2b);2Z+L2M-^3|xS@G*X8t{o}`~(o$Cq7?enO z@EV-z)Q+j<=3_ZxBEWkP0FQ?_$;b=3iXd?zYz>Tzc0&b4MLNm0Yb8KNw@qI!uWc9d ze5g5TckGWKXCxc1S+gb?;*5_Q{!;Vk5S|Z~K{)5zMVG%Cw-BbLq}XQi zGs&~Dv5DO%+D}SJNokJSv-#9Pmtdd+Jm%+O3;>pD^w}YcE+{D|fVgR9;RL};oi@t6 zu`xX@{syp_ocf+AaOpMDqEKxe9gX!k=%A@-e|NW=J9jJCTg$dfZAXXc*xQUF#35?- zF5VZR@FwZrq1&kDWUFH|1AYCswHm1{5w&0W)i~%$xJw5R$m7i5h!lP;kOUfBPFa}X zEC{Cm3#;0{NhD(;Pc>+uhfqW|HZr31I8im02-~eh{cG5_Z}+Iy!=@64Yl` zu3Yiep%VYA>*Qn65CC}U$F@LYBn2>_ntE1Cc(qCI^{;~AZs0XZcuj3}G zC~ZrnY#Fa+1cbUD*l;yEy1{3l1Lp2jrV_mg9c65}vn!Eca((=5;oXpiHch!0BUn?# zr6XHZUvKh{vVH~%mg2i2t;IoG)oevMk=`QJrM@|me_-DuS7Ad^Vd)ug*wMW!D_zuE a*fyVOFpEfw;er1O*fFb> Web. +<> Scope. + [source,text] ---- @@ -37,6 +39,13 @@ Every sample is located in its own directory under spring-shell and you will find usual boot fat jars under every sample projects `build/libs` directory. +[NOTE] +==== +Filenames for jars we refer in this section are populated during a +build of this document, meaning if you're building samples from a +master, you have files with `BUILD-SNAPSHOT` postfix. +==== + [[statemachine-examples-turnstile]] == Turnstile @@ -68,9 +77,9 @@ include::samples/demo/turnstile/Application.java[tags=snippetA] You can see how this sample state machine interacts with event by running `turnstile` sample. -[source,text] +[source,text,subs="verbatim,attributes"] ---- -$ java -jar spring-statemachine-samples-turnstile-1.0.0.BUILD-SNAPSHOT.jar +$ java -jar spring-statemachine-samples-turnstile-{revnumber}.jar sm>sm print +----------------------------------------------------------------+ @@ -915,8 +924,12 @@ include::samples/demo/zookeeper/Application.java[tags=snippetB] ---- Let's go through a simple example where two different shell instances are -started with command `java -jar -spring-statemachine-samples-zookeeper-1.0.0.BUILD-SNAPSHOT.jar`. +started with command + +[source,text,subs="attributes"] +---- +@n1:~# java -jar spring-statemachine-samples-zookeeper-{revnumber}.jar +---- First open first shell instance(do not start second instance yet). When state machine is started it will end up into its initial state @@ -993,21 +1006,19 @@ be available from a localhost for every individual sample instance. ==== Let's go through a simple example where three different sample instances are -started with command `java -jar -spring-statemachine-samples-web-1.0.0.BUILD-SNAPSHOT.jar`. If you are -running different instances on a same host you need to distinguish -used port by adding `--server.port=` to the command. Otherwise -default port for each host will be `8080`. +started. If you are running different instances on a same host you need to +distinguish used port by adding `--server.port=` to the command. +Otherwise default port for each host will be `8080`. In this sample run we have three hosts, `n1`, `n2` and `n3` which all have a local zookeeper instance running and a state machine sample running on a port `8080`. -[source,text] +[source,text,subs="attributes"] ---- -@n1:~# java -jar spring-statemachine-samples-web-1.0.0.BUILD-SNAPSHOT.jar -@n2:~# java -jar spring-statemachine-samples-web-1.0.0.BUILD-SNAPSHOT.jar -@n3:~# java -jar spring-statemachine-samples-web-1.0.0.BUILD-SNAPSHOT.jar +@n1:~# java -jar spring-statemachine-samples-web-{revnumber}.jar +@n2:~# java -jar spring-statemachine-samples-web-{revnumber}.jar +@n3:~# java -jar spring-statemachine-samples-web-{revnumber}.jar ---- When all instances are running you should see all showing similar @@ -1037,3 +1048,25 @@ all browser sessions. image::images/sm-dist-n1-4.png[width=500] +[[statemachine-examples-scope]] +== Scope +Scope is a state machine example using a session scope to provide +individual instance for every user. + +image::images/statechart12.png[width=500] + +This is a simple state machine having states `S0`, `S1` and `S2`. +Transitions between those are controlled via events `A`, `B` and `C` +as shown in a state chart. + +[source,text,subs="attributes"] +---- +@n1:~# java -jar spring-statemachine-samples-scope-{revnumber}.jar +---- + +When instance is running you can open a browser and play with a state +machine. If you open same page using a different browser, i.e one in +_Chrome_ and one in _Firefox_, you should get a new state machine +instance per user session. + +image::images/sm-scope-1.png[width=500] diff --git a/docs/src/reference/asciidoc/sm.adoc b/docs/src/reference/asciidoc/sm.adoc index 917aa384..d5d7316b 100644 --- a/docs/src/reference/asciidoc/sm.adoc +++ b/docs/src/reference/asciidoc/sm.adoc @@ -483,6 +483,11 @@ these simply needs an a `@Scope` to be present where _scopeName_ is set to _session_ and _proxyMode_ to `ScopedProxyMode.TARGET_CLASS`. Examples for both use cases are shown below. +[TIP] +==== +See sample <> how to use session scoping. +==== + [source,java,indent=0] ---- include::samples/DocsConfigurationSampleTests2.java[tags=snippetB] @@ -508,6 +513,14 @@ Using state machines in a `session` scopes needs a careful planning mostly because it is a relatively heavy component. ==== +[NOTE] +==== +Spring Statemachine poms don't have any dependencies to Spring MVC +classes which you will need to work with session scope. But if you're +working with a web application, you've already pulled those deps +directly from Spring MVC or Spring Boot. +==== + [[sm-actions]] == Using Actions Actions are one of the most useful components from user perspective to diff --git a/settings.gradle b/settings.gradle index 95c385b6..b13782aa 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,6 +15,7 @@ include 'spring-statemachine-samples:washer' include 'spring-statemachine-samples:zookeeper' include 'spring-statemachine-samples:persist' include 'spring-statemachine-samples:web' +include 'spring-statemachine-samples:scope' rootProject.children.find { if (it.name == 'spring-statemachine-recipes') { diff --git a/spring-statemachine-samples/build.gradle b/spring-statemachine-samples/build.gradle index 0d8e5114..b7d6585e 100644 --- a/spring-statemachine-samples/build.gradle +++ b/spring-statemachine-samples/build.gradle @@ -45,3 +45,12 @@ project('spring-statemachine-samples-web') { compile("org.springframework.session:spring-session:$springSessionVersion") } } + +project('spring-statemachine-samples-scope') { + description = 'Spring State Machine Web Scope Sample' + dependencies { + compile("org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion") +// compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") +// compile("org.springframework:spring-webmvc:$springVersion") + } +} diff --git a/spring-statemachine-samples/scope/src/main/java/demo/scope/Application.java b/spring-statemachine-samples/scope/src/main/java/demo/scope/Application.java new file mode 100644 index 00000000..03921cae --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/java/demo/scope/Application.java @@ -0,0 +1,27 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package demo.scope; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineConfig.java b/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineConfig.java new file mode 100644 index 00000000..679d23dd --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineConfig.java @@ -0,0 +1,94 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package demo.scope; + +import java.io.IOException; +import java.io.InputStream; +import java.util.EnumSet; +import java.util.Scanner; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.io.ClassPathResource; +import org.springframework.statemachine.config.EnableStateMachine; +import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; +import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; +import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; +import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; + +@Configuration +public class StateMachineConfig { + + @Configuration + @EnableStateMachine + @Scope(scopeName="session", proxyMode=ScopedProxyMode.TARGET_CLASS) + static class Config + extends EnumStateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineConfigurationConfigurer config) + throws Exception { + config + .withConfiguration() + .autoStartup(true); + } + + @Override + public void configure(StateMachineStateConfigurer states) + throws Exception { + states + .withStates() + .initial(States.S0) + .states(EnumSet.allOf(States.class)); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) + throws Exception { + transitions + .withExternal() + .source(States.S0).target(States.S1).event(Events.A) + .and() + .withExternal() + .source(States.S1).target(States.S2).event(Events.B) + .and() + .withExternal() + .source(States.S2).target(States.S0).event(Events.C); + } + + } + + @Bean + public String stateChartModel() throws IOException { + ClassPathResource model = new ClassPathResource("statechartmodel.txt"); + InputStream inputStream = model.getInputStream(); + Scanner scanner = new Scanner(inputStream); + String content = scanner.useDelimiter("\\Z").next(); + scanner.close(); + return content; + } + + public enum States { + S0, S1, S2; + } + + public enum Events { + A, B, C; + } + +} diff --git a/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineController.java b/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineController.java new file mode 100644 index 00000000..0e1e1ae0 --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/java/demo/scope/StateMachineController.java @@ -0,0 +1,54 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package demo.scope; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.statemachine.StateMachine; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import demo.scope.StateMachineConfig.Events; +import demo.scope.StateMachineConfig.States; + +@Controller +public class StateMachineController { + + @Autowired + private StateMachine stateMachine; + + @Autowired + @Qualifier("stateChartModel") + private String stateChartModel; + + @RequestMapping("/") + public String greeting() { + return "redirect:/states"; + } + + @RequestMapping("/states") + public String getStates(@RequestParam(value = "event", required = false) Events event, Model model) { + if (event != null) { + stateMachine.sendEvent(event); + } + model.addAttribute("states", stateMachine.getState().getIds()); + model.addAttribute("stateChartModel", stateChartModel); + return "states"; + } + +} \ No newline at end of file diff --git a/spring-statemachine-samples/scope/src/main/resources/logback.xml b/spring-statemachine-samples/scope/src/main/resources/logback.xml new file mode 100644 index 00000000..7d5b0732 --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/resources/logback.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-statemachine-samples/scope/src/main/resources/statechartmodel.txt b/spring-statemachine-samples/scope/src/main/resources/statechartmodel.txt new file mode 100644 index 00000000..4f758b14 --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/resources/statechartmodel.txt @@ -0,0 +1,12 @@ ++---------------------------------------------------+ +| SM | ++---------------------------------------------------+ +| | +| +--------+ A +--------+ B +--------+ | +| *-->| S0 |------>| S1 |------>| S2 | | +| +--------+ +--------+ +--------+ | +| ^ | | +| | C | | +| +----------------------------------+ | +| | ++---------------------------------------------------+ diff --git a/spring-statemachine-samples/scope/src/main/resources/templates/states.html b/spring-statemachine-samples/scope/src/main/resources/templates/states.html new file mode 100644 index 00000000..a9227246 --- /dev/null +++ b/spring-statemachine-samples/scope/src/main/resources/templates/states.html @@ -0,0 +1,16 @@ + + + + Spring Statemachine Scope Demo + + + +

+

+ + + +
+
+
+