diff --git a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlModelParser.java b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlModelParser.java index 1d836c38..d95c62fd 100644 --- a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlModelParser.java +++ b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlModelParser.java @@ -239,6 +239,16 @@ public class UmlModelParser { String regionId = null; if (state.getContainer().getOwner() instanceof State) { parent = ((State)state.getContainer().getOwner()).getName(); + } else if (state.getContainer().getOwner() instanceof StateMachine) { + // in case of a submachine ref, owner should be StateMachine instead + // of State so try to find from owning submachines states a matching one with a + // same name. + StateMachine owningMachine = (StateMachine)state.getContainer().getOwner(); + parent = owningMachine.getSubmachineStates().stream() + .filter(m -> owningMachine == m.getSubmachine()) + .map(s -> s.getName()) + .findFirst() + .orElse(null); } if (state.getOwner() instanceof Region) { regionId = ((Region)state.getOwner()).getName(); 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 730a5932..284060e9 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 @@ -1082,6 +1082,46 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { assertThat(choiceToS6.latch.await(1, TimeUnit.SECONDS), is(true)); } + @Test + public void testPseudostateInSubmachineHaveCorrectParent() { + context.refresh(); + Resource model = new ClassPathResource("org/springframework/statemachine/uml/pseudostate-in-submachine.uml"); + UmlStateMachineModelFactory builder = new UmlStateMachineModelFactory(model); + assertThat(model.exists(), is(true)); + StateMachineModel stateMachineModel = builder.build(); + assertThat(stateMachineModel, notNullValue()); + Collection> stateDatas = stateMachineModel.getStatesData().getStateData(); + + assertThat(stateDatas.size(), is(4)); + + StateData choiceStateData = stateDatas.stream() + .filter(sd -> "CHOICE".equals(sd.getState())) + .findFirst() + .get(); + assertThat(choiceStateData, notNullValue()); + assertThat(choiceStateData.getParent(), is("S1")); + } + + @Test + public void testPseudostateInSubmachinerefHaveCorrectParent() { + context.refresh(); + Resource model = new ClassPathResource("org/springframework/statemachine/uml/pseudostate-in-submachineref.uml"); + UmlStateMachineModelFactory builder = new UmlStateMachineModelFactory(model); + assertThat(model.exists(), is(true)); + StateMachineModel stateMachineModel = builder.build(); + assertThat(stateMachineModel, notNullValue()); + Collection> stateDatas = stateMachineModel.getStatesData().getStateData(); + + assertThat(stateDatas.size(), is(4)); + + StateData choiceStateData = stateDatas.stream() + .filter(sd -> "CHOICE".equals(sd.getState())) + .findFirst() + .get(); + assertThat(choiceStateData, notNullValue()); + assertThat(choiceStateData.getParent(), is("S1")); + } + @Configuration @EnableStateMachine public static class Config2 extends StateMachineConfigurerAdapter { diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.di new file mode 100644 index 00000000..8c549eec --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.notation new file mode 100644 index 00000000..aa9c5a77 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.notation @@ -0,0 +1,174 @@ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.uml new file mode 100644 index 00000000..61d9d1d4 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachine.uml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.di new file mode 100644 index 00000000..8c549eec --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.notation new file mode 100644 index 00000000..d6ac711a --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.notation @@ -0,0 +1,189 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.uml new file mode 100644 index 00000000..6b0039bd --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/pseudostate-in-submachineref.uml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +