From c15bd99d7f87d19b298ccb696cc10cd5495884ea Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 10 Jun 2017 15:24:23 +0100 Subject: [PATCH] Prevent npe on accept - Taking local copy of current state to prevent npe without sync block. - Relates to #364 --- .../statemachine/support/AbstractStateMachine.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) 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 9889f53f..1f8b1ed4 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 @@ -739,12 +739,13 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo } protected synchronized boolean acceptEvent(Message message) { - if ((currentState != null && currentState.shouldDefer(message))) { - log.info("Current state " + currentState + " deferred event " + message); + State cs = currentState; + if ((cs != null && cs.shouldDefer(message))) { + log.info("Current state " + cs + " deferred event " + message); stateMachineExecutor.queueDeferredEvent(message); return true; } - if ((currentState != null && currentState.sendEvent(message))) { + if ((cs != null && cs.sendEvent(message))) { return true; } @@ -756,7 +757,7 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo State source = transition.getSource(); Trigger trigger = transition.getTrigger(); - if (currentState != null && StateMachineUtils.containsAtleastOne(source.getIds(), currentState.getIds())) { + if (cs != null && StateMachineUtils.containsAtleastOne(source.getIds(), cs.getIds())) { if (trigger != null && trigger.evaluate(new DefaultTriggerContext(message.getPayload()))) { stateMachineExecutor.queueEvent(message); return true; @@ -765,8 +766,8 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo } // if we're about to not accept event, check defer again in case // state was changed between original check and now - if ((currentState != null && currentState.shouldDefer(message))) { - log.info("Current state " + currentState + " deferred event " + message); + if ((cs != null && cs.shouldDefer(message))) { + log.info("Current state " + cs + " deferred event " + message); stateMachineExecutor.queueDeferredEvent(message); return true; }