@@ -180,7 +180,7 @@ public StateMachine<S, E> getStateMachine(UUID uuid, String machineId) {
180
180
Stack <MachineStackItem <S , E >> regionStack = new Stack <MachineStackItem <S , E >>();
181
181
Stack <StateData <S , E >> stateStack = new Stack <StateData <S , E >>();
182
182
Map <Object , StateMachine <S , E >> machineMap = new HashMap <Object , StateMachine <S ,E >>();
183
- Map < S , StateHolder <S , E >> holderMap = new HashMap < S , StateHolder < S , E > >();
183
+ List < HolderListItem <S , E >> holderList = new ArrayList < >();
184
184
185
185
Iterator <Node <StateData <S , E >>> iterator = buildStateDataIterator (stateMachineModel );
186
186
while (iterator .hasNext ()) {
@@ -216,7 +216,7 @@ public StateMachine<S, E> getStateMachine(UUID uuid, String machineId) {
216
216
217
217
if (initialCount > 1 ) {
218
218
for (Collection <StateData <S , E >> regionStateDatas : regionsStateDatas ) {
219
- machine = buildMachine (machineMap , stateMap , holderMap , regionStateDatas , transitionsData , resolveBeanFactory (stateMachineModel ),
219
+ machine = buildMachine (machineMap , stateMap , holderList , regionStateDatas , transitionsData , resolveBeanFactory (stateMachineModel ),
220
220
contextEvents , defaultExtendedState , stateMachineModel .getTransitionsData (), resolveTaskExecutor (stateMachineModel ),
221
221
resolveTaskScheduler (stateMachineModel ), machineId , null , stateMachineModel );
222
222
regionStack .push (new MachineStackItem <S , E >(machine ));
@@ -245,7 +245,7 @@ null, defaultExtendedState, null, contextEvents, resolveBeanFactory(stateMachine
245
245
machine = m ;
246
246
}
247
247
} else {
248
- machine = buildMachine (machineMap , stateMap , holderMap , stateDatas , transitionsData , resolveBeanFactory (stateMachineModel ), contextEvents ,
248
+ machine = buildMachine (machineMap , stateMap , holderList , stateDatas , transitionsData , resolveBeanFactory (stateMachineModel ), contextEvents ,
249
249
defaultExtendedState , stateMachineModel .getTransitionsData (), resolveTaskExecutor (stateMachineModel ), resolveTaskScheduler (stateMachineModel ),
250
250
machineId , uuid , stateMachineModel );
251
251
if (peek .isInitial () || (!peek .isInitial () && !machineMap .containsKey (peek .getParent ()))) {
@@ -321,8 +321,8 @@ public void apply(StateMachineAccess<S, E> function) {
321
321
322
322
// go through holders and fix state references which
323
323
// were not known at a time holder was created
324
- for (Entry <S , StateHolder < S , E >> holder : holderMap . entrySet () ) {
325
- holder . getValue () .setState (stateMap .get (holder . getKey () ));
324
+ for (HolderListItem <S , E > holderItem : holderList ) {
325
+ holderItem . value .setState (stateMap .get (holderItem . key ));
326
326
}
327
327
328
328
// set parent machines for each built machine
@@ -519,7 +519,7 @@ private Collection<TransitionData<S, E>> resolveTransitionData2(Collection<Trans
519
519
520
520
@ SuppressWarnings ("unchecked" )
521
521
private StateMachine <S , E > buildMachine (Map <Object , StateMachine <S , E >> machineMap , Map <S , State <S , E >> stateMap ,
522
- Map < S , StateHolder <S , E >> holderMap , Collection <StateData <S , E >> stateDatas , Collection <TransitionData <S , E >> transitionsData ,
522
+ List < HolderListItem <S , E >> holderList , Collection <StateData <S , E >> stateDatas , Collection <TransitionData <S , E >> transitionsData ,
523
523
BeanFactory beanFactory , Boolean contextEvents , DefaultExtendedState defaultExtendedState ,
524
524
TransitionsData <S , E > stateMachineTransitions , TaskExecutor taskExecutor , TaskScheduler taskScheduler , String machineId ,
525
525
UUID uuid , StateMachineModel <S , E > stateMachineModel ) {
@@ -614,7 +614,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
614
614
StateHolder <S , E > defaultStateHolder = new StateHolder <S , E >(defaultState );
615
615
StateHolder <S , E > containingStateHolder = new StateHolder <S , E >(stateMap .get (stateData .getParent ()));
616
616
if (containingStateHolder .getState () == null ) {
617
- holderMap . put (( S )stateData .getParent (), containingStateHolder );
617
+ holderList . add ( new HolderListItem < S , E >(( S )stateData .getParent (), containingStateHolder ) );
618
618
}
619
619
PseudoState <S , E > pseudoState = new HistoryPseudoState <S , E >(PseudoStateKind .HISTORY_SHALLOW , defaultStateHolder , containingStateHolder );
620
620
state = buildStateInternal (stateData .getState (), stateData .getDeferred (), stateData .getEntryActions (),
@@ -634,7 +634,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
634
634
StateHolder <S , E > defaultStateHolder = new StateHolder <S , E >(defaultState );
635
635
StateHolder <S , E > containingStateHolder = new StateHolder <S , E >(stateMap .get (stateData .getParent ()));
636
636
if (containingStateHolder .getState () == null ) {
637
- holderMap . put (( S )stateData .getParent (), containingStateHolder );
637
+ holderList . add ( new HolderListItem < S , E >(( S )stateData .getParent (), containingStateHolder ) );
638
638
}
639
639
PseudoState <S , E > pseudoState = new HistoryPseudoState <S , E >(PseudoStateKind .HISTORY_DEEP , defaultStateHolder , containingStateHolder );
640
640
state = buildStateInternal (stateData .getState (), stateData .getDeferred (), stateData .getEntryActions (),
@@ -651,7 +651,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
651
651
for (ChoiceData <S , E > c : list ) {
652
652
StateHolder <S , E > holder = new StateHolder <S , E >(stateMap .get (c .getTarget ()));
653
653
if (holder .getState () == null ) {
654
- holderMap . put ( c .getTarget (), holder );
654
+ holderList . add ( new HolderListItem < S , E >( c .getTarget (), holder ) );
655
655
}
656
656
choices .add (new ChoiceStateData <S , E >(holder , c .getGuard (), c .getActions ()));
657
657
}
@@ -667,7 +667,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
667
667
for (JunctionData <S , E > c : list ) {
668
668
StateHolder <S , E > holder = new StateHolder <S , E >(stateMap .get (c .getTarget ()));
669
669
if (holder .getState () == null ) {
670
- holderMap . put ( c .getTarget (), holder );
670
+ holderList . add ( new HolderListItem < S , E >( c .getTarget (), holder ) );
671
671
}
672
672
junctions .add (new JunctionStateData <S , E >(holder , c .getGuard (), c .getActions ()));
673
673
}
@@ -696,7 +696,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
696
696
if (s .equals (entry .getSource ())) {
697
697
StateHolder <S , E > holder = new StateHolder <S , E >(stateMap .get (entry .getTarget ()));
698
698
if (holder .getState () == null ) {
699
- holderMap . put ( entry .getTarget (), holder );
699
+ holderList . add ( new HolderListItem < S , E >( entry .getTarget (), holder ) );
700
700
}
701
701
PseudoState <S , E > pseudoState = new ExitPseudoState <S , E >(holder );
702
702
state = buildStateInternal (stateData .getState (), stateData .getDeferred (), stateData .getEntryActions (),
@@ -751,7 +751,7 @@ private StateMachine<S, E> buildMachine(Map<Object, StateMachine<S, E>> machineM
751
751
if (tt .getSource () == s ) {
752
752
StateHolder <S , E > holder = new StateHolder <S , E >(stateMap .get (tt .getTarget ()));
753
753
if (holder .getState () == null ) {
754
- holderMap . put ( tt .getTarget (), holder );
754
+ holderList . add ( new HolderListItem < S , E >( tt .getTarget (), holder ) );
755
755
}
756
756
joinTargets .add (new JoinStateData <S , E >(holder , tt .getGuard ()));
757
757
}
@@ -891,4 +891,14 @@ public void stateMachineStarted(StateMachine<S, E> stateMachine) {
891
891
latch .countDown ();
892
892
}
893
893
}
894
+
895
+ private static class HolderListItem <S , E > {
896
+ S key ;
897
+ StateHolder <S , E > value ;
898
+
899
+ public HolderListItem (S key , StateHolder <S , E > value ) {
900
+ this .key = key ;
901
+ this .value = value ;
902
+ }
903
+ }
894
904
}
0 commit comments