From 6f2e90f320f2d56068df3f2f5077a96dbdf019f3 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 10 Apr 2016 10:00:50 +0100 Subject: [PATCH] Add final state support for uml model - Relates to #193 --- .../statemachine/uml/UmlModelParser.java | 3 + .../statemachine/uml/UmlUtils.java | 11 ++ .../uml/UmlStateMachineModelFactoryTests.java | 26 ++++ .../statemachine/uml/simple-flat-end.di | 2 + .../statemachine/uml/simple-flat-end.notation | 123 ++++++++++++++++++ .../statemachine/uml/simple-flat-end.uml | 22 ++++ 6 files changed, 187 insertions(+) create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.di create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.notation create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.uml diff --git a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java index 3ff63c77..cd511149 100644 --- a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java +++ b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java @@ -102,6 +102,9 @@ public class UmlModelParser { } StateData stateData = handleActions( new StateData(parent, regionId, state.getName(), UmlUtils.isInitialState(state)), state); + if (UmlUtils.isFinalState(state)) { + stateData.setEnd(true); + } stateDatas.add(stateData); // do recursive handling of regions for (Region sub : state.getRegions()) { diff --git a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlUtils.java b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlUtils.java index 302c26d8..603ab893 100644 --- a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlUtils.java +++ b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlUtils.java @@ -20,6 +20,7 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.uml2.uml.FinalState; import org.eclipse.uml2.uml.Model; import org.eclipse.uml2.uml.Pseudostate; import org.eclipse.uml2.uml.PseudostateKind; @@ -69,4 +70,14 @@ public abstract class UmlUtils { } return false; } + + /** + * Checks if {@link State} is a final state. + * + * @param state the state + * @return true, if is final state + */ + public static boolean isFinalState(State state) { + return state instanceof FinalState; + } } diff --git a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java index f427ed46..f12d376e 100644 --- a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java +++ b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java @@ -132,6 +132,32 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { } } + @Test + public void testSimpleFlatEnd() { + context.refresh(); + Resource model1 = new ClassPathResource("org/springframework/statemachine/uml/simple-flat-end.uml"); + UmlStateMachineModelFactory builder = new UmlStateMachineModelFactory(model1); + builder.setBeanFactory(context); + assertThat(model1.exists(), is(true)); + StateMachineModel stateMachineModel = builder.build(); + assertThat(stateMachineModel, notNullValue()); + Collection> stateDatas = stateMachineModel.getStatesData().getStateData(); + assertThat(stateDatas.size(), is(3)); + for (StateData stateData : stateDatas) { + if (stateData.getState().equals("S1")) { + assertThat(stateData.isInitial(), is(true)); + assertThat(stateData.isEnd(), is(false)); + } else if (stateData.getState().equals("S2")) { + assertThat(stateData.isInitial(), is(false)); + assertThat(stateData.isEnd(), is(false)); + } else if (stateData.getState().equals("S3")) { + assertThat(stateData.isEnd(), is(true)); + } else { + throw new IllegalArgumentException(); + } + } + } + @Test @SuppressWarnings("unchecked") public void testSimpleFlatMachine() throws Exception { diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.notation new file mode 100644 index 00000000..6dd5b5b8 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.notation @@ -0,0 +1,123 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.uml new file mode 100644 index 00000000..ecefbae3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-end.uml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + +