blob: e280f61f9c13f03d46d8a97267298c4d24a76a96 [file] [log] [blame]
-- @atlcompiler atl2006
--/*******************************************************************************
-- * Copyright (c) 2009 Ecole des Mines de Nantes.
-- * All rights reserved. This program and the accompanying materials
-- * are made available under the terms of the Eclipse Public License v2.0
-- * which accompanies this distribution, and is available at
-- * https://www.eclipse.org/legal/epl-2.0/
-- *
-- * Contributors:
-- * Kelly Garces - initial implementation and/or initial documentation
-- *******************************************************************************/
-- Having EqualStructuralFeatures outside the root is normal
-- The reason is that there is not EqualClass containing
-- those EqualStructuralFeature
module Rewriting;
create OUT : EqualMM from IN : EqualMM, m1 : Metametamodel, m2 : Metametamodel;
uses EqualMM;
uses Metametamodel;
uses SuitableMetametamodel;
helper def: methodName : String =
'Rewriting';
helper def: equalModel : EqualMM!MatchModel =
OclUndefined;
helper context EqualMM!WLink def: rightElement : OclAny =
self.rightE;
helper context EqualMM!WLink def: leftElement : OclAny =
self.leftE;
helper def: addedClasses : Sequence(OclAny) =
EqualMM!AddedClass.allInstances()->collect(e |
e.rightElement
)->flatten();
helper def: deletedClasses : Sequence(OclAny) =
EqualMM!DeletedClass.allInstances()->collect(e |
e.leftElement
)->flatten();
helper context EqualMM!EqualStructuralFeature def: getDescMsg(parent : EqualMM!EqualClass) : EqualMM!EqualStructuralFeature =
if parent.oclIsUndefined() then
''
else
self.getVDescMsg(parent)
endif;
helper context EqualMM!MovePropertyToOwner def: getVDescMsg(parent : EqualMM!EqualClass) : String =
self.leftElement.name + ' is moved along the relation ' + self.associatedReference.name + ' from the class ' + self.leftElement.owner.name + ' to the class ' + self.rightElement.owner.name;
helper context EqualMM!ExtractClass def: getVDescMsg(parent : EqualMM!EqualClass) : String =
self.leftElement.name + ' is extracted from the class ' + self.leftElement.owner.name + ' to the new class ' + self.rightElement.owner.name;
helper context EqualMM!InlineClass def: getVDescMsg(parent : EqualMM!EqualClass) : String =
self.leftElement.name + ' is moved along the relation ' + self.associatedReference.name + ' from the deleted class ' + self.leftElement.owner.name + ' to the class ' + self.rightElement.owner.name;
helper context EqualMM!PushProperty def: getVDescMsg(parent : EqualMM!EqualClass) : String =
self.leftElement.name + ' is eliminated from the superclass ' + self.leftElement.owner.name + ' and introduced to the subclass ' + parent.rightElement.name;
helper context EqualMM!PullProperty def: getVDescMsg(parent : EqualMM!EqualClass) : String =
self.leftElement.name + ' is pulled into the superclass ' + parent.rightElement.name;
rule matchmodel {
from
mmw : EqualMM!MatchModel
to
model : EqualMM!MatchModel (
name <- mmw.name,
leftM <- mmw.leftM,
rightM <- mmw.rightM,
methods <- mmw.methods->union(Sequence {method})
),
method : EqualMM!Method (
name <- thisModule.methodName
)
do {
thisModule.equalModel <- model;
}
}
rule method {
from
mmw : EqualMM!Method
to
method : EqualMM!Method (
name <- mmw.name
)
}
rule modelref {
from
mmw : EqualMM!ModelRef
to
out : EqualMM!ModelRef (
name <- mmw.name,
ref <- mmw.ref
)
}
abstract rule Link {
from
l : EqualMM!WLink
to
alink : EqualMM!WLink (
name <- l.name,
description <- l.description,
userAssistance <- l.userAssistance
)
}
abstract rule Equal extends Link {
from
l : EqualMM!Equal
to
alink : EqualMM!Equal (
left <- thisModule.leftElement(l.left),
right <- thisModule.rightElement(l.right),
similarity <- l.similarity
)
}
abstract rule Added extends Link {
from
l : EqualMM!Added
to
alink : EqualMM!Added (
right <- thisModule.rightElement(l.right)
)
}
abstract rule Deleted extends Link {
from
l : EqualMM!Deleted
to
alink : EqualMM!Deleted (
left <- thisModule.leftElement(l.left)
)
}
rule EqualClass extends Equal {
from
l : EqualMM!EqualClass
to
alink : EqualMM!EqualClass (
model <- l.model
)
}
rule IntroduceSuperClassWithRestrictedProperty extends EqualClass {
from
l : EqualMM!IntroduceSuperClassWithRestrictedProperty
to
alink : EqualMM!IntroduceSuperClassWithRestrictedProperty
}
rule EqualStructuralFeature extends Equal {
from
l : EqualMM!EqualStructuralFeature
using
{
parent : EqualMM!EqualClass = l.getParent;
}
to
alink : EqualMM!EqualStructuralFeature (
parent <- parent -- model <- OclUndefined -- prevent ESFs from attaching to the model because EC will claim them
-- does not work now because of bug in emfvm: null values are set
-- model <- OclUndefined -- prevent ESFs from attaching to the model because EC will claim them
-- does not work now because of bug in emfvm: null values are set
)
}
rule EqualReference extends EqualStructuralFeature {
from
l : EqualMM!EqualReference
to
alink : EqualMM!EqualReference
}
rule EqualAttribute extends EqualStructuralFeature {
from
l : EqualMM!EqualAttribute
to
alink : EqualMM!EqualAttribute
}
rule MovePropertyToOwner extends EqualStructuralFeature {
from
l : EqualMM!MovePropertyToOwner
to
alink : EqualMM!MovePropertyToOwner (
associatedReference <- thisModule.rightElement(l.associatedReference),
description <- l.getDescMsg(parent)
)
}
rule MovePropertyToOwned extends EqualStructuralFeature {
from
l : EqualMM!MovePropertyToOwned
to
alink : EqualMM!MovePropertyToOwned (
associatedReference <- thisModule.leftElement(l.associatedReference)
)
}
rule ExtractClass extends EqualStructuralFeature {
from
l : EqualMM!ExtractClass
to
alink : EqualMM!ExtractClass (
associatedReference <- thisModule.rightElement(l.associatedReference),
description <- l.getDescMsg(parent)
)
}
rule InlineClass extends EqualStructuralFeature {
from
l : EqualMM!InlineClass
to
alink : EqualMM!InlineClass (
associatedReference <- thisModule.leftElement(l.associatedReference),
description <- l.getDescMsg(parent)
)
}
rule PushProperty extends EqualStructuralFeature {
from
l : EqualMM!PushProperty
to
alink : EqualMM!PushProperty (
description <- l.getDescMsg(parent)
)
}
rule PullProperty extends EqualStructuralFeature {
from
l : EqualMM!PullProperty
to
alink : EqualMM!PullProperty (
description <- l.getDescMsg(parent)
)
}
rule FlattenProperty extends EqualStructuralFeature {
from
l : EqualMM!FlattenProperty
to
alink : EqualMM!FlattenProperty
}
rule ExtractSuperClass extends EqualStructuralFeature {
from
l : EqualMM!ExtractSuperClass
to
alink : EqualMM!ExtractSuperClass
}
rule RestrictTypeReference extends EqualReference {
from
l : EqualMM!RestrictTypeReference
to
alink : EqualMM!RestrictTypeReference (
description <- l.description
)
}
rule RestrictTypeAttribute extends EqualAttribute {
from
l : EqualMM!RestrictTypeAttribute
to
alink : EqualMM!RestrictTypeAttribute (
description <- l.description
)
}
rule RestrictMultiplicityReference extends EqualReference {
from
l : EqualMM!RestrictMultiplicityReference
to
alink : EqualMM!RestrictMultiplicityReference (
description <- l.description
)
}
rule AddedClass extends Added {
from
l : EqualMM!AddedClass
to
alink : EqualMM!AddedClass (
model <- l.model
)
}
abstract rule AddedStructuralFeature extends Added {
from
l : EqualMM!AddedStructuralFeature
to
alink : EqualMM!AddedStructuralFeature (
parent <- l.getParent
)
}
rule AddedReference extends AddedStructuralFeature {
from
l : EqualMM!AddedReference
to
alink : EqualMM!AddedReference
}
rule AddedAttribute extends AddedStructuralFeature {
from
l : EqualMM!AddedAttribute
to
alink : EqualMM!AddedAttribute
}
rule AddedEnumLiteral extends Added {
from
l : EqualMM!AddedEnumLiteral
to
alink : EqualMM!AddedEnumLiteral (
parent <- l.getParent
)
}
rule AddedEnumeration extends Added {
from
l : EqualMM!AddedEnumeration
to
alink : EqualMM!AddedEnumeration (
model <- l.model
)
}
rule IntroducedRestrictedAttribute extends AddedAttribute {
from
l : EqualMM!IntroduceRestrictedProperty
to
alink : EqualMM!IntroduceRestrictedProperty (
description <- l.description
)
}
rule DeletedClass extends Deleted {
from
l : EqualMM!DeletedClass
to
alink : EqualMM!DeletedClass (
model <- l.model
)
}
abstract rule DeletedStructuralFeature extends Deleted {
from
l : EqualMM!DeletedStructuralFeature
to
alink : EqualMM!DeletedStructuralFeature (
parent <- l.getParent
)
}
rule DeletedAttribute extends DeletedStructuralFeature {
from
l : EqualMM!DeletedAttribute
to
alink : EqualMM!DeletedAttribute
}
rule DeletedReference extends DeletedStructuralFeature {
from
l : EqualMM!DeletedReference
to
alink : EqualMM!DeletedReference
}
rule DeletedEnumeration extends Deleted {
from
l : EqualMM!DeletedEnumeration
to
alink : EqualMM!DeletedEnumeration (
model <- l.model
)
} --rule DeletedEnumLiteral extends Deleted {
-- from
-- l : EqualMM!DeletedEnumLiteral
-- to
-- alink : EqualMM!DeletedEnumLiteral(
-- parent <- l.getParent
-- )
--}
--rule DeletedEnumLiteral extends Deleted {
-- from
-- l : EqualMM!DeletedEnumLiteral
-- to
-- alink : EqualMM!DeletedEnumLiteral(
-- parent <- l.getParent
-- )
--}
lazy rule leftElement {
from
mmw : EqualMM!LeftElement
to
out : EqualMM!LeftElement (
name <- mmw.name,
element <- thisModule.leftElementRefs(mmw.element)
)
}
lazy rule rightElement {
from
mmw : EqualMM!RightElement
to
out : EqualMM!RightElement (
name <- mmw.name,
element <- thisModule.rightElementRefs(mmw.element)
)
}
rule AddedReferenceAssociation {
from
mmw : EqualMM!AddedReferenceAssociation
to
out : EqualMM!AddedReferenceAssociation (
model <- mmw.model,
associationEnd <- mmw.associationEnd
)
} --rule DeletedReferenceAssociation {
-- from
-- mmw : EqualMM!DeletedReferenceAssociation
-- to
-- out : EqualMM!DeletedReferenceAssociation (
-- model <- mmw.model,
-- associationEnd <- mmw.associationEnd
-- )
--}
--rule DeletedReferenceAssociation {
-- from
-- mmw : EqualMM!DeletedReferenceAssociation
-- to
-- out : EqualMM!DeletedReferenceAssociation (
-- model <- mmw.model,
-- associationEnd <- mmw.associationEnd
-- )
--}
rule AssociationEnd {
from
mmw : EqualMM!AssociationEnd
to
out : EqualMM!AssociationEnd (
name <- mmw.name,
relatedLink <- mmw.relatedLink
)
}
lazy rule leftElementRefs {
from
mmw : EqualMM!ElementRef
to
out : EqualMM!ElementRef (
name <- mmw.name,
ref <- mmw.ref,
modelRef <- thisModule.equalModel.leftM
)
}
lazy rule rightElementRefs {
from
mmw : EqualMM!ElementRef
to
out : EqualMM!ElementRef (
name <- mmw.name,
ref <- mmw.ref,
modelRef <- thisModule.equalModel.rightM
)
}