package org.squirrelframework.foundation.fsm.impl;
import org.squirrelframework.foundation.component.SquirrelProvider;
import org.squirrelframework.foundation.fsm.*;
import org.squirrelframework.foundation.fsm.builder.*;
import org.squirrelframework.foundation.util.TypeReference;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
abstract class FSM {
static <T extends StateMachine<T, S, E, C>, S, E, C> StateContext<T, S, E, C> newStateContext(
StateMachine<T, S, E, C> stateMachine, StateMachineData<T, S, E, C> data,
ImmutableState<T, S, E, C> sourceState, E event, C context,
TransitionResult<T, S, E, C> result, ActionExecutionService<T, S, E, C> executor) {
return new StateContextImpl<T, S, E, C>(stateMachine, data, sourceState, event, context, result, executor);
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MutableTransition<T, S, E, C> newTransition() {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TransitionImpl<T, S, E, C>>() {});
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MutableState<T, S, E, C> newState(S stateId) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<StateImpl<T, S, E, C>>() {},
new Class[] { Object.class }, new Object[] { stateId });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MutableLinkedState<T, S, E, C> newLinkedState(S stateId) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<LinkedStateImpl<T, S, E, C>>() {},
new Class[] { Object.class }, new Object[] { stateId });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MutableTimedState<T, S, E, C> newTimedState(S stateId) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TimedStateImpl<T, S, E, C>>() {},
new Class[] { Object.class }, new Object[] { stateId });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MutableState<T, S, E, C> getState(
Map<S, MutableState<T, S, E, C>> states, S stateId) {
MutableState<T, S, E, C> state = states.get(stateId);
if (state == null) {
state = FSM.newState(stateId);
states.put(stateId, state);
}
return state;
}
static <T extends StateMachine<T, S, E, C>, S, E, C> DeferBoundActionBuilder<T, S, E, C> newDeferBoundActionBuilder(
List<DeferBoundActionInfo<T, S, E, C>> deferBoundActionInfoList, ExecutionContext executionContext
) {
return SquirrelProvider.getInstance().newInstance( new TypeReference<DeferBoundActionBuilderImpl<T, S, E, C>>(){},
new Class[]{List.class, ExecutionContext.class}, new Object[]{deferBoundActionInfoList, executionContext} );
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MultiTransitionBuilder<T, S, E, C> newMultiTransitionBuilder(
Map<S, MutableState<T, S, E, C>> states, TransitionType transitionType, int priority, ExecutionContext executionContext
) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<MultiTransitionBuilderImpl<T, S, E, C>>() {},
new Class[] { Map.class, TransitionType.class, int.class, ExecutionContext.class },
new Object[] { states, transitionType, priority, executionContext });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> ExternalTransitionBuilder<T, S, E, C> newExternalTransitionBuilder(
Map<S, MutableState<T, S, E, C>> states, int priority, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TransitionBuilderImpl<T, S, E, C>>() {},
new Class[] { Map.class, TransitionType.class, int.class, ExecutionContext.class },
new Object[] { states, TransitionType.EXTERNAL, priority, executionContext });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> LocalTransitionBuilder<T, S, E, C> newLocalTransitionBuilder(
Map<S, MutableState<T, S, E, C>> states, int priority, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TransitionBuilderImpl<T, S, E, C>>() {},
new Class[] { Map.class, TransitionType.class, int.class, ExecutionContext.class },
new Object[] { states, TransitionType.LOCAL, priority, executionContext });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> InternalTransitionBuilder<T, S, E, C> newInternalTransitionBuilder(
Map<S, MutableState<T, S, E, C>> states, int priority, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TransitionBuilderImpl<T, S, E, C>>() {},
new Class[] { Map.class, TransitionType.class, int.class, ExecutionContext.class },
new Object[] { states, TransitionType.INTERNAL, priority, executionContext });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> EntryExitActionBuilder<T, S, E, C> newEntryExitActionBuilder(
MutableState<T, S, E, C> state, boolean isEntryAction, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<EntryExitActionBuilderImpl<T, S, E, C>>() {},
new Class[] { MutableState.class, boolean.class, ExecutionContext.class},
new Object[] { state, isEntryAction, executionContext});
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MethodCallActionImpl<T, S, E, C> newMethodCallAction(
Method method, int weight, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(
new TypeReference<MethodCallActionImpl<T, S, E, C>>() {},
new Class[] { Method.class, int.class, ExecutionContext.class },
new Object[] { method, weight, executionContext } );
}
static <T extends StateMachine<T, S, E, C>, S, E, C> MethodCallActionProxyImpl<T, S, E, C> newMethodCallActionProxy(
String methodName, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<MethodCallActionProxyImpl<T, S, E, C>>() {},
new Class[] { String.class, ExecutionContext.class }, new Object[] { methodName, executionContext });
}
static <T extends StateMachine<T, S, E, C>, S, E, C> Actions<T, S, E, C> newActions() {
return SquirrelProvider.getInstance().newInstance(new TypeReference<Actions<T, S, E, C>>() {});
}
static <T extends StateMachine<T, S, E, C>, S, E, C> TransitionResult<T, S, E, C> newResult(
boolean accepted, ImmutableState<T, S, E, C> targetState, TransitionResult<T, S, E, C> parent) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<TransitionResult<T, S, E, C>>() {}).
setAccepted(accepted).setTargetState(targetState).setParent(parent);
}
static <C> Condition<C> newMvelCondition(String expression, MvelScriptManager scriptManager) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<MvelConditionImpl<C>>() {},
new Class<?>[]{String.class, MvelScriptManager.class}, new Object[]{expression, scriptManager});
}
static <T extends StateMachine<T, S, E, C>, S, E, C> Action<T, S, E, C> newMvelAction(
String expression, ExecutionContext executionContext) {
return SquirrelProvider.getInstance().newInstance(new TypeReference<MvelActionImpl<T, S, E, C>>() {},
new Class<?>[]{String.class, ExecutionContext.class}, new Object[]{expression, executionContext});
}
static <T extends StateMachine<T, S, E, C>, S, E, C> StateMachineData<T, S, E, C> newStateMachineData(
Map<S, ? extends ImmutableState<T, S, E, C>> states) {
return SquirrelProvider.getInstance().newInstance(
new TypeReference<StateMachineData<T, S, E, C>>(){},
new Class[]{Map.class}, new Object[]{states} );
}
}