-- @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() ) }