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 880d884b..0934902e 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 @@ -132,6 +132,7 @@ public class UmlModelParser { } StateData stateData = handleActions( new StateData(parent, regionId, state.getName(), UmlUtils.isInitialState(state)), state); + stateData.setDeferred(UmlUtils.resolveDererredEvents(state)); if (UmlUtils.isFinalState(state)) { stateData.setEnd(true); } diff --git a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlUtils.java b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlUtils.java index 8dfb9ac5..99335321 100644 --- a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlUtils.java +++ b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/support/UmlUtils.java @@ -15,18 +15,25 @@ */ package org.springframework.statemachine.uml.support; +import java.util.ArrayList; +import java.util.Collection; + import org.eclipse.emf.common.util.URI; 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.BodyOwner; +import org.eclipse.uml2.uml.Event; import org.eclipse.uml2.uml.FinalState; import org.eclipse.uml2.uml.Model; import org.eclipse.uml2.uml.Pseudostate; import org.eclipse.uml2.uml.PseudostateKind; +import org.eclipse.uml2.uml.Signal; +import org.eclipse.uml2.uml.SignalEvent; import org.eclipse.uml2.uml.State; import org.eclipse.uml2.uml.Transition; +import org.eclipse.uml2.uml.Trigger; import org.eclipse.uml2.uml.UMLPackage; import org.eclipse.uml2.uml.resource.UMLResource; @@ -96,4 +103,22 @@ public abstract class UmlUtils { return null; } } + + /** + * Resolve dererred events from a state. + * + * @param state the state + * @return the collection of deferred events + */ + public static Collection resolveDererredEvents(State state) { + ArrayList events = new ArrayList(); + for (Trigger trigger : state.getDeferrableTriggers()) { + Event event = trigger.getEvent(); + if (event instanceof SignalEvent) { + Signal signal = ((SignalEvent)event).getSignal(); + events.add(signal.getName()); + } + } + return events; + } } 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 a4ffc7c2..b8124b2c 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 @@ -408,6 +408,33 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { assertThat(s2Entry.latch.await(1, TimeUnit.SECONDS), is(true)); } + @Test + public void testSimpleEventDefer() { + context.refresh(); + Resource model1 = new ClassPathResource("org/springframework/statemachine/uml/simple-eventdefer.uml"); + UmlStateMachineModelFactory builder = new UmlStateMachineModelFactory(model1); + 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.getDeferred().size(), is(1)); + assertThat(stateData.getDeferred().iterator().next(), is("E2")); + } else if (stateData.getState().equals("S2")) { + assertThat(stateData.isInitial(), is(false)); + assertThat(stateData.getDeferred().size(), is(0)); + } else if (stateData.getState().equals("S3")) { + assertThat(stateData.isInitial(), is(false)); + assertThat(stateData.getDeferred().size(), is(0)); + } else { + throw new IllegalArgumentException(); + } + } + } + @Configuration @EnableStateMachine public static class Config2 extends StateMachineConfigurerAdapter { diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.notation new file mode 100644 index 00000000..9741a67f --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.notation @@ -0,0 +1,126 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.uml new file mode 100644 index 00000000..91941935 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-eventdefer.uml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +