From bf793d90b142e09f83e896ec764ced776ad9e35a Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 18 Mar 2015 09:14:20 +0000 Subject: [PATCH] Tune action handling and concept - Statemachine now available in StateContext - Added single actions to StateConfigurer instead of forcing to use Collection. --- .../statemachine/StateContext.java | 7 +++++++ .../configurers/DefaultStateConfigurer.java | 15 +++++++++++++++ .../config/configurers/StateConfigurer.java | 2 ++ .../support/AbstractStateMachine.java | 8 ++++---- .../statemachine/support/DefaultStateContext.java | 11 ++++++++++- .../statemachine/config/ConfigurationTests.java | 1 + .../guard/SpelExpressionGuardTests.java | 2 +- 7 files changed, 40 insertions(+), 6 deletions(-) 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 9eaebce7..ae7a64e6 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 @@ -60,4 +60,11 @@ public interface StateContext { */ Transition getTransition(); + /** + * Gets the state machine. + * + * @return the state machine + */ + StateMachine getStateMachine(); + } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultStateConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultStateConfigurer.java index a38b797e..4b2ae153 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultStateConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultStateConfigurer.java @@ -87,6 +87,21 @@ public class DefaultStateConfigurer return this; } + @Override + public StateConfigurer state(S state, Action entryAction, Action exitAction) { + Collection> entryActions = null; + if (entryAction != null) { + entryActions = new ArrayList>(1); + entryActions.add(entryAction); + } + Collection> exitActions = null; + if (exitAction != null) { + exitActions = new ArrayList>(1); + exitActions.add(exitAction); + } + return state(state, entryActions, exitActions); + } + @Override public StateConfigurer state(S state, E... deferred) { Collection d = null; diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/StateConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/StateConfigurer.java index b42184a9..dbf78dcb 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/StateConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/StateConfigurer.java @@ -34,6 +34,8 @@ public interface StateConfigurer extends StateConfigurer state(S state, Collection> entryActions, Collection> exitActions); + StateConfigurer state(S state, Action entryAction, Action exitAction); + StateConfigurer state(S state, E... deferred); StateConfigurer states(Set states); 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 d85ccf0f..bb4325bd 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 @@ -312,7 +312,7 @@ 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); + StateContext stateContext = new DefaultStateContext(messageHeaders, extendedState, transition, this); state.exit(event != null ? event.getPayload() : null, stateContext); } } @@ -322,7 +322,7 @@ 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); + StateContext stateContext = new DefaultStateContext(messageHeaders, extendedState, transition, this); state.entry(event != null ? event.getPayload() : null, stateContext); } } @@ -395,7 +395,7 @@ public abstract class AbstractStateMachine extends LifecycleObjectSupport while ((queueItem = triggerQueue.poll()) != null) { Message queuedEvent = queueItem.message; Transition transition = triggerToTransitionMap.get(queueItem.trigger); - StateContext stateContext = new DefaultStateContext(queuedEvent != null ? queuedEvent.getHeaders() : null, extendedState, transition); + StateContext stateContext = new DefaultStateContext(queuedEvent != null ? queuedEvent.getHeaders() : null, extendedState, transition, this); if (transition == null) { continue; } @@ -426,7 +426,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); + StateContext stateContext = new DefaultStateContext(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 375a1657..24d9d545 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 @@ -18,6 +18,7 @@ package org.springframework.statemachine.support; import org.springframework.messaging.MessageHeaders; import org.springframework.statemachine.ExtendedState; import org.springframework.statemachine.StateContext; +import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.transition.Transition; public class DefaultStateContext implements StateContext { @@ -28,10 +29,13 @@ public class DefaultStateContext implements StateContext { private final Transition transition; - public DefaultStateContext(MessageHeaders messageHeaders, ExtendedState extendedState, Transition transition) { + private final StateMachine stateMachine; + + public DefaultStateContext(MessageHeaders messageHeaders, ExtendedState extendedState, Transition transition, StateMachine stateMachine) { this.messageHeaders = messageHeaders; this.extendedState = extendedState; this.transition = transition; + this.stateMachine = stateMachine; } @Override @@ -59,4 +63,9 @@ public class DefaultStateContext implements StateContext { return transition; } + @Override + public StateMachine getStateMachine() { + return stateMachine; + } + } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java index 5297fa2f..3575b56a 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java @@ -252,6 +252,7 @@ public class ConfigurationTests extends AbstractStateMachineTests { .withStates() .initial(TestStates.S11) .state(TestStates.S11, actions1, Arrays.asList(action2())) + .state(TestStates.S12, action1(), action2()) .and() .withStates() .parent(TestStates.S11) 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 cd3ccb95..5d335f70 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); + DefaultStateContext stateContext = new DefaultStateContext(headers, null, null, null); assertThat(guard.evaluate(stateContext), is(true)); }