| -- @atlcompiler atl2006 |
| |
| module Create_propagation; |
| create OUT : AMW from IN: AMW, left : MOF, right : MOF; |
| |
| |
| helper def: amwModel : AMW!MatchModel = OclUndefined; |
| |
| helper def: listRef : Sequence(AMW!Element) = Sequence{}; |
| |
| helper def: methodName : String = 'Propagation weaving model'; |
| |
| |
| --------------------------------------------------------------------------------------------------- |
| ---------------------- generic helpers used for auxiliar tasks----------------------------------------------------------------------------- |
| |
| helper context MOF!EModelElement def : isLeftME() : Boolean = |
| MOF!EModelElement.allInstancesFrom('left')->exists(e | e = self); |
| |
| helper context MOF!EClass def : isLeft() : Boolean = |
| MOF!EClass.allInstancesFrom('left')->exists(e | e = self); |
| |
| helper context MOF!EModelElement def : isRight() : Boolean = |
| if self.oclIsTypeOf(MOF!EClass) then |
| MOF!EClass.allInstancesFrom('right')->exists(e | e = self) |
| else |
| if self.oclIsKindOf(MOF!EStructuralFeature) then |
| self.isRightsf() |
| else |
| false |
| endif |
| endif; |
| |
| helper context MOF!EStructuralFeature def : isLeftsf() : Boolean = |
| self.eContainingClass.isLeft(); |
| |
| helper context MOF!EStructuralFeature def : isRightsf() : Boolean = |
| self.eContainingClass.isRight(); |
| |
| helper def : maxSim : Real = 0.0; |
| |
| helper def : targetRef : AMW!Element = OclUndefined; |
| |
| helper context AMW!WElementRef def : getInstance (model : String): MOF!EModelElement = |
| MOF!EModelElement.getInstanceById(model, self.ref); |
| |
| ------------------------------------------------------------------------------------------------ |
| ------------------------------------------------------------------------------------------------ |
| |
| |
| rule attribute_relationship { |
| from --class to attribute links |
| class_link : AMW!Equivalent, |
| attr_link : AMW!Equivalent ( |
| if class_link.left.element.getInstance('left').oclIsTypeOf(MOF!EClass) and |
| class_link.right.element.getInstance('right').oclIsTypeOf(MOF!EClass) and |
| attr_link.left.element.getInstance('left').oclIsTypeOf(MOF!EAttribute) and |
| attr_link.right.element.getInstance('right').oclIsTypeOf(MOF!EAttribute) then |
| if |
| attr_link.left.element.getInstance('left').eContainingClass = class_link.left.element.getInstance('left') and |
| attr_link.right.element.getInstance('right').eContainingClass = class_link.right.element.getInstance('right') then |
| true |
| else |
| false |
| endif |
| else |
| false |
| endif |
| |
| ) |
| using { |
| l_class : MOF!EModelElement = class_link.left.element.getInstance('left'); |
| r_class : MOF!EModelElement = class_link.right.element.getInstance('right'); |
| l_attribute : MOF!EModelElement = attr_link.left.element.getInstance('left'); |
| r_attribute : MOF!EModelElement = attr_link.right.element.getInstance('right'); |
| } |
| to |
| out : AMW!PropagationEdge ( --class to attribute |
| propagation <- |
| 1 / ( |
| r_class.eStructuralFeatures->size() * |
| l_class.eStructuralFeatures->size() |
| ), |
| name <- '_CONTAINER_ATR_' + l_class.name+','+ r_class.name +'_'+ l_attribute.name +','+ r_attribute.name, |
| outgoingLink <- class_link, |
| incomingLink <- attr_link, |
| model <- class_link.model |
| ) , |
| out2 : AMW!PropagationEdge ( -- attribute to class |
| propagation <- 1.0, |
| name <- '_OWNED_ATR_' + l_attribute.name +','+ r_attribute.name + '_'+ l_class.name+','+ r_class.name , |
| incomingLink <- class_link, |
| outgoingLink <- attr_link, |
| model <- class_link.model |
| ) |
| } |
| |
| --rule reference_attribute_relationship { |
| -- from --class to attribute edtes |
| -- l_class : MOF!EClass, l_reference : MOF!EReference, |
| -- r_class : MOF!EClass, r_attribute : MOF!EAttribute ( |
| -- l_class.isLeft and r_class.isRight and |
| -- l_reference.isLeft and r_attribute.isRight and |
| -- |
| -- l_reference.eContainingClass = l_class and r_attribute.eContainingClass = r_class |
| -- ) |
| -- to |
| -- out : prop_g!Edge ( --class to attribute |
| -- propagation <- |
| -- 1/ |
| -- (r_class.eStructuralFeatures->size() * |
| -- l_class.eStructuralFeatures->size() ), |
| -- name <- '_CONTAINER_' + l_class.name+','+ r_class.name +'_'+ l_reference.name +','+ r_attribute.name, |
| -- outgoingNode <- |
| -- thisModule.resolveTemp( |
| -- Tuple { left = l_class, right = r_class} ,'anode'), |
| -- incomingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_reference, right = r_attribute} ,'anode') |
| -- |
| -- ) , |
| -- out2 : prop_g!Edge ( -- attribute to class |
| -- propagation <- 1.0, |
| -- name <- '_OWNED_' + l_reference.name +','+ r_attribute.name + '_'+ l_class.name+','+ r_class.name , |
| -- incomingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_class, right = r_class} ,'anode'), |
| -- outgoingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_reference, right = r_attribute} ,'anode') |
| -- ) |
| --} |
| -- |
| -- |
| --rule attribute_reference_relationship { |
| -- from --class to attribute edtes |
| -- l_class : MOF!EClass, l_attribute : MOF!EAttribute, |
| -- r_class : MOF!EClass, r_reference : MOF!EReference ( |
| -- l_class.isLeft and r_class.isRight and |
| -- l_attribute.isLeft and r_reference.isRight and |
| -- l_attribute.eContainingClass = l_class and r_reference.eContainingClass = r_class |
| -- ) |
| -- to |
| -- out : prop_g!Edge ( --class to attribute |
| -- propagation <- |
| -- 1 / ( |
| -- r_class.eStructuralFeatures->size() * |
| -- l_class.eStructuralFeatures->size() ), |
| -- name <- '_CONTAINER_' + l_class.name+','+ r_class.name +'_'+ l_attribute.name +','+ r_reference.name, |
| -- outgoingNode <- |
| -- thisModule.resolveTemp( |
| -- Tuple { left = l_class, right = r_class} ,'anode'), |
| -- incomingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_attribute, right = r_reference} ,'anode') |
| -- ) , |
| -- out2 : prop_g!Edge ( -- attribute to class |
| -- propagation <- 1.0, |
| -- name <- '_OWNED_' + l_attribute.name +','+ r_reference.name + '_'+ l_class.name+','+ r_class.name , |
| -- incomingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_class, right = r_class} ,'anode'), |
| -- outgoingNode <- thisModule.resolveTemp( |
| -- Tuple { left = l_attribute, right = r_reference} ,'anode') |
| -- ) |
| --} |
| -- |
| -- |
| |
| helper context MOF!EModelElement def : getLink (right : MOF!EModelElement): AMW!WLink = |
| AMW!Equivalent.allInstancesFrom('IN')-> |
| select ( e | e.left.element.ref = self.__xmiID__ and right.__xmiID__ = e.right.element.ref)->first(); |
| |
| rule Reference_relationship { |
| from --class to reference edges |
| class_link : AMW!Equivalent, |
| ref_link : AMW!Equivalent ( |
| if class_link.left.element.getInstance('left').oclIsTypeOf(MOF!EClass) and |
| class_link.right.element.getInstance('right').oclIsTypeOf(MOF!EClass) and |
| ref_link.left.element.getInstance('left').oclIsTypeOf(MOF!EReference) and |
| ref_link.right.element.getInstance('right').oclIsTypeOf(MOF!EReference) then |
| if |
| ref_link.left.element.getInstance('left').eContainingClass = class_link.left.element.getInstance('left') and |
| ref_link.right.element.getInstance('right').eContainingClass = class_link.right.element.getInstance('right') then |
| true |
| else |
| false |
| endif |
| else |
| false |
| endif |
| ) |
| using { |
| l_class : MOF!EModelElement = class_link.left.element.getInstance('left'); |
| r_class : MOF!EModelElement = class_link.right.element.getInstance('right'); |
| l_reference : MOF!EModelElement = ref_link.left.element.getInstance('left'); |
| r_reference : MOF!EModelElement = ref_link.right.element.getInstance('right'); |
| refers_link : AMW!WLink = l_reference.eReferenceType.getLink(r_reference.eReferenceType); |
| } |
| to |
| -- out : AMW!PropagationEdge ( --class to reference (class to class) |
| -- propagation <- |
| -- 1 / |
| -- ( MOF!EReference.allInstances()->select (e | e.eReferenceType = r_reference.eReferenceType)->size() * |
| -- MOF!EReference.allInstances()->select (e | e.eReferenceType = l_reference.eReferenceType)->size() ), |
| -- name <- '_REFERS_' + l_class.name+','+ r_class.name + '_' + |
| -- l_reference.eReferenceType.name + ',' + r_reference.eReferenceType.name, |
| -- outgoingLink <- class_link, |
| -- incomingLink <- refers_link, |
| -- model <- class_link.model |
| -- ), |
| -- out2 : AMW!PropagationEdge ( -- reference to class |
| -- propagation <- 1.0, |
| -- name <- '_REFERRED_' + l_reference.eReferenceType.name +','+ r_reference.eReferenceType.name + '_'+ l_class.name+','+ r_class.name , |
| -- incomingLink <- class_link, |
| -- outgoingLink <- refers_link, |
| -- model <- class_link.model |
| -- ), |
| out_ref : AMW!PropagationEdge ( --class to reference |
| propagation <- |
| 1 / ( |
| r_class.eStructuralFeatures->size() * |
| l_class.eStructuralFeatures->size() ), |
| name <- '_CONTAINER_' + l_class.name+','+ r_class.name +'_'+ l_reference.name +','+ r_reference.name, |
| outgoingLink <- class_link, |
| incomingLink <- ref_link, |
| model <- class_link.model |
| ), |
| out2_ref : AMW!PropagationEdge ( -- reference to class |
| propagation <- 1.0, |
| name <- '_OWNED_' + l_reference.name +','+ r_reference.name + '_'+ l_class.name+','+ r_class.name , |
| incomingLink <- class_link, |
| outgoingLink <- ref_link, |
| model <- class_link.model |
| ) |
| -- , |
| -- out_ref3 : AMW!PropagationEdge ( --reference points to class |
| -- propagation <- |
| -- 1 / ( |
| -- r_class.eStructuralFeatures->size() * |
| -- l_class.eStructuralFeatures->size() ), |
| -- name <- '_POINTS_' + l_class.name+','+ r_class.name +'_'+ l_reference.name +','+ r_reference.name, |
| -- outgoingLink <- ref_link, |
| -- incomingLink <- refers_link, |
| -- model <- class_link.model |
| -- ), |
| -- out3_ref : AMW!PropagationEdge ( -- reference to class |
| -- propagation <- 1.0, |
| -- name <- '_POINTED_' + l_reference.name +','+ r_reference.name + '_'+ l_class.name+','+ r_class.name , |
| -- incomingLink <- ref_link, |
| -- outgoingLink <- refers_link, |
| -- model <- class_link.model |
| -- ) |
| } |
| |
| |
| ------------------------------copied rules--------------------------------------------------- |
| |
| rule leftElement { |
| from |
| mmw : AMW!LeftElement |
| to |
| out : AMW!LeftElement ( |
| name <- mmw.name, |
| element <- mmw.element |
| ) |
| } |
| |
| rule rightElement { |
| from |
| mmw : AMW!RightElement |
| to |
| out : AMW!RightElement ( |
| name <- mmw.name, |
| element <- mmw.element |
| ) |
| } |
| |
| rule ElementRefs { |
| from |
| mmw : AMW!ElementRef |
| to |
| out : AMW!ElementRef ( |
| name <- mmw.name, |
| ref <- mmw.ref, |
| modelRef <- mmw.modelRef |
| ) |
| } |
| |
| rule matchmodel { |
| from |
| mmw: AMW!MatchModel |
| to |
| model : AMW!MatchModel ( |
| name <- mmw.name, |
| leftM <- mmw.leftM, |
| rightM <- mmw.rightM, |
| methods <- mmw.methods->union(Sequence{method}) |
| ), |
| method : AMW!Method ( |
| name <- thisModule.methodName |
| ) |
| } |
| |
| rule method { |
| from |
| mmw : AMW!Method |
| to |
| method : AMW!Method ( |
| name <- mmw.name |
| ) |
| } |
| |
| rule modelref { |
| from |
| mmw : AMW!ModelRef |
| to |
| out : AMW!ModelRef ( |
| name <- mmw.name, |
| ref <- mmw.ref |
| ) |
| } |
| |
| rule equivalentlink { |
| from |
| mmw : AMW!Equivalent |
| to |
| alink : AMW!Equivalent ( |
| name <- mmw.name, |
| model <- mmw.model, |
| left <- mmw.left, |
| right <- mmw.right, |
| similarity <- mmw.similarity |
| ) |
| } |