package me.bvn13.fsm; import me.bvn13.fsm.dummy.DummyHandler; import me.bvn13.fsm.dummy.DummyProcessor; public class StateBuilder { private final FsmBuilder fsmBuilder; private final String name; private final boolean isInitial; private final boolean isFinishing; private StateHandler beforeHandler = new DummyHandler<>(); private StateHandler afterHandler = new DummyHandler<>(); private StateProcessor processor = new DummyProcessor<>(); StateBuilder(FsmBuilder fsmBuilder, String name, boolean isInitial, boolean isFinishing) { assert !(isInitial && isFinishing); this.fsmBuilder = fsmBuilder; this.name = name; this.isInitial = isInitial; this.isFinishing = isFinishing; } public FsmBuilder end() { fsmBuilder.addState(new State(name, isFinishing) { @Override public void beforeEvent() { beforeHandler.handle(fsmBuilder.getFsm()); } @Override public void afterEvent() { afterHandler.handle(fsmBuilder.getFsm()); } @Override public void process(E event) { processor.process(fsmBuilder.getFsm(), event); } }, isInitial); return fsmBuilder; } public StateBuilder withBeforeHandler(StateHandler handler) { this.beforeHandler = handler; return this; } public StateBuilder withAfterHandler(StateHandler handler) { this.afterHandler = handler; return this; } public StateBuilder withProcessor(StateProcessor processor) { this.processor = processor; return this; } public ConditionBuilder withTransition() { return new ConditionBuilder<>(fsmBuilder, this, name); } }