blob: 773a4be1b2860b01b851c555fe92768ec7c2d3f4 [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
*******************************************************************************/
import SeqMM : 'SeqMM.ecore'::SeqMM;
import StmcMM : 'StmcMM.ecore'::StmcMM;
transformation org::eclipse::qvtd::xtext::qvtrelation::tests::seq2stm::SeqToStm(seqDgm: SeqMM, stm: StmcMM)
{
-- key StmcMM::StateMachine{name};
-- key StmcMM::State{name,owner};
-- key StmcMM::Transition{name,owner,fromState,toState};
-- key StmcMM::SendMsg{message};
key StmcMM::Message{messageId,owner};
top relation DummyToDummy
{
domain seqDgm i:Dummy{};
enforce domain stm s:Dummy{};
}
top relation InteractionToStateMachine
{
sn: String[1];
seqRoot: SeqMM::Dummy;
stmRoot: StmcMM::Dummy;
domain seqDgm i:Interaction{
owner = seqRoot,
name = sn
};
enforce domain stm s:StateMachine{
owner = stmRoot,
name = sn
};
when
{
DummyToDummy(seqRoot, stmRoot);
}
}
top relation StateToState
{
sn: String[1];
domain seqDgm
st1:State
{
name = sn,
lifeline = set:Set(LifeLine){l:LifeLine{interaction = i:Interaction{}} ++ _}
-- lifeline = l:LifeLine{interaction = i:Interaction{}}
};
enforce domain stm
st2:State
{
name = sn,
owner = s:StateMachine{}
};
when
{
InteractionToStateMachine(i, s);
}
}
top relation MessageToTransition
{
mid: String[1];
domain seqDgm
m1:Message
{
messageId = mid,
-- event = send:MessageEvent {type = MessageEventType::Send, state = ist1:State{}},
-- event = receive:MessageEvent {type = MessageEventType::Receive, state = ist2:State{}},
event = eSet:Set(MessageEvent) {
send:MessageEvent {type = MessageEventType::Send, state = ist1:State{}},
receive:MessageEvent {type = MessageEventType::Receive, state = ist2:State{}}
++ _
},
interaction = i:Interaction{}
};
enforce domain stm
tr:Transition
{
name = mid,
fromState = fst:State{},
toState = tst:State{},
action = sm:SendMsg {message = m2:Message{messageId = mid, owner=s.owner}},
owner = s:StateMachine{}
};
when
{
InteractionToStateMachine(i, s);
StateToState(ist1, fst);
StateToState(ist2, tst);
}
}
top relation MessageSequenceToTransitionSequence
{
domain seqDgm
ev1:MessageEvent
{
type = MessageEventType::Receive,
message = m1:Message{},
state = est:State{},
next = ev2:MessageEvent{type=MessageEventType::Send, message=m2:Message{}}
};
enforce domain stm
tr1:Transition
{
toState = tst:State{outTransition = tr2:Transition{}}
};
when
{
StateToState(est, tst); -- Added to get the correct tst:State
MessageToTransition(m1, tr1);
MessageToTransition(m2, tr2);
}
}
}