From 89d183f91cc36afca0ff297ff01ed334a7fe0137 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 27 Mar 2016 16:54:57 +0100 Subject: [PATCH] Fix state entry called too many times - Fix double entry in a case that target is initial state and source is target's direct parent. - Fixes #191 --- .../statemachine/support/AbstractStateMachine.java | 13 +++++++++++++ .../src/test/java/demo/showcase/ShowcaseTests.java | 2 ++ 2 files changed, 15 insertions(+) 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 84ae1636..30a683de 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 @@ -988,6 +988,9 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo } else if (isComingFromOtherSubmachine) { } else if (!isSubOfSource && !isSubOfTarget && findDeep2 == null) { } else if (isSubOfSource && !isSubOfTarget && currentState == transition.getTarget()) { + if (isDirectSubstate(transition.getSource(), transition.getTarget())) { + return; + } } else if (!isSubOfSource && !isSubOfTarget && (transition.getSource() == currentState && StateMachineUtils.isSubstate(currentState, transition.getTarget()))) { } else if (!isSubOfSource && !isSubOfTarget) { return; @@ -999,4 +1002,14 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo state.entry(stateContext); } + private static boolean isDirectSubstate(State left, State right) { + // Checks if right hand side is a direct substate of a left hand side. + if (left != null && left.isSubmachineState()) { + StateMachine submachine = ((AbstractState)left).getSubmachine(); + return submachine.getStates().contains(right); + } else { + return false; + } + } + } diff --git a/spring-statemachine-samples/showcase/src/test/java/demo/showcase/ShowcaseTests.java b/spring-statemachine-samples/showcase/src/test/java/demo/showcase/ShowcaseTests.java index a346a897..16ea7b25 100644 --- a/spring-statemachine-samples/showcase/src/test/java/demo/showcase/ShowcaseTests.java +++ b/spring-statemachine-samples/showcase/src/test/java/demo/showcase/ShowcaseTests.java @@ -82,6 +82,8 @@ public class ShowcaseTests { assertThat(listener.stateChangedLatch.await(1, TimeUnit.SECONDS), is(true)); assertThat(listener.stateEnteredLatch.await(1, TimeUnit.SECONDS), is(true)); assertThat(listener.stateExitedLatch.await(1, TimeUnit.SECONDS), is(true)); + assertThat(listener.statesExited.size(), is(2)); + assertThat(listener.statesEntered.size(), is(2)); assertThat(machine.getState().getIds(), contains(States.S0, States.S1, States.S11)); }