Archive des trois projets à importer (Import > General > Existing projects into workspace > Select archive file
).
Le métamodèle des automates

L'instance utilisée pour les tests
<?xml version="1.0" encoding="ASCII"?> <stateMachine:StateMachine xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:stateMachine="http://www.example.org/stateMachine" xsi:schemaLocation="http://www.example.org/stateMachine stateMachine.ecore" name="machine"> <states name="A" isInitial="true"> <transitions guard="//@inputs.0" output="//@outputs.0" target="//@states.1"/> </states> <states name="B"> <transitions guard="//@inputs.1" output="//@outputs.1" target="//@states.0"/> </states> <inputs name="a"/> <inputs name="b"/> <outputs name="x"/> <outputs name="y"/> </stateMachine:StateMachine>
Le métamodèle objet

La transformation QVT operational
modeltype FSM "strict" uses stateMachine('http://www.example.org/stateMachine'); modeltype OBJ "strict" uses objectModel('http://www.example.org/objectModel'); transformation Machine2Object(in fsm:FSM, out obj:OBJ); main() { fsm.rootObjects()[StateMachine]->map toObject(); } mapping StateMachine::toObject() : FSMClass { // Fail is the state machine does not have exactly one initial state. assert(self.states->select(s | s.isInitial)->size() = 1) with log ("Erreur état initial"); result.name := self.name ; result.states := self.states->map toObject(); result.initialState := self.states->select(s | s.isInitial).resolveoneIn(State::toObject); } mapping State::toObject() : StateClass { result.name := self.name; result.transitions := self.transitions->map toObject() ; } mapping Transition::toObject() : TransitionClass { result.guard := self.guard.name; result.action := self.output.name; result.target := self.target.late resolveoneIn(State::toObject); }