blob: 77bacfa8e0c80d0a8a19a27dcb2ecd00178c98c0 [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 v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.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
{
leafFromStates : Set(hierMM::State) = hierarchicalFromState->closure(nestedStates)->select(nestedStates->isEmpty());
leafToStates : Set(hierMM::State) = hierarchicalToState->closure(nestedStates)->select(nestedStates->isEmpty());
leafFromState : hierMM::State[1];
leafToState : hierMM::State[1];
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);
leafFromStates->includes(leafFromState);
leafToStates->includes(leafToState);
}
}
}