/** * <copyright> * </copyright> * * $Id$ */ package net.sf.orcc.df.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.sf.orcc.df.Action; import net.sf.orcc.df.DfFactory; import net.sf.orcc.df.DfPackage; import net.sf.orcc.df.FSM; import net.sf.orcc.df.State; import net.sf.orcc.df.Transition; import net.sf.orcc.graph.Edge; import net.sf.orcc.graph.impl.GraphImpl; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; /** * <!-- begin-user-doc --> An implementation of the model object ' * <em><b>FSM</b></em>'. <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link net.sf.orcc.df.impl.FSMImpl#getInitialState <em>Initial State</em>}</li> * </ul> * </p> * * @generated */ public class FSMImpl extends GraphImpl implements FSM { /** * The cached value of the '{@link #getInitialState() <em>Initial State</em>}' reference. * <!-- begin-user-doc --> <!-- * end-user-doc --> * @see #getInitialState() * @generated * @ordered */ protected State initialState; /** * <!-- begin-user-doc --> <!-- end-user-doc --> * */ protected FSMImpl() { super(); } @Override public Transition addTransition(State source, Action action, State target) { Transition transition = DfFactory.eINSTANCE.createTransition(source, action, target); getTransitions().add(transition); return transition; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ public State basicGetInitialState() { return initialState; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case DfPackage.FSM__INITIAL_STATE: if (resolve) return getInitialState(); return basicGetInitialState(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case DfPackage.FSM__INITIAL_STATE: return initialState != null; } return super.eIsSet(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case DfPackage.FSM__INITIAL_STATE: setInitialState((State) newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return DfPackage.Literals.FSM; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case DfPackage.FSM__INITIAL_STATE: setInitialState((State) null); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ public State getInitialState() { if (initialState != null && initialState.eIsProxy()) { InternalEObject oldInitialState = (InternalEObject) initialState; initialState = (State) eResolveProxy(oldInitialState); if (initialState != oldInitialState) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, DfPackage.FSM__INITIAL_STATE, oldInitialState, initialState)); } } return initialState; } @Override @SuppressWarnings("unchecked") public EList<State> getStates() { return (EList<State>) (EList<?>) getVertices(); } @Override public List<Action> getTargetActions(State source) { List<Action> actions = new ArrayList<Action>(); for (Edge edge : source.getOutgoing()) { Transition transition = (Transition) edge; actions.add(transition.getAction()); } return actions; } @Override @SuppressWarnings("unchecked") public EList<Transition> getTransitions() { return (EList<Transition>) (EList<?>) getEdges(); } @Override public void removeTransition(State source, Action action) { Iterator<Edge> it = source.getOutgoing().iterator(); while (it.hasNext()) { Transition transition = (Transition) it.next(); Action candidate = transition.getAction(); if (candidate == action) { it.remove(); return; } } } @Override public void replaceTarget(State source, Action action, State target) { Iterator<Edge> it = source.getOutgoing().iterator(); while (it.hasNext()) { Transition transition = (Transition) it.next(); Action candidate = transition.getAction(); if (candidate == action) { // updates target state of this transition transition.setTarget(target); return; } } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ public void setInitialState(State newInitialState) { State oldInitialState = initialState; initialState = newInitialState; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, DfPackage.FSM__INITIAL_STATE, oldInitialState, initialState)); } } // FSMImpl