blob: 2e2677f2d3d12d55bd29eb97ec027f18351a80bc [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}