diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/StateContext.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/StateContext.java index ae7a64e6..a49fb426 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/StateContext.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/StateContext.java @@ -30,6 +30,14 @@ import org.springframework.statemachine.transition.Transition; */ public interface StateContext { + /** + * Gets the event associated with a context. Event may be null if transition + * is not triggered by a signal. + * + * @return the event + */ + E getEvent(); + /** * Gets the event message headers. * diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java index 3f8e0511..44d4cdca 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java @@ -226,7 +226,7 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport switchToState(initialState, initialEvent, null, this); // TODO: for now execute outside of switchToState if (initialTransition != null) { - StateContext stateContext = new DefaultStateContext( + StateContext stateContext = new DefaultStateContext(initialEvent != null ? initialEvent.getPayload() : null, initialEvent != null ? initialEvent.getHeaders() : null, extendedState, initialTransition, this); initialTransition.transit(stateContext); } @@ -414,7 +414,8 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport log.trace("Exit state=[" + state + "]"); MessageHeaders messageHeaders = event != null ? event.getHeaders() : new MessageHeaders( new HashMap()); - StateContext stateContext = new DefaultStateContext(messageHeaders, extendedState, transition, stateMachine); + StateContext stateContext = new DefaultStateContext(event != null ? event.getPayload() : null, + messageHeaders, extendedState, transition, stateMachine); State findDeep = findDeepParent(transition.getTarget()); boolean isTargetSubOfOtherState = findDeep != null && findDeep != currentState; @@ -444,7 +445,8 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport log.trace("Enter state=[" + state + "]"); MessageHeaders messageHeaders = event != null ? event.getHeaders() : new MessageHeaders( new HashMap()); - StateContext stateContext = new DefaultStateContext(messageHeaders, extendedState, transition, stateMachine); + StateContext stateContext = new DefaultStateContext(event != null ? event.getPayload() : null, + messageHeaders, extendedState, transition, stateMachine); if (transition != null) { State findDeep1 = findDeepParent(transition.getTarget()); @@ -571,7 +573,7 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport // go through candidates and transit max one for (Transition t : trans) { - StateContext stateContext = new DefaultStateContext( + StateContext stateContext = new DefaultStateContext(queuedEvent != null ? queuedEvent.getPayload() : null, queuedEvent != null ? queuedEvent.getHeaders() : null, extendedState, t, this); if (t == null) { continue; @@ -607,7 +609,7 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport if (sourceState != null && targetState != null) { MessageHeaders messageHeaders = event != null ? event.getHeaders() : new MessageHeaders( new HashMap()); - StateContext stateContext = new DefaultStateContext(messageHeaders, extendedState, null, this); + StateContext stateContext = new DefaultStateContext(event != null ? event.getPayload() : null, messageHeaders, extendedState, null, this); getStateMachineHandlerResults(getStateMachineHandlers(sourceState, targetState), stateContext); } } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateContext.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateContext.java index 24d9d545..e11eeccf 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateContext.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateContext.java @@ -23,6 +23,8 @@ import org.springframework.statemachine.transition.Transition; public class DefaultStateContext implements StateContext { + private final E event; + private final MessageHeaders messageHeaders; private final ExtendedState extendedState; @@ -31,12 +33,18 @@ public class DefaultStateContext implements StateContext { private final StateMachine stateMachine; - public DefaultStateContext(MessageHeaders messageHeaders, ExtendedState extendedState, Transition transition, StateMachine stateMachine) { + public DefaultStateContext(E event, MessageHeaders messageHeaders, ExtendedState extendedState, Transition transition, StateMachine stateMachine) { + this.event = event; this.messageHeaders = messageHeaders; this.extendedState = extendedState; this.transition = transition; this.stateMachine = stateMachine; } + + @Override + public E getEvent() { + return event; + } @Override public MessageHeaders getMessageHeaders() { diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests.java index 2ce64e51..c473c14d 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests.java @@ -25,6 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; import org.springframework.statemachine.AbstractStateMachineTests; import org.springframework.statemachine.StateContext; import org.springframework.statemachine.StateMachine; @@ -313,5 +315,24 @@ public class DocsConfigurationSampleTests extends AbstractStateMachineTests { public static class Config9 extends EnumStateMachineConfigurerAdapter { } // end::snippetN[] + + static class DummyShowSendEvent { + +// tag::snippetO[] + @Autowired + StateMachine stateMachine; + + void signalMachine() { + stateMachine.sendEvent(Events.E1); + + Message message = MessageBuilder + .withPayload(Events.E2) + .setHeader("foo", "bar") + .build(); + stateMachine.sendEvent(message); + } +// end::snippetO[] + + } } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/guard/SpelExpressionGuardTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/guard/SpelExpressionGuardTests.java index 5d335f70..8ec1c6d0 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/guard/SpelExpressionGuardTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/guard/SpelExpressionGuardTests.java @@ -59,7 +59,7 @@ public class SpelExpressionGuardTests extends AbstractStateMachineTests { Map map = new HashMap(); map.put("foo", "bar"); MessageHeaders headers = new MessageHeaders(map); - DefaultStateContext stateContext = new DefaultStateContext(headers, null, null, null); + DefaultStateContext stateContext = new DefaultStateContext(null, headers, null, null, null); assertThat(guard.evaluate(stateContext), is(true)); }