Skip to content

Commit

Permalink
support fsm configuration
Browse files Browse the repository at this point in the history
disableStartEventTriggerEntryActions and disableTerminateEventTriggerExitActions
  • Loading branch information
Kailiang.He committed Dec 22, 2021
1 parent 28b6ccd commit 42668e6
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ private StateMachineConfiguration() {}

private boolean isDelegatorModeEnabled = false;

private boolean isStartEventTriggerEntryActions = true;

private boolean isTerminateEventTriggerExitActions = true;

private IdProvider idProvider = IdProvider.Default.getInstance();

public boolean isAutoStartEnabled() {
Expand Down Expand Up @@ -90,4 +94,23 @@ public StateMachineConfiguration enableDelegatorMode(boolean isDelegatorModeEnab
this.isDelegatorModeEnabled = isDelegatorModeEnabled;
return this;
}

public StateMachineConfiguration disableStartEventTriggerEntryActions(boolean disableStartEventTriggerEntryActions) {
this.isStartEventTriggerEntryActions = !disableStartEventTriggerEntryActions;
return this;
}

public boolean isStartEventTriggerEntryActions() {
return isStartEventTriggerEntryActions;
}

public StateMachineConfiguration disableTerminateEventTriggerExitActions(boolean disableStartEventTriggerEntryActions) {
this.isTerminateEventTriggerExitActions = !disableStartEventTriggerEntryActions;
return this;
}

public boolean isTerminateEventTriggerExitActions() {
return isTerminateEventTriggerExitActions;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ public abstract class AbstractStateMachine<T extends StateMachine<T, S, E, C>, S
private boolean isAutoTerminateEnabled = true;

private boolean isDelegatorModeEnabled = false;

private boolean isStartEventTriggerEntryActions = true;

private boolean isTerminateEventTriggerExitActions = true;

@SuppressWarnings("unused")
private long transitionTimeout = -1;
Expand Down Expand Up @@ -111,6 +115,8 @@ void prePostConstruct(S initialStateId, Map<S, ? extends ImmutableState<T, S, E,
this.isDataIsolateEnabled = configuration.isDataIsolateEnabled();
this.isDebugModeEnabled = configuration.isDebugModeEnabled();
this.isDelegatorModeEnabled = configuration.isDelegatorModeEnabled();
this.isStartEventTriggerEntryActions = configuration.isStartEventTriggerEntryActions();
this.isTerminateEventTriggerExitActions = configuration.isTerminateEventTriggerExitActions();
cb.run();

prepare();
Expand Down Expand Up @@ -548,7 +554,9 @@ private void internalStart(C context, StateMachineData<T, S, E, C> localData,

entryAll(initialRawState, stateContext);
ImmutableState<T, S, E, C> historyState = initialRawState.enterByHistory(stateContext);
executionService.execute();
if (isStartEventTriggerEntryActions) {
executionService.execute();
}
localData.write().currentState(historyState.getStateId());
localData.write().startContext(context);
fireEvent(new StartEventImpl<T, S, E, C>(getThis()));
Expand Down Expand Up @@ -613,8 +621,10 @@ public synchronized void terminate(C context) {
this, data, data.read().currentRawState(), getTerminateEvent(),
context, null, executor);
exitAll(data.read().currentRawState(), stateContext);
executor.execute();

if (isTerminateEventTriggerExitActions) {
executor.execute();
}

setStatus(StateMachineStatus.TERMINATED);
fireEvent(new TerminateEventImpl<T, S, E, C>(getThis()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,8 @@ public String consumeLog() {

StateMachineLogger fsmLogger;

StateMachineBuilder<HierachicalStateMachine, HState, HEvent, Integer> builder;

@BeforeClass
public static void beforeTest() {
}
Expand All @@ -356,9 +358,8 @@ public void teardown() {

@Before
public void setup() {
StateMachineBuilder<HierachicalStateMachine, HState, HEvent, Integer> builder =
StateMachineBuilderFactory.create(HierachicalStateMachine.class,
HState.class, HEvent.class, Integer.class, new Class<?>[0]);
builder = StateMachineBuilderFactory.create(HierachicalStateMachine.class,
HState.class, HEvent.class, Integer.class, new Class<?>[0]);
builder.externalTransition().from(HState.A).to(HState.B).on(HEvent.A2B);
builder.externalTransition().from(HState.B).to(HState.A).on(HEvent.B2A);

Expand All @@ -371,9 +372,16 @@ public void setup() {

builder.defineFinishEvent(HEvent.Finish);

stateMachine = builder.newStateMachine(HState.A, StateMachineConfiguration.create().enableDebugMode(true));
}

@Test
public void testIgnoreStateEntryWhenStart() {
stateMachine = builder.newStateMachine(HState.A,
StateMachineConfiguration.create().enableDebugMode(true),
new Object[0]);
StateMachineConfiguration.create().enableDebugMode(true).disableStartEventTriggerEntryActions(true));
stateMachine.start();
assertThat(stateMachine.consumeLog(), is(equalTo("")));
assertThat(stateMachine.getCurrentState(), is(equalTo(HState.A1)));
}

@Test
Expand Down

0 comments on commit 42668e6

Please sign in to comment.