| /******************************************************************************* |
| * Copyright (c) 2007,2008 Tata Consultancy Services and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * TCS - initial implementation for ModelMorf |
| * E.D.Willink - alignment with evolved specification |
| * E.D.Willink - rename / comment |
| *******************************************************************************/ |
| import hierMM : 'HierarchicalStateMachine.ecore'::HierarchicalStateMachine; |
| import flatMM : 'FlatStateMachine.ecore'::FlatStateMachine; |
| |
| /** |
| * Transform a hierarchical StateMachine into a flat StateMachine. |
| */ |
| transformation org::eclipse::qvtd::examples::qvtrelation::hstm2fstm::HierarchicalStateMachine2FlatStateMachine(hier:hierMM, flat:flatMM) |
| { |
| -- key hierMM::State {name}; |
| -- key hierMM::Trans {name, fromState, toState}; |
| -- key flatMM::State {name}; |
| -- key flatMM::Trans {name, fromState, toState}; |
| |
| /** |
| * Return the leafStates of a given hierarchicalState. |
| */ |
| query getLeafStates(hierarchicalState : hierMM::State[1]) : Set(hierMM::State) { |
| hierarchicalState->closure(nestedStates)?->select(nestedStates->isEmpty()) |
| } |
| |
| /** |
| * Map each hierarchical StateMachine to a flat StateMachine |
| */ |
| top relation HierachicalStateMachine2FlatStateMachine { |
| domain hier hierarchicalStateMachine : StateMachine { |
| name = stateMachineName : String{} |
| }; |
| enforce domain flat flatStateMachine : StateMachine { |
| name = stateMachineName |
| }; |
| } |
| |
| /** |
| * Map each Leaf State to a Flat State in the corresponding StateMachine. |
| */ |
| top relation LeafState2FlatState { |
| domain hier leafState : State { |
| owningStateMachine = hierarchicalStateMachine : hierMM::StateMachine{}, |
| name = stateName : String{} |
| } {leafState.nestedStates->isEmpty()}; |
| |
| enforce domain flat flatState : State { |
| owningStateMachine = flatStateMachine : StateMachine{}, |
| name = stateName |
| }; |
| when { |
| HierachicalStateMachine2FlatStateMachine(hierarchicalStateMachine, flatStateMachine); |
| } |
| } |
| |
| /** |
| * Map each hierarchical Transition to a Flat Transition in the corresponding StateMachine |
| * for each combination of possible leaf end states |
| */ |
| top relation HierachicalTransition2FlatTransition |
| { |
| leafFromState : hierMM::State; |
| leafToState : hierMM::State; |
| domain hier hierarchicalTransition : Transition { |
| owningStateMachine = hierarchicalStateMachine : StateMachine{}, |
| name = transitionName : String{}, |
| fromState = hierarchicalFromState : State{}, |
| toState = hierarchicalToState : State{} |
| }; |
| enforce domain flat flatTransition : Transition { |
| owningStateMachine = flatStateMachine : StateMachine{}, |
| name = transitionName, |
| fromState = flatFromState : State{}, |
| toState = flatToState : State{} |
| }; |
| when { |
| HierachicalStateMachine2FlatStateMachine(hierarchicalStateMachine, flatStateMachine); |
| LeafState2FlatState(leafFromState, flatFromState); |
| LeafState2FlatState(leafToState, flatToState); |
| this.getLeafStates(hierarchicalFromState)->includes(leafFromState); |
| this.getLeafStates(hierarchicalToState)->includes(leafToState); |
| } |
| } |
| } |