blob: 89b8388d2bb678ead5fec30adca67d0a6186e281 [file] [log] [blame]
-- @atlcompiler atl2006
module CreateWeaving; -- Module Template
create OUT : AMW from left : MOF, right : MOF;
---------------------------------------------------------------------------------------------------
---------------------- generic helpers used for auxiliar tasks-----------------------------------------------------------------------------
helper def: methodName : String = 'Cartesian product';
helper def: aModel : AMW!MatchModel = OclUndefined;
helper def: leftModel : String = '0_/Match_by_operation/examples/ex1_in_out/inschema.ecore';
helper def: rightModel : String = '1_/Match_by_operation/examples/ex1_in_out/outschema.ecore';
helper context MOF!EModelElement def : isLeft() : Boolean =
MOF!EModelElement.allInstancesFrom('left')->exists(e | e = self);
helper context MOF!EModelElement def : isRight() : Boolean =
MOF!EModelElement.allInstancesFrom('right')->exists(e | e = self);
helper context MOF!EStructuralFeature def : isLeftsf() : Boolean =
self.eContainingClass.isLeft();
helper context MOF!EStructuralFeature def : isRightsf() : Boolean =
self.eContainingClass.isRight();
helper context MOF!EClass def : mySide() : String =
if self.isLeft() then
'left'
else
if self.isRight() then
'right'
else
'undefined side'
endif
endif;
helper context MOF!EStructuralFeature def : mySidesf() : String =
if self.isLeftsf() then
'left'
else
if self.isRightsf() then
'right'
else
'undefined side'
endif
endif;
helper context MOF!EModelElement def : setModelRef : String =
if self.isLeft() then
thisModule.aModel.leftM
else
if self.isRight() then
thisModule.aModel.rightM
else
OclUndefined
endif
endif;
---------------------- end of generic helpers used for auxiliar tasks-----------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
entrypoint rule CreateInitialElements() {
to
model : AMW!MatchModel (
name <- 'WeavingModel',
leftM <- lefta,
rightM <- righta,
methods <- Sequence {method}
),
lefta : AMW!ModelRef (
name <- 'leftM',
ref <- thisModule.leftModel
),
righta : AMW!ModelRef (
name <- 'rightM',
ref <- thisModule.rightModel
),
method : AMW!Method (
name <- thisModule.methodName
)
do {
thisModule.aModel <- model;
}
}
rule ElementRefs {
from
element : MOF!EModelElement
to
out : AMW!ElementRef (
name <- element.name,
ref <- element.__xmiID__,
modelRef <- element.setModelRef
)
}
--
abstract rule PairWiseModelElement {
from
left : MOF!EModelElement, right : MOF!EModelElement (
left.isLeft() and right.isRight()
)
to
alink : AMW!Equivalent (
name <- left.name + '_' + right.name,
model <- thisModule.aModel,
left <- leftE,
right <- rightE,
similarity <- 0
),
leftE : AMW!LeftElement (
name <- left.name,
element <- left
),
rightE : AMW!RightElement (
name <- right.name,
element <- right
)
}
rule PairWiseClass extends PairWiseModelElement {
from
left : MOF!EClass, right : MOF!EClass (
left.isLeft() and right.isRight()
)
}
rule PairWiseSF extends PairWiseModelElement {
from
left : MOF!EStructuralFeature, right : MOF!EStructuralFeature (
left.isLeft() and right.isRight()
)
}