package org.squirrelframework.foundation.fsm.impl;
import org.squirrelframework.foundation.component.SquirrelComponent;
import org.squirrelframework.foundation.fsm.*;
import org.squirrelframework.foundation.fsm.builder.*;
import java.util.List;
import java.util.Map;
class TransitionBuilderImpl<T extends StateMachine<T, S, E, C>, S, E, C> implements
ExternalTransitionBuilder<T, S, E, C>, InternalTransitionBuilder<T, S, E, C>, LocalTransitionBuilder<T, S, E, C>,
From<T, S, E, C>, To<T, S, E, C>, On<T, S, E, C>, SquirrelComponent {
private final Map<S, MutableState<T, S, E, C>> states;
private MutableState<T, S, E, C> sourceState;
private MutableState<T, S, E, C> targetState;
private MutableTransition<T, S, E, C> transition;
private final TransitionType transitionType;
private final int priority;
private final ExecutionContext executionContext;
TransitionBuilderImpl(Map<S, MutableState<T, S, E, C>> states, TransitionType transitionType,
int priority, ExecutionContext executionContext) {
this.states = states;
this.transitionType = transitionType;
this.priority = priority;
this.executionContext = executionContext;
}
@Override
public void perform(Action<T, S, E, C> action) {
transition.addAction(action);
}
@Override
public void perform(List<? extends Action<T, S, E, C>> actions) {
transition.addActions(actions);
}
@Override
public void evalMvel(String expression) {
Action<T, S, E, C> action = FSM.newMvelAction(expression, executionContext);
transition.addAction(action);
}
@Override
public void callMethod(final String methodName) {
Action<T, S, E, C> action = FSM.newMethodCallActionProxy(methodName, executionContext);
transition.addAction(action);
}
@Override
public On<T, S, E, C> on(E event) {
transition = sourceState.addTransitionOn(event);
transition.setTargetState(targetState);
transition.setType(transitionType);
transition.setPriority(priority);
return this;
}
@Override
public To<T, S, E, C> to(S stateId) {
targetState = FSM.getState(states, stateId);
return this;
}
@Override
public To<T, S, E, C> toFinal(S stateId) {
targetState = FSM.getState(states, stateId);
if(!targetState.isFinalState()) {
targetState.setFinal(true);
}
return this;
}
@Override
public From<T, S, E, C> from(S stateId) {
sourceState = FSM.getState(states, stateId);
return this;
}
@Override
public When<T, S, E, C> when(Condition<C> condition) {
transition.setCondition(condition);
return this;
}
@Override
public When<T, S, E, C> whenMvel(String expression) {
Condition<C> cond = FSM.newMvelCondition(expression, executionContext.getScriptManager());
transition.setCondition(cond);
return this;
}
@Override
public To<T, S, E, C> within(S stateId) {
sourceState = targetState = FSM.getState(states, stateId);
return this;
}
}