info-loss/fr.tpt.mem4csd.loss.mm2loss/transformations/tgg2loss.atl

81 lines
2.0 KiB
Plaintext

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