package jetbrains.mps.samples.secretCompartmentLanguage.runtime; /*Generated by MPS */ import java.util.Collection; import java.util.List; import java.util.ArrayList; public class StateMachine { private State start; public StateMachine(State start) { this.start = start; } /*package*/ State getStart() { return start; } /*package*/ Collection<State> getStates() { List<State> result = new ArrayList<State>(); gatherForwards(result, start); return result; } private void gatherForwards(Collection<State> result, State start) { if (result.contains(start)) { return; } else { result.add(start); for (State next : start.getAllTargets()) { gatherForwards(result, next); } return; } } public void addResetEvents(Event... events) { for (Event e : events) { addResetEvent(e); } } private void addResetEvent(Event e) { for (State s : getStates()) { if (!(s.hasTransition(e.getCode()))) { s.addTransition(e, start); } } } @Override public String toString() { if (null == start) { return "Null Start State"; } StringBuilder result = new StringBuilder(); for (State s : getStates()) { result.append(s); } return result.toString(); } /*package*/ State getState(String arg) { for (State s : getStates()) { if (arg.equals(s.getName())) { return s; } } return null; } public Notification compare(StateMachine other) { Notification result = new Notification(); compareNumberOfStates(other, result); return result; } private void compareNumberOfStates(StateMachine other, Notification note) { for (State s : getStates()) { compareState(s, other, note); } for (State s : other.getStates()) { if (null == getState(s.getName())) { note.error("extra state: %s", s.getName()); } } } private void compareState(State state, StateMachine otherMachine, Notification note) { State otherState = otherMachine.getState(state.getName()); if (null == otherState) { note.error("missing state: %s", state.getName()); } else { state.compare(otherState, note); } } public String toDot() { StringBuilder result = new StringBuilder(); result.append("digraph state_machine {"); for (State s : getStates()) { s.toDot(result); } result.append("}"); return result.toString(); } }