module TGG2loss; -- LOSST: Loss Transformation -- TGG: mltgg create OUT : LOSS from IN : TGG; helper context LOSS!EClassifier def : qualifiedName : String = self.ePackage.qualifiedName + '::' + self.name; helper context LOSS!EPackage def : qualifiedName : String = if self.eSuperPackage.oclIsUndefined() then self.name else self.eSuperPackage.qualifiedName + '::' + self.name endif; rule TGGRuleToLossRule { from s : TGG!TGGRule in IN to t : LOSS!Rule in OUT ( name <- s.ruleGroup.name + '-' + s.ruleID, leftModel <- s.leftModelDomain.modelObjects, rightModel <- s.rightModelDomain.modelObjects, transformations <- s.correspondenceDomain.correspondenceNodes ) } rule ModelObjectToLossElement { from s : TGG!ModelObject in IN to t : LOSS!Complex in OUT ( -- TODO Attributes -- TODO outgoingLinks name <- s.name, primitives <- s.outgoingLinks, objectType <- s.type, className <- s.type.qualifiedName ) } rule ModelLinkToLossCorrLink { from s : TGG!ModelLink in IN to t : LOSS!Link in OUT ( -- TODO Attributes -- TODO outgoingLinks name <- s.toString(), feature <- s.feature, referenceTo <- s.target ) } helper context TGG!ModelLink def : isRightElement() : Boolean = self.modelDomain.oclIsKindOf(TGG!RightModelDomain); helper context TGG!ModelObject def : isRightElement() : Boolean = self.modelDomain.oclIsKindOf(TGG!RightModelDomain); helper context TGG!ModelLink def : isLeftElement() : Boolean = self.modelDomain.oclIsKindOf(TGG!LeftModelDomain); helper context TGG!ModelObject def : isLeftElement() : Boolean = self.modelDomain.oclIsKindOf(TGG!LeftModelDomain); rule CorrespondenceNodeToLossCorr { from s : TGG!CorrespondenceNode in IN using { links : Set(TGG!CorrespondenceLink) = s.outgoingLinks->collect(e | e.target); assertion : OclAny = links->collect(it | it.isLeftElement() or it.isRightElement() or 1.0/0.0); -- validation. } to t : LOSS!CorrNode in OUT ( name <- s.toString(), leftLinks <- links->select(it | it.isLeftElement()), rightLinks <- links->select(it | it.isRightElement()) ) }