New matching transformation that creates a propagation model.
diff --git a/examples/amwExamples.xml b/examples/amwExamples.xml
index a83d3bb..d44b803 100644
--- a/examples/amwExamples.xml
+++ b/examples/amwExamples.xml
@@ -33,6 +33,18 @@
</amwExample>
<amwExample>
+ <shortName>Propagation model</shortName>
+ <name>Propagation model</name>
+ <sourceLink>libray/CreatePropagation.atl</sourceLink>
+ <description>
+ This transformation creates a propagation model that enables to execute the similarity flooding
+ algorithm. The propagation model defines the way the similarities are propagated, for example using
+ containment relationships or the inheritance tree.
+ </description>
+ <pubDate>19/10/2006</pubDate>
+ </amwExample>
+
+ <amwExample>
<shortName>Cardinality</shortName>
<name>Cardinality</name>
<docLink></docLink>
diff --git a/examples/library/CreatePropagation.atl b/examples/library/CreatePropagation.atl
new file mode 100644
index 0000000..ac81974
--- /dev/null
+++ b/examples/library/CreatePropagation.atl
@@ -0,0 +1,328 @@
+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
+ )
+}