Example usage for org.springframework.statemachine.access StateMachineAccessor StateMachineAccessor

List of usage examples for org.springframework.statemachine.access StateMachineAccessor StateMachineAccessor

Introduction

In this page you can find the example usage for org.springframework.statemachine.access StateMachineAccessor StateMachineAccessor.

Prototype

StateMachineAccessor

Source Link

Usage

From source file:org.springframework.statemachine.support.AbstractStateMachine.java

@SuppressWarnings("unchecked")
@Override//  w  ww .  ja va 2 s.  com
public StateMachineAccessor<S, E> getStateMachineAccessor() {
    // TODO: needs cleaning and perhaps not an anonymous function
    return new StateMachineAccessor<S, E>() {

        @Override
        public void doWithAllRegions(StateMachineFunction<StateMachineAccess<S, E>> stateMachineAccess) {
            stateMachineAccess.apply(AbstractStateMachine.this);
            for (State<S, E> state : states) {
                if (state.isSubmachineState()) {
                    StateMachine<S, E> submachine = ((AbstractState<S, E>) state).getSubmachine();
                    submachine.getStateMachineAccessor().doWithAllRegions(stateMachineAccess);
                } else if (state.isOrthogonal()) {
                    Collection<Region<S, E>> regions = ((AbstractState<S, E>) state).getRegions();
                    for (Region<S, E> region : regions) {
                        ((StateMachine<S, E>) region).getStateMachineAccessor()
                                .doWithAllRegions(stateMachineAccess);
                    }
                }
            }
        }

        @Override
        public List<StateMachineAccess<S, E>> withAllRegions() {
            List<StateMachineAccess<S, E>> list = new ArrayList<StateMachineAccess<S, E>>();
            list.add(AbstractStateMachine.this);
            for (State<S, E> state : states) {
                if (state.isSubmachineState()) {
                    StateMachine<S, E> submachine = ((AbstractState<S, E>) state).getSubmachine();
                    if (submachine instanceof StateMachineAccess) {
                        list.add((StateMachineAccess<S, E>) submachine);
                    }
                } else if (state.isOrthogonal()) {
                    Collection<Region<S, E>> regions = ((AbstractState<S, E>) state).getRegions();
                    for (Region<S, E> region : regions) {
                        list.add((StateMachineAccess<S, E>) region);
                    }
                }
            }
            return list;
        }

        @Override
        public void doWithRegion(StateMachineFunction<StateMachineAccess<S, E>> stateMachineAccess) {
            stateMachineAccess.apply(AbstractStateMachine.this);
        }

        @Override
        public StateMachineAccess<S, E> withRegion() {
            return AbstractStateMachine.this;
        }
    };
}