diff --git a/build.gradle b/build.gradle index bb24ac21..fb1ab9c5 100644 --- a/build.gradle +++ b/build.gradle @@ -344,6 +344,8 @@ configure(rootProject) { from 'spring-statemachine-test/src/test/java/org/springframework/statemachine/test/docs' from 'spring-statemachine-recipes/src/test/java/org/springframework/statemachine/recipes/docs' from 'spring-statemachine-zookeeper/src/test/java/org/springframework/statemachine/zookeeper/docs' + from 'spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/docs' + from 'spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs' from 'spring-statemachine-samples/src/main/java/' from 'spring-statemachine-samples/washer/src/main/java/' from 'spring-statemachine-samples/tasks/src/main/java/' @@ -355,6 +357,7 @@ configure(rootProject) { from 'spring-statemachine-samples/security/src/main/java/' from 'spring-statemachine-samples/eventservice/src/main/java/' include '**/*.java' + include '**/*.uml' into 'docs/src/reference/asciidoc/samples' } diff --git a/docs/src/reference/asciidoc/getting-started.adoc b/docs/src/reference/asciidoc/getting-started.adoc index c607732f..87467acd 100644 --- a/docs/src/reference/asciidoc/getting-started.adoc +++ b/docs/src/reference/asciidoc/getting-started.adoc @@ -42,6 +42,12 @@ framework. |spring-statemachine-test |Support module for state machine testing. + +|spring-statemachine-cluster +|Support module for Spring Cloud Cluster. + +|spring-statemachine-uml +|Support module for UI uml modeling. |=== == Using Gradle diff --git a/docs/src/reference/asciidoc/images/simple-machine.png b/docs/src/reference/asciidoc/images/simple-machine.png new file mode 100644 index 00000000..371a8670 Binary files /dev/null and b/docs/src/reference/asciidoc/images/simple-machine.png differ diff --git a/docs/src/reference/asciidoc/samples/simple-machine.uml b/docs/src/reference/asciidoc/samples/simple-machine.uml new file mode 100644 index 00000000..13fdf9ec --- /dev/null +++ b/docs/src/reference/asciidoc/samples/simple-machine.uml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/src/reference/asciidoc/sm.adoc b/docs/src/reference/asciidoc/sm.adoc index c175c6a6..13205290 100644 --- a/docs/src/reference/asciidoc/sm.adoc +++ b/docs/src/reference/asciidoc/sm.adoc @@ -346,6 +346,38 @@ include::samples/DocsConfigurationSampleTests.java[tags=snippetYC] More about config model, refer to section <>. +=== Configuring Model +`StateMachineModelFactory` is a hook to configure statemachine model +without using a manual configuration. Essentially it is a thirt party +integration to integrate into a configuration model. +`StateMachineModelFactory` can be hooked into a configuration model by +using a `StateMachineModelConfigurer` as shown above. + +[source,java,indent=0] +---- +include::samples/DocsConfigurationSampleTests8.java[tags=snippetA] +---- + +As a custom example `CustomStateMachineModelFactory` would simply +define two states, _S1_ and _S2_ and an event _E1_ between those +states. + +[source,java,indent=0] +---- +include::samples/DocsConfigurationSampleTests8.java[tags=snippetB] +---- + +[NOTE] +==== +Defining a custom model is usually not what end user is looking for, +although it is possible, however it is a central concept of allowing +external access to this configuration model. +==== + +Example of using this model factory integration can be found from +<>. More generic info about custom model integration can +be found from <>. + [[statemachine-config-thingstoremember]] === Things to Remember @@ -1672,3 +1704,39 @@ event is sent to particular, random or all machines. All possible options for expected are documented in javadocs {sm-statemachinetestplanbuilder-statemachinetestplanstepbuilder}[_StateMachineTestPlanStepBuilder_]. ==== + +[[sm-papyrus]] +== Eclipse Modeling Support +Defining a state machine configuration with UI modeling is supported +via Eclipse Papyrus framework. + +From eclipse wizard create a new _Papyrus Model_ with `UML` _Diagram +Language_. In this example it's named as `simple-machine`. Then you've +given an option to choose various diagram kind's and a `StateMachine +Diagram` mush be chooce. + +We want to create a machine having two states, `S1` and `S2` where +`S1` is initial state. Then event `E1` is created to do a transition +from `S1` to `S2`. In papyrus a machine would then look like something +shown below. + +image::images/simple-machine.png[width=500] + +Behind a scenes a raw uml file would look like. + +[source,xml,indent=0] +---- +include::samples/simple-machine.uml[] +---- + +After uml file is in place in your project, it can be imported into +configuration using `StateMachineModelConfigurer` where +`StateMachineModelFactory` is associated with a model. +`UmlStateMachineModelFactory` is a special factory which knows howto +process eclipse's uml structure. + +[source,java,indent=0] +---- +include::samples/DocsUmlSampleTests1.java[tags=snippetA] +---- + diff --git a/docs/src/reference/asciidoc/whatsnew.adoc b/docs/src/reference/asciidoc/whatsnew.adoc index afd65856..2861fdc1 100644 --- a/docs/src/reference/asciidoc/whatsnew.adoc +++ b/docs/src/reference/asciidoc/whatsnew.adoc @@ -17,5 +17,6 @@ interoperability with web applications. * Configuration model classes are now a public API. * New features in timer based events. * Configuration model verifier. -* New samples, <>, <> +* New samples, <>, <>. +* UI modeling support using Eclipse Papyrus, <>. diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java new file mode 100644 index 00000000..8440f4aa --- /dev/null +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java @@ -0,0 +1,75 @@ +/* + * Copyright 2016 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 org.springframework.statemachine.docs; + +import java.util.ArrayList; +import java.util.Collection; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.statemachine.config.EnableStateMachine; +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; +import org.springframework.statemachine.config.builders.StateMachineModelConfigurer; +import org.springframework.statemachine.config.model.ConfigurationData; +import org.springframework.statemachine.config.model.DefaultStateMachineModel; +import org.springframework.statemachine.config.model.StateData; +import org.springframework.statemachine.config.model.StateMachineModel; +import org.springframework.statemachine.config.model.StateMachineModelFactory; +import org.springframework.statemachine.config.model.StatesData; +import org.springframework.statemachine.config.model.TransitionData; +import org.springframework.statemachine.config.model.TransitionsData; + +public class DocsConfigurationSampleTests8 { + +// tag::snippetA[] + @Configuration + @EnableStateMachine + public static class Config1 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + return new CustomStateMachineModelFactory(); + } + } +// end::snippetA[] + +// tag::snippetB[] + public static class CustomStateMachineModelFactory implements StateMachineModelFactory { + + @Override + public StateMachineModel build() { + ConfigurationData configurationData = new ConfigurationData<>(); + Collection> stateData = new ArrayList<>(); + stateData.add(new StateData("S1", true)); + stateData.add(new StateData("S2")); + StatesData statesData = new StatesData<>(stateData); + Collection> transitionData = new ArrayList<>(); + transitionData.add(new TransitionData("S1", "S2", "E1")); + TransitionsData transitionsData = new TransitionsData<>(transitionData); + StateMachineModel stateMachineModel = new DefaultStateMachineModel(configurationData, + statesData, transitionsData); + return stateMachineModel; + } + } +// end::snippetB[] +} diff --git a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/docs/DocsUmlSampleTests1.java b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/docs/DocsUmlSampleTests1.java new file mode 100644 index 00000000..e8e00623 --- /dev/null +++ b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/docs/DocsUmlSampleTests1.java @@ -0,0 +1,49 @@ +/* + * Copyright 2016 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 org.springframework.statemachine.uml.docs; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.statemachine.config.EnableStateMachine; +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; +import org.springframework.statemachine.config.builders.StateMachineModelConfigurer; +import org.springframework.statemachine.config.model.StateMachineModelFactory; +import org.springframework.statemachine.uml.UmlStateMachineModelFactory; + +public class DocsUmlSampleTests1 { + +// tag::snippetA[] + @Configuration + @EnableStateMachine + public static class Config1 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + Resource model = new ClassPathResource("org/springframework/statemachine/uml/docs/simple-machine.uml"); + return new UmlStateMachineModelFactory(model); + } + } +// end::snippetA[] +} diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.notation new file mode 100644 index 00000000..bf7d563c --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.notation @@ -0,0 +1,97 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.uml new file mode 100644 index 00000000..13fdf9ec --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/docs/simple-machine.uml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + +