| -- @atlcompiler atl2006 |
| |
| module Link_rewriting; |
| create OUT : AMW from LxR: AMW, left_model : MOF, right_model : MOF; |
| |
| |
| helper def: amwModel : AMW!MatchModel = OclUndefined; |
| |
| helper def: listRef : Sequence(AMW!Element) = Sequence{}; |
| |
| --------------------------------------------------------------------------------------------------- |
| ---------------------- generic helpers used for auxiliar tasks----------------------------------------------------------------------------- |
| |
| helper context MOF!EClass def : isLeft() : Boolean = |
| MOF!EClass.allInstancesFrom('left_model')->exists(e | e = self); |
| |
| helper context MOF!EModelElement def : isRight() : Boolean = |
| if self.oclIsTypeOf(MOF!EClass) then |
| MOF!EClass.allInstancesFrom('right_model')->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 def : getMax(current : AMW!Equivalent, list : Sequence(AMW!Equivalent), max : AMW!Equivalent) : AMW!Equivalent = |
| if current.oclIsUndefined() then |
| max |
| else |
| thisModule.getMax(list->first(), list->subSequence(2, list->size()), |
| if max.oclIsUndefined() then |
| current |
| else |
| if current.similarity > max.similarity then |
| current |
| else |
| max |
| endif |
| endif |
| ) |
| endif; |
| |
| 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 <- 'Link rewriting' |
| ) |
| do { |
| thisModule.amwModel <- mmw; |
| } |
| |
| } |
| |
| 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 ElementRefs { |
| from |
| mmw : AMW!ElementRef |
| to |
| out : AMW!ElementRef ( |
| name <- mmw.name, |
| ref <- mmw.ref, |
| modelRef <- mmw.modelRef |
| ) |
| } |
| |
| |
| rule classElementRef { |
| from |
| element : MOF!EClass ( |
| element.isLeft() |
| ) |
| using { |
| links : Sequence(AMW!Equivalent) = AMW!Equivalent.allInstancesFrom('LxR')->select (e | e.left.element.ref = element.__xmiID__); |
| link : AMW!Equivalent = thisModule.getMax( links->first(), links->subSequence(2, links->size()), OclUndefined ); |
| targetEl : OclAny = |
| AMW!RightElement.allInstances()->select(e | e.element.ref = link.right.element.ref)->first().element; |
| } |
| to |
| left : AMW!Element ( |
| name <- element.name, |
| element <- --out |
| AMW!LeftElement.allInstances()->select(e | e.element.ref = element.__xmiID__)->first().element |
| --AMW!MatchModel.allInstances()->first().leftM.allInstances()->select |
| ), |
| right : AMW!Element ( |
| element <- targetEl, |
| name <- targetEl.name |
| ), |
| wlink : AMW!ElementEqual ( |
| left <- left, |
| right <- right, |
| model <- thisModule.amwModel, |
| similarity <- link.similarity |
| ) |
| } |
| |
| rule AttributeElementRef { |
| from |
| element : MOF!EAttribute (element.isLeftsf()) |
| using { |
| links : Sequence(AMW!Equivalent) = AMW!Equivalent.allInstancesFrom('LxR')-> |
| select (e | e.left.element.ref = element.__xmiID__); |
| link : AMW!Equivalent = thisModule.getMax( |
| links->first(), links->subSequence(2, links->size()), OclUndefined ); |
| targetEl : OclAny = |
| AMW!RightElement.allInstances()->select(e | e.element.ref = link.right.element.ref)->first().element; |
| } |
| to |
| source : AMW!Element ( |
| name <- element.name, |
| element <- |
| AMW!LeftElement.allInstances()->select(e | e.element.ref = element.__xmiID__)->first().element |
| --out |
| ), |
| target : AMW!Element ( |
| element <- targetEl, |
| name <- targetEl.name |
| ), |
| alink : AMW!AttributeEqual ( |
| left <- source, |
| right <- target, |
| parent <- if thisModule.resolveTemp(element.eContainingClass,'wlink').oclIsUndefined() then |
| OclUndefined |
| else |
| thisModule.resolveTemp(element.eContainingClass,'wlink') |
| endif, |
| similarity <- link.similarity |
| ) |
| } |
| |
| rule ReferenceElementRef { |
| from |
| element : MOF!EReference (element.isLeftsf()) |
| using { |
| links : Sequence(AMW!Equivalent) = AMW!Equivalent.allInstancesFrom('LxR')-> |
| select (e | e.left.element.ref = element.__xmiID__); |
| link : AMW!Equivalent = thisModule.getMax( links->first(), links->subSequence(2, links->size()), OclUndefined ); |
| targetEl : OclAny = |
| AMW!RightElement.allInstances()->select(e | e.element.ref = link.right.element.ref)->first().element; |
| } |
| to |
| source : AMW!Element ( |
| name <- element.name, |
| element <- AMW!LeftElement.allInstances()->select(e | e.element.ref = element.__xmiID__)->first().element |
| --out |
| ), |
| target : AMW!Element ( |
| element <- targetEl, |
| name <- targetEl.name |
| ), |
| alink : AMW!ReferenceEqual ( |
| left <- source, |
| right <- target, |
| parent <- thisModule.resolveTemp(element.eContainingClass,'wlink'), |
| similarity <- link.similarity |
| ) |
| } |
| |
| endpoint rule NormalizeSimilarity() { |
| using { |
| max : Real = 0; |
| curr : Real = 0; |
| list : Sequence (AMW!Equal) = Sequence{}; |
| first : OclAny = OclUndefined; |
| } |
| do { |
| for(e in AMW!Equal.allInstancesFrom('OUT')) { |
| if(e.similarity > max) { |
| max <- e.similarity; |
| } |
| } |
| if(max > 0) { |
| for(e in AMW!Equal.allInstancesFrom('OUT')) { |
| e.similarity <- e.similarity / max; |
| } |
| } |
| } |
| } |
| |
| |