@@ -40,18 +40,18 @@ public class GenericStateMachine<T extends State> implements StateMachine<T> {
4040
4141 // states, and the routers that route them
4242 private ExecutorService executor = _newExecutor ();
43- private final Map <StateWrapper , StateContainer > states = new HashMap <StateWrapper , StateContainer >();
44- private final List <StateRouter <T >> routers = new ArrayList <StateRouter < T > >();
43+ private final Map <StateWrapper , StateContainer > states = new HashMap <>();
44+ private final List <StateRouter <T >> routers = new ArrayList <>();
4545
4646 // sequence matching
4747 private int maxRecent = 0 ;
48- private final Queue <State > recentStates = new ArrayDeque <State >();
49- private final Set <PatternMatcher > matchers = new HashSet <PatternMatcher >();
48+ private final Queue <StateContainer > recentStates = new ArrayDeque <>();
49+ private final Set <PatternMatcher > matchers = new HashSet <>();
5050
5151 // global handlers
52- private final Set <StateHandler <T >> globalOnEntryHandlers = new HashSet <StateHandler < T > >();
53- private final Set <StateHandler <T >> globalOnExitHandlers = new HashSet <StateHandler < T > >();
54- private final Set <TransitionHandler <T >> globalOnTransitionHandlers = new HashSet <TransitionHandler < T > >();
52+ private final Set <StateHandler <T >> globalOnEntryHandlers = new HashSet <>();
53+ private final Set <StateHandler <T >> globalOnExitHandlers = new HashSet <>();
54+ private final Set <TransitionHandler <T >> globalOnTransitionHandlers = new HashSet <>();
5555
5656 // backing data
5757 private StateContainer initial ;
@@ -78,6 +78,9 @@ public synchronized void reset() {
7878 current = initial ;
7979 recentStates .clear ();
8080 executor = _newExecutor ();
81+
82+ // add back the initial state for pattern matching
83+ recentStates .add (initial );
8184 }
8285
8386 @ Override
@@ -146,15 +149,15 @@ private boolean _transition(final StateContainer nextState) {
146149 @ SuppressWarnings ("unchecked" )
147150 private void doPatternMatching (StateContainer nextState ) {
148151 if (maxRecent != 0 ) {
149- recentStates .add (nextState . state );
152+ recentStates .add (nextState );
150153 }
151154
152155 if (recentStates .size () > maxRecent ) {
153156 recentStates .remove ();
154157 }
155158
156- final List <State > recent
157- = Collections .unmodifiableList (new ArrayList <State >(recentStates ));
159+ final List <StateContainer > recent
160+ = Collections .unmodifiableList (new ArrayList <>(recentStates ));
158161
159162 for (PatternMatcher matcher : matchers ) {
160163 if (matcher .matches (recent .iterator (), recent .size ())) {
@@ -641,13 +644,21 @@ private static class PatternMatcher {
641644 this .handler = handler ;
642645 }
643646
644- boolean matches (Iterator <State > it , int size ) {
647+ boolean matches (Iterator <StateContainer > it , int size ) {
645648 if (size < pattern .size ()) {
646649 return false ;
647650 }
648651
649652 for (State state : pattern ) {
650- if (!state .equals (it .next ())) {
653+ State nextState = it .next ().state ;
654+
655+ if (state == null ) {
656+ if (nextState != null ) {
657+ return false ;
658+ }
659+ } else if (nextState == null ) {
660+ return false ;
661+ } else if (!state .equals (nextState )) {
651662 return false ;
652663 }
653664 }
0 commit comments