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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+