/** * */ package eu.quanticol.carma.simulator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; /** * @author loreti * */ public class CarmaProcessAutomaton { private String processName; private int stateCounter; private HashMap<String,State> states; private State init; public CarmaProcessAutomaton(String processName) { this.stateCounter = 0; this.states = new HashMap<String,State>(); this.processName = processName; } public State newState( String name ) { if (states.containsKey(name)) { throw new IllegalArgumentException("Duplicated state name!"); } State s = new State (stateCounter++ , name); states.put(name,s); if (init == null) { this.init = s; } return s; } public void addTransition( State s1 , CarmaAction action , State s2 ) { s1.addTransition(action, s2,false); } public void addTransition( State s1 , CarmaAction action , State s2 , boolean isKill ) { s1.addTransition(action, s2,isKill); } public void addTransition( State s1 , CarmaPredicate predicate , CarmaAction action , State s2 , boolean isKill ) { s1.addTransition(predicate , action, s2,isKill); } public void addTransition( State s1 , CarmaPredicate predicate , CarmaAction action , State s2 ) { s1.addTransition(predicate , action, s2,false); } public class Transition { private CarmaAction action; private State nextState; private CarmaPredicate guard; private boolean isKill; public Transition(CarmaAction action , State nextState ) { this(CarmaPredicate.TRUE,action,nextState,false); } public Transition(CarmaAction action , State nextState , boolean isKill ) { this(CarmaPredicate.TRUE,action,nextState,isKill); } public Transition(CarmaPredicate guard , CarmaAction action , State nextState ) { this(guard,action,nextState,false); } public Transition(CarmaPredicate guard , CarmaAction action , State nextState , boolean isKill ) { this.guard = guard; this.action = action; this.nextState = nextState; this.isKill = isKill; } /** * @return the action */ public CarmaAction getAction() { return action; } /** * @return the next */ public State getNextState() { return nextState; } public CarmaPredicate getGuard() { return guard; } public boolean isKill() { return isKill; } } public class State { private int id; private String name; private LinkedList<Transition> transitions = new LinkedList<Transition>(); public State(int id, String name) { this.id = id; this.name = name; } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return id; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj instanceof State) { return this.id == ((State) obj).id; } return false; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return processName+"["+name+"]"; } private void addTransition( CarmaAction act , State next , boolean isKill ) { transitions.add(new Transition(act,next,isKill)); } public void addTransition(CarmaPredicate guard, CarmaAction act, State next, boolean isKill) { transitions.add(new Transition(guard,act,next,isKill)); } public LinkedList<Transition> getTransitions() { return transitions; } public String getName() { return name; } } public State getInitialState() { return init; } public String getName() { return processName; } public State getState(String name) { return states.get(name); } }