diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/EnumStateMachineFactory.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/EnumStateMachineFactory.java index 4a4ebb57..a674bb79 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/EnumStateMachineFactory.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/EnumStateMachineFactory.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Stack; @@ -99,7 +98,7 @@ public class EnumStateMachineFactory, E extends Enum> exten } }; - List> regionStack = new ArrayList>(); + Stack> regionStack = new Stack>(); Stack> stateStack = new Stack>(); Iterable>> postOrderTraversal = traverser.postOrderTraversal(tree.getRoot()); @@ -132,22 +131,45 @@ public class EnumStateMachineFactory, E extends Enum> exten if (peek.isInitial() || (!peek.isInitial() && !machineMap.containsKey(peek.getParent()))) { machineMap.put(peek.getParent(), machine); } - regionStack.add(new MachineStackItem(machine, peek.getParent())); + if (peek.getParent() == null) { + regionStack.push(new MachineStackItem(machine, peek.getParent(), peek)); + } stateStack.push(stateData); } - Collection> regions = new ArrayList>(); - for (MachineStackItem si : regionStack) { - if (si.parent == null) { - regions.add(si.machine); + // TODO: usage of initials is a temporary fix to workaround for missing + // full support of regions + int initials = 0; + if (regionStack.size() > 1) { + Collection> transitionsData = new ArrayList>(); + Collection> stateDatas = new ArrayList>(); + Iterator> i = regionStack.iterator(); + while (i.hasNext()) { + MachineStackItem next = i.next(); + stateDatas.add(next.stateData); + if (next.stateData.isInitial()) { + initials++; + } + } + + if (initials == 1) { + machine = buildMachine(machineMap, stateMap, stateDatas, transitionsData, getBeanFactory()); } } - if (regions.size() > 1) { - RegionState rstate = new RegionState(null, regions); - Collection> states = new ArrayList>(); - states.add(rstate); - machine = new EnumStateMachine(states, null, rstate, null); + if (initials > 1) { + Collection> regions = new ArrayList>(); + for (MachineStackItem si : regionStack) { + if (si.parent == null) { + regions.add(si.machine); + } + } + if (regions.size() > 1) { + RegionState rstate = new RegionState(null, regions); + Collection> states = new ArrayList>(); + states.add(rstate); + machine = new EnumStateMachine(states, null, rstate, null); + } } return machine; @@ -178,11 +200,13 @@ public class EnumStateMachineFactory, E extends Enum> exten StateMachine machine; Object parent; + StateData stateData; - public MachineStackItem(StateMachine machine, Object parent) { + public MachineStackItem(StateMachine machine, Object parent, StateData stateData) { super(); this.machine = machine; this.parent = parent; + this.stateData = stateData; } } @@ -229,7 +253,13 @@ public class EnumStateMachineFactory, E extends Enum> exten state = new StateMachineState(stateData.getState(), stateMachine, stateData.getDeferred(), stateData.getEntryActions(), stateData.getExitActions(), new DefaultPseudoState( PseudoStateKind.INITIAL)); - initialState = state; + // TODO: below if/else doesn't feel right + if (stateDatas.size() > 1 && stateData.isInitial()) { + initialState = state; + } else if (stateDatas.size() == 1) { + initialState = state; + } +// initialState = state; states.add(state); } else { PseudoState pseudoState = null;