显示在给定状态下可用的事件?

时间:2016-07-05 14:22:54

标签: spring-statemachine

我正在尝试根据对象状态找到一种渲染UI按钮(动作)的方法。有没有办法询问状态机:“向我展示适用于给定状态的事件?”配置示例:

public class OfcProjectVersionSMConfiguration extends EnumStateMachineConfigurerAdapter<OfcProjectVersionStates, OfcProjectVersionEvents>
....
public void configure(StateMachineTransitionConfigurer<OfcProjectVersionStates, OfcProjectVersionEvents> transitions) throws Exception {
    transitions 
        .withExternal().source(OfcProjectVersionStates.DRAFT).target(OfcProjectVersionStates.DRAFT).event(OfcProjectVersionEvents.U)
        .and()
        .withExternal().source(OfcProjectVersionStates.DRAFT).target(OfcProjectVersionStates.DELETED).event(OfcProjectVersionEvents.D)
        ....

2 个答案:

答案 0 :(得分:0)

我发现这可行,但不确定这是否正确。

public abstract class GenericEnumStateMachineUtils extends StateMachineUtils {

public static <S, E> Collection<E> findEventsForState(StateMachine<S, E> stateMachine, S state) {
    Collection<E> eventsForState = stateMachine.getTransitions().stream().filter(p -> p.getSource().getId().equals(state)).map(p -> p.getTrigger().getEvent()).collect(Collectors.toCollection(ArrayList::new));
    return eventsForState;
}

答案 1 :(得分:0)

不幸的是,我们没有任何可靠的方法来了解处于特定状态的机器是否适用于处理/接受某些事件。将事件作为枚举,您知道可能的值,但如果事件是字符串,则您拥有无限的可能值列表,除非您将这些值存储在列表中。

如果你有深层嵌套的分层状态,你可能会有不同的事件,如果最低活跃状态不接受事件,然后提供给它的父状态等等,那就更复杂了。

麻烦的是,可能会有警卫进行动态评估,并询问机器会接受哪些事件就像预测未来机器会做什么一样。