Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf')
-rw-r--r--examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatQVT.xml1391
-rw-r--r--examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatRelToCore.qvt2037
-rw-r--r--examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/run.bat3
3 files changed, 3431 insertions, 0 deletions
diff --git a/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatQVT.xml b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatQVT.xml
new file mode 100644
index 000000000..58063f9db
--- /dev/null
+++ b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatQVT.xml
@@ -0,0 +1,1391 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<emof:Package xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:emof="http://schema.omg.org/spec/mof/2.0/emof.xmi"
+ xmi:id="FlatQVT" name="FlatQVT" uri="http://www.omg.org/spec/QVT/20140401/FlatQVT">
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.AltExp" name="AltExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.AltExp.body" name="body" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.altBodyOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.AltExp.condition" name="condition" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.altCondOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.AltExp.altOwner" name="altOwner" isOrdered="true"
+ type="FlatQVT.SwitchExp" opposite="FlatQVT.SwitchExp.alternativePart"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.AnyType" name="AnyType" superClass="FlatQVT.Type"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Area" name="Area" isAbstract="true">
+ <ownedAttribute xmi:id="FlatQVT.Area.bottomPattern" name="bottomPattern" isOrdered="true"
+ type="FlatQVT.BottomPattern" isComposite="true" opposite="FlatQVT.BottomPattern.area"/>
+ <ownedAttribute xmi:id="FlatQVT.Area.guardPattern" name="guardPattern" isOrdered="true"
+ type="FlatQVT.GuardPattern" isComposite="true" opposite="FlatQVT.GuardPattern.area"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.AssertExp" name="AssertExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.AssertExp.assertion" name="assertion" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.assertOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.AssertExp.log" name="log" isOrdered="true" lower="0"
+ type="FlatQVT.LogExp" isComposite="true" opposite="FlatQVT.LogExp.assertExp"/>
+ <ownedAttribute xmi:id="FlatQVT.AssertExp.severity" name="severity" isOrdered="true"
+ lower="0" type="FlatQVT.SeverityKind" default="error"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.AssignExp" name="AssignExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.AssignExp.defaultValue" name="defaultValue" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.defaultOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.AssignExp.isReset" name="isReset" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.AssignExp.left" name="left" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.leftOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.AssignExp.value" name="value" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.valueOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Assignment" name="Assignment" isAbstract="true"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Assignment.bottomPattern" name="bottomPattern"
+ isOrdered="true" type="FlatQVT.BottomPattern" opposite="FlatQVT.BottomPattern.assignment"/>
+ <ownedAttribute xmi:id="FlatQVT.Assignment.isDefault" name="isDefault" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Assignment.value" name="value" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.valueAssignment"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.BagType" name="BagType" superClass="FlatQVT.CollectionType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.BlockExp" name="BlockExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.BlockExp.body" name="body" isOrdered="true" lower="0"
+ upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.blockOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:PrimitiveType" xmi:id="FlatQVT.Boolean" name="Boolean"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.BooleanLiteralExp" name="BooleanLiteralExp"
+ superClass="FlatQVT.PrimitiveLiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.BooleanLiteralExp.booleanSymbol" name="booleanSymbol"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.BottomPattern" name="BottomPattern"
+ superClass="FlatQVT.CorePattern">
+ <ownedAttribute xmi:id="FlatQVT.BottomPattern.area" name="area" isOrdered="true"
+ type="FlatQVT.Area" opposite="FlatQVT.Area.bottomPattern"/>
+ <ownedAttribute xmi:id="FlatQVT.BottomPattern.assignment" name="assignment" lower="0"
+ upper="*" type="FlatQVT.Assignment" isComposite="true" opposite="FlatQVT.Assignment.bottomPattern"/>
+ <ownedAttribute xmi:id="FlatQVT.BottomPattern.enforcementOperation" name="enforcementOperation"
+ lower="0" upper="*" type="FlatQVT.EnforcementOperation" isComposite="true"
+ opposite="FlatQVT.EnforcementOperation.bottomPattern"/>
+ <ownedAttribute xmi:id="FlatQVT.BottomPattern.realizedVariable" name="realizedVariable"
+ lower="0" upper="*" type="FlatQVT.RealizedVariable" isComposite="true" opposite="FlatQVT.RealizedVariable.bottomPattern">
+ <ownedComment body="bottomPattern">
+ <ownedComment body="http://schema.omg.org/spec/mof/2.0/emof.xmi#Property.oppositeRoleName"/>
+ </ownedComment>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.BreakExp" name="BreakExp" superClass="FlatQVT.ImperativeExpression"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CallExp" name="CallExp" isAbstract="true"
+ superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.CallExp.source" name="source" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.appliedElement"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CatchExp" name="CatchExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.CatchExp.body" name="body" isOrdered="true" lower="0"
+ upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.catchExp"/>
+ <ownedAttribute xmi:id="FlatQVT.CatchExp.exception" name="exception" isOrdered="true"
+ upper="*" type="FlatQVT.Type" opposite="FlatQVT.Type.catchExp"/>
+ <ownedAttribute xmi:id="FlatQVT.CatchExp.exceptionVariable" name="exceptionVariable"
+ isOrdered="true" lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.catchExp"/>
+ <ownedAttribute xmi:id="FlatQVT.CatchExp.exceptOwner" name="exceptOwner" isOrdered="true"
+ type="FlatQVT.TryExp" opposite="FlatQVT.TryExp.exceptClause"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Class" name="Class" superClass="FlatQVT.Type">
+ <ownedAttribute xmi:id="FlatQVT.Class.isAbstract" name="isAbstract" isOrdered="true"
+ lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Class.ownedAttribute" name="ownedAttribute" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.Property" isComposite="true" opposite="FlatQVT.Property.class"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.ownedOperation" name="ownedOperation" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.Operation" isComposite="true" opposite="FlatQVT.Operation.class"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.superClass" name="superClass" lower="0"
+ upper="*" type="FlatQVT.Class" opposite="FlatQVT.Class.class"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.class" name="class" isOrdered="true" type="FlatQVT.Class"
+ opposite="FlatQVT.Class.superClass"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.contextualProperty" name="contextualProperty"
+ isOrdered="true" type="FlatQVT.ContextualProperty" opposite="FlatQVT.ContextualProperty.context"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.instantiationExp" name="instantiationExp"
+ isOrdered="true" type="FlatQVT.InstantiationExp" opposite="FlatQVT.InstantiationExp.instantiatedClass"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.key" name="key" isOrdered="true" type="FlatQVT.Key"
+ opposite="FlatQVT.Key.identifies"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.objectTemplateExp" name="objectTemplateExp"
+ isOrdered="true" type="FlatQVT.ObjectTemplateExp" opposite="FlatQVT.ObjectTemplateExp.referredClass"/>
+ <ownedAttribute xmi:id="FlatQVT.Class.transfClient" name="transfClient" isOrdered="true"
+ type="FlatQVT.OperationalTransformation" opposite="FlatQVT.OperationalTransformation.intermediateClass"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionItem" name="CollectionItem"
+ superClass="FlatQVT.CollectionLiteralPart">
+ <ownedAttribute xmi:id="FlatQVT.CollectionItem.item" name="item" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.collectionItem"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Enumeration" xmi:id="FlatQVT.CollectionKind" name="CollectionKind">
+ <ownedLiteral xmi:id="FlatQVT.CollectionKind.Set" name="Set"/>
+ <ownedLiteral xmi:id="FlatQVT.CollectionKind.OrderedSet" name="OrderedSet"/>
+ <ownedLiteral xmi:id="FlatQVT.CollectionKind.Bag" name="Bag"/>
+ <ownedLiteral xmi:id="FlatQVT.CollectionKind.Sequence" name="Sequence"/>
+ <ownedLiteral xmi:id="FlatQVT.CollectionKind.Collection" name="Collection"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionLiteralExp" name="CollectionLiteralExp"
+ superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.CollectionLiteralExp.kind" name="kind" isOrdered="true"
+ lower="0" type="FlatQVT.CollectionKind"/>
+ <ownedAttribute xmi:id="FlatQVT.CollectionLiteralExp.part" name="part" lower="0"
+ upper="*" type="FlatQVT.CollectionLiteralPart" isComposite="true" opposite="FlatQVT.CollectionLiteralPart.collectionLiteralExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionLiteralPart" name="CollectionLiteralPart"
+ isAbstract="true" superClass="FlatQVT.TypedElement">
+ <ownedAttribute xmi:id="FlatQVT.CollectionLiteralPart.collectionLiteralExp" name="collectionLiteralExp"
+ isOrdered="true" type="FlatQVT.CollectionLiteralExp" opposite="FlatQVT.CollectionLiteralExp.part"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionRange" name="CollectionRange"
+ superClass="FlatQVT.CollectionLiteralPart">
+ <ownedAttribute xmi:id="FlatQVT.CollectionRange.first" name="first" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.firstOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.CollectionRange.last" name="last" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.lastOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionTemplateExp" name="CollectionTemplateExp"
+ superClass="FlatQVT.TemplateExp">
+ <ownedAttribute xmi:id="FlatQVT.CollectionTemplateExp.member" name="member" lower="0"
+ upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.listContainer"/>
+ <ownedAttribute xmi:id="FlatQVT.CollectionTemplateExp.referredCollectionType"
+ name="referredCollectionType" isOrdered="true" type="FlatQVT.CollectionType"
+ opposite="FlatQVT.CollectionType.collectionTemplateExp"/>
+ <ownedAttribute xmi:id="FlatQVT.CollectionTemplateExp.rest" name="rest" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" opposite="FlatQVT.Variable.matchingExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CollectionType" name="CollectionType"
+ superClass="FlatQVT.DataType">
+ <ownedAttribute xmi:id="FlatQVT.CollectionType.elementType" name="elementType"
+ isOrdered="true" type="FlatQVT.Type" opposite="FlatQVT.Type.collectionType"/>
+ <ownedAttribute xmi:id="FlatQVT.CollectionType.collectionTemplateExp" name="collectionTemplateExp"
+ isOrdered="true" type="FlatQVT.CollectionTemplateExp" opposite="FlatQVT.CollectionTemplateExp.referredCollectionType"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Comment" name="Comment" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Comment.annotatedElement" name="annotatedElement"
+ lower="0" upper="*" type="FlatQVT.NamedElement" opposite="FlatQVT.NamedElement.comment"/>
+ <ownedAttribute xmi:id="FlatQVT.Comment.body" name="body" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Comment.owningElement" name="owningElement" isOrdered="true"
+ type="FlatQVT.Element" opposite="FlatQVT.Element.ownedComment"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ComputeExp" name="ComputeExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.ComputeExp.body" name="body" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.computeOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ComputeExp.returnedElement" name="returnedElement"
+ isOrdered="true" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.computeOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Constructor" name="Constructor"
+ superClass="FlatQVT.ImperativeOperation"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ConstructorBody" name="ConstructorBody"
+ superClass="FlatQVT.OperationBody">
+ <ownedAttribute xmi:id="FlatQVT.ConstructorBody.objectExp" name="objectExp" isOrdered="true"
+ type="FlatQVT.ObjectExp" opposite="FlatQVT.ObjectExp.body"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ContextualProperty" name="ContextualProperty"
+ superClass="FlatQVT.Property">
+ <ownedAttribute xmi:id="FlatQVT.ContextualProperty.context" name="context" isOrdered="true"
+ type="FlatQVT.Class" opposite="FlatQVT.Class.contextualProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.ContextualProperty.initExpression" name="initExpression"
+ isOrdered="true" lower="0" type="FlatQVT.OclExpression" isComposite="true"
+ opposite="FlatQVT.OclExpression.ownerProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.ContextualProperty.overridden" name="overridden"
+ isOrdered="true" lower="0" type="FlatQVT.Property" opposite="FlatQVT.Property.overriding"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ContinueExp" name="ContinueExp"
+ superClass="FlatQVT.ImperativeExpression"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CoreDomain" name="CoreDomain" superClass="FlatQVT.Domain FlatQVT.Area"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.CorePattern" name="CorePattern"
+ superClass="FlatQVT.Pattern">
+ <ownedAttribute xmi:id="FlatQVT.CorePattern.variable" name="variable" lower="0"
+ upper="*" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.corePattern"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.DataType" name="DataType" superClass="FlatQVT.Type"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.DictLiteralExp" name="DictLiteralExp"
+ superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.DictLiteralExp.part" name="part" lower="0" upper="*"
+ type="FlatQVT.DictLiteralPart" isComposite="true" opposite="FlatQVT.DictLiteralPart.partOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.DictLiteralPart" name="DictLiteralPart"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.DictLiteralPart.key" name="key" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.keyOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.DictLiteralPart.value" name="value" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.valOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.DictLiteralPart.partOwner" name="partOwner" isOrdered="true"
+ type="FlatQVT.DictLiteralExp" opposite="FlatQVT.DictLiteralExp.part"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.DictionaryType" name="DictionaryType"
+ superClass="FlatQVT.CollectionType">
+ <ownedAttribute xmi:id="FlatQVT.DictionaryType.keyType" name="keyType" isOrdered="true"
+ lower="0" type="FlatQVT.Type" opposite="FlatQVT.Type.keyDict"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Enumeration" xmi:id="FlatQVT.DirectionKind" name="DirectionKind">
+ <ownedLiteral xmi:id="FlatQVT.DirectionKind.in" name="in"/>
+ <ownedLiteral xmi:id="FlatQVT.DirectionKind.inout" name="inout"/>
+ <ownedLiteral xmi:id="FlatQVT.DirectionKind.out" name="out"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Domain" name="Domain" isAbstract="true"
+ superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.Domain.isCheckable" name="isCheckable" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Domain.isEnforceable" name="isEnforceable" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Domain.rule" name="rule" isOrdered="true" type="FlatQVT.Rule"
+ opposite="FlatQVT.Rule.domain"/>
+ <ownedAttribute xmi:id="FlatQVT.Domain.typedModel" name="typedModel" isOrdered="true"
+ lower="0" type="FlatQVT.TypedModel" opposite="FlatQVT.TypedModel.domain"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.DomainPattern" name="DomainPattern"
+ superClass="FlatQVT.Pattern">
+ <ownedAttribute xmi:id="FlatQVT.DomainPattern.relationDomain" name="relationDomain"
+ isOrdered="true" type="FlatQVT.RelationDomain" opposite="FlatQVT.RelationDomain.pattern"/>
+ <ownedAttribute xmi:id="FlatQVT.DomainPattern.templateExpression" name="templateExpression"
+ isOrdered="true" lower="0" type="FlatQVT.TemplateExp" isComposite="true" opposite="FlatQVT.TemplateExp.domainPattern"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Element" name="Element" isAbstract="true"
+ superClass="FlatQVT.Object">
+ <ownedOperation xmi:id="FlatQVT.Element.container" name="container" isOrdered="true"
+ lower="0" type="FlatQVT.Element"/>
+ <ownedOperation xmi:id="FlatQVT.Element.equals" name="equals" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.Element.equals.object" name="object" isOrdered="true"
+ lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Element.get" name="get" isOrdered="true" lower="0"
+ type="FlatQVT.Object">
+ <ownedParameter xmi:id="FlatQVT.Element.get.property" name="property" isOrdered="true"
+ lower="0" type="FlatQVT.Property"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Element.getMetaClass" name="getMetaClass" isOrdered="true"
+ lower="0" type="FlatQVT.Class"/>
+ <ownedOperation xmi:id="FlatQVT.Element.isSet" name="isSet" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.Element.isSet.property" name="property" isOrdered="true"
+ lower="0" type="FlatQVT.Property"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Element.set" name="set" isOrdered="true" lower="0">
+ <ownedParameter xmi:id="FlatQVT.Element.set.property" name="property" isOrdered="true"
+ lower="0" type="FlatQVT.Property"/>
+ <ownedParameter xmi:id="FlatQVT.Element.set.object" name="object" isOrdered="true"
+ lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Element.unset" name="unset" isOrdered="true" lower="0">
+ <ownedParameter xmi:id="FlatQVT.Element.unset.property" name="property" isOrdered="true"
+ lower="0" type="FlatQVT.Property"/>
+ </ownedOperation>
+ <ownedAttribute xmi:id="FlatQVT.Element.ownedComment" name="ownedComment" lower="0"
+ upper="*" type="FlatQVT.Comment" isComposite="true" opposite="FlatQVT.Comment.owningElement"/>
+ <ownedAttribute xmi:id="FlatQVT.Element.tag" name="tag" isOrdered="true" type="FlatQVT.Tag"
+ opposite="FlatQVT.Tag.element"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Enumeration" xmi:id="FlatQVT.EnforcementMode" name="EnforcementMode">
+ <ownedLiteral xmi:id="FlatQVT.EnforcementMode.Creation" name="Creation"/>
+ <ownedLiteral xmi:id="FlatQVT.EnforcementMode.Deletion" name="Deletion"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.EnforcementOperation" name="EnforcementOperation"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.EnforcementOperation.bottomPattern" name="bottomPattern"
+ isOrdered="true" type="FlatQVT.BottomPattern" opposite="FlatQVT.BottomPattern.enforcementOperation"/>
+ <ownedAttribute xmi:id="FlatQVT.EnforcementOperation.enforcementMode" name="enforcementMode"
+ isOrdered="true" lower="0" type="FlatQVT.EnforcementMode"/>
+ <ownedAttribute xmi:id="FlatQVT.EnforcementOperation.operationCallExp" name="operationCallExp"
+ isOrdered="true" type="FlatQVT.OperationCallExp" isComposite="true" opposite="FlatQVT.OperationCallExp.enforcementOperation"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.EntryOperation" name="EntryOperation"
+ superClass="FlatQVT.ImperativeOperation">
+ <ownedAttribute xmi:id="FlatQVT.EntryOperation.entryContext" name="entryContext"
+ isOrdered="true" type="FlatQVT.Module" opposite="FlatQVT.Module.entry"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.EnumLiteralExp" name="EnumLiteralExp"
+ superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.EnumLiteralExp.referredEnumLiteral" name="referredEnumLiteral"
+ isOrdered="true" lower="0" type="FlatQVT.EnumerationLiteral" opposite="FlatQVT.EnumerationLiteral.literalExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Enumeration" name="Enumeration"
+ superClass="FlatQVT.DataType">
+ <ownedAttribute xmi:id="FlatQVT.Enumeration.ownedLiteral" name="ownedLiteral"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.EnumerationLiteral" isComposite="true"
+ opposite="FlatQVT.EnumerationLiteral.enumeration"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.EnumerationLiteral" name="EnumerationLiteral"
+ superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.EnumerationLiteral.enumeration" name="enumeration"
+ isOrdered="true" lower="0" type="FlatQVT.Enumeration" opposite="FlatQVT.Enumeration.ownedLiteral"/>
+ <ownedAttribute xmi:id="FlatQVT.EnumerationLiteral.literalExp" name="literalExp"
+ isOrdered="true" type="FlatQVT.EnumLiteralExp" opposite="FlatQVT.EnumLiteralExp.referredEnumLiteral"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ExpressionInOcl" name="ExpressionInOcl"
+ superClass="FlatQVT.TypedElement">
+ <ownedAttribute xmi:id="FlatQVT.ExpressionInOcl.bodyExpression" name="bodyExpression"
+ isOrdered="true" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.topExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.ExpressionInOcl.contextVariable" name="contextVariable"
+ isOrdered="true" lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.selfOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ExpressionInOcl.generatedType" name="generatedType"
+ lower="0" upper="*" type="FlatQVT.Type" isComposite="true" opposite="FlatQVT.Type.owningExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.ExpressionInOcl.parameterVariable" name="parameterVariable"
+ lower="0" upper="*" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.varOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ExpressionInOcl.resultVariable" name="resultVariable"
+ isOrdered="true" lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.resultOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Extent" name="Extent" superClass="FlatQVT.Object">
+ <ownedOperation xmi:id="FlatQVT.Extent.elements" name="elements" isOrdered="true"
+ lower="0" type="FlatQVT.ReflectiveSequence"/>
+ <ownedOperation xmi:id="FlatQVT.Extent.useContainment" name="useContainment" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedOperation>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Factory" name="Factory" superClass="FlatQVT.Element">
+ <ownedOperation xmi:id="FlatQVT.Factory.convertToString" name="convertToString"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ <ownedParameter xmi:id="FlatQVT.Factory.convertToString.dataType" name="dataType"
+ isOrdered="true" lower="0" type="FlatQVT.DataType"/>
+ <ownedParameter xmi:id="FlatQVT.Factory.convertToString.object" name="object"
+ isOrdered="true" lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Factory.create" name="create" isOrdered="true"
+ lower="0" type="FlatQVT.Element">
+ <ownedParameter xmi:id="FlatQVT.Factory.create.metaClass" name="metaClass" isOrdered="true"
+ lower="0" type="FlatQVT.Class"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.Factory.createFromString" name="createFromString"
+ isOrdered="true" lower="0" type="FlatQVT.Object">
+ <ownedParameter xmi:id="FlatQVT.Factory.createFromString.dataType" name="dataType"
+ isOrdered="true" lower="0" type="FlatQVT.DataType"/>
+ <ownedParameter xmi:id="FlatQVT.Factory.createFromString.string" name="string"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedAttribute xmi:id="FlatQVT.Factory.package" name="package" isOrdered="true"
+ type="FlatQVT.Package" opposite="FlatQVT.Package.factory"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.FeatureCallExp" name="FeatureCallExp"
+ isAbstract="true" superClass="FlatQVT.CallExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ForExp" name="ForExp" superClass="FlatQVT.ImperativeLoopExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Function" name="Function" superClass="FlatQVT.Operation">
+ <ownedAttribute xmi:id="FlatQVT.Function.queryExpression" name="queryExpression"
+ isOrdered="true" lower="0" type="FlatQVT.OclExpression" isComposite="true"
+ opposite="FlatQVT.OclExpression.function"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.FunctionParameter" name="FunctionParameter"
+ superClass="FlatQVT.Variable FlatQVT.Parameter"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.GuardPattern" name="GuardPattern"
+ superClass="FlatQVT.CorePattern">
+ <ownedAttribute xmi:id="FlatQVT.GuardPattern.area" name="area" isOrdered="true"
+ type="FlatQVT.Area" opposite="FlatQVT.Area.guardPattern"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Helper" name="Helper" superClass="FlatQVT.ImperativeOperation">
+ <ownedAttribute xmi:id="FlatQVT.Helper.isQuery" name="isQuery" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.IfExp" name="IfExp" superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.IfExp.condition" name="condition" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.ifOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.IfExp.elseExpression" name="elseExpression" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.elseOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.IfExp.thenExpression" name="thenExpression" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.thenOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ImperativeCallExp" name="ImperativeCallExp"
+ superClass="FlatQVT.OperationCallExp FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.ImperativeCallExp.isVirtual" name="isVirtual"
+ isOrdered="true" lower="0" default="true">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ImperativeExpression" name="ImperativeExpression"
+ isAbstract="true" superClass="FlatQVT.OclExpression"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ImperativeIterateExp" name="ImperativeIterateExp"
+ superClass="FlatQVT.ImperativeLoopExp">
+ <ownedAttribute xmi:id="FlatQVT.ImperativeIterateExp.target" name="target" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.tgtOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ImperativeLoopExp" name="ImperativeLoopExp"
+ isAbstract="true" superClass="FlatQVT.LoopExp FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.ImperativeLoopExp.condition" name="condition"
+ isOrdered="true" lower="0" type="FlatQVT.OclExpression" isComposite="true"
+ opposite="FlatQVT.OclExpression.loopCondOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ImperativeOperation" name="ImperativeOperation"
+ superClass="FlatQVT.Operation">
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.body" name="body" isOrdered="true"
+ lower="0" type="FlatQVT.OperationBody" isComposite="true" opposite="FlatQVT.OperationBody.operation"/>
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.context" name="context" isOrdered="true"
+ lower="0" type="FlatQVT.VarParameter" isComposite="true" opposite="FlatQVT.VarParameter.ctxOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.isBlackbox" name="isBlackbox"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.overridden" name="overridden"
+ isOrdered="true" lower="0" type="FlatQVT.ImperativeOperation" opposite="FlatQVT.ImperativeOperation.overriding"/>
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.result" name="result" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.VarParameter" isComposite="true" opposite="FlatQVT.VarParameter.resOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ImperativeOperation.overriding" name="overriding"
+ isOrdered="true" type="FlatQVT.ImperativeOperation" opposite="FlatQVT.ImperativeOperation.overridden"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Enumeration" xmi:id="FlatQVT.ImportKind" name="ImportKind">
+ <ownedLiteral xmi:id="FlatQVT.ImportKind.extension" name="extension"/>
+ <ownedLiteral xmi:id="FlatQVT.ImportKind.access" name="access"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.InstantiationExp" name="InstantiationExp"
+ superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.InstantiationExp.argument" name="argument" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.argOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.InstantiationExp.extent" name="extent" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" opposite="FlatQVT.Variable.instantiationExp"/>
+ <ownedAttribute xmi:id="FlatQVT.InstantiationExp.instantiatedClass" name="instantiatedClass"
+ isOrdered="true" type="FlatQVT.Class" opposite="FlatQVT.Class.instantiationExp"/>
+ <ownedAttribute xmi:id="FlatQVT.InstantiationExp.initializationOperation" name="initializationOperation"
+ isOrdered="true" lower="0" type="FlatQVT.Operation" opposite="FlatQVT.Operation.instantiationExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:PrimitiveType" xmi:id="FlatQVT.Integer" name="Integer"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.IntegerLiteralExp" name="IntegerLiteralExp"
+ superClass="FlatQVT.NumericLiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.IntegerLiteralExp.integerSymbol" name="integerSymbol"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.InvalidLiteralExp" name="InvalidLiteralExp"
+ superClass="FlatQVT.LiteralExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.InvalidType" name="InvalidType"
+ superClass="FlatQVT.Type"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.IterateExp" name="IterateExp" superClass="FlatQVT.LoopExp">
+ <ownedAttribute xmi:id="FlatQVT.IterateExp.result" name="result" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.baseExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.IteratorExp" name="IteratorExp"
+ superClass="FlatQVT.LoopExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Key" name="Key" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Key.identifies" name="identifies" isOrdered="true"
+ type="FlatQVT.Class" opposite="FlatQVT.Class.key"/>
+ <ownedAttribute xmi:id="FlatQVT.Key.oppositePart" name="oppositePart" lower="0"
+ upper="*" type="FlatQVT.Property" opposite="FlatQVT.Property.oppKey"/>
+ <ownedAttribute xmi:id="FlatQVT.Key.part" name="part" lower="0" upper="*" type="FlatQVT.Property"
+ opposite="FlatQVT.Property.key"/>
+ <ownedAttribute xmi:id="FlatQVT.Key.transformation" name="transformation" isOrdered="true"
+ lower="0" type="FlatQVT.RelationalTransformation" opposite="FlatQVT.RelationalTransformation.ownedKey"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.LetExp" name="LetExp" superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.LetExp.in" name="in" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.letExp"/>
+ <ownedAttribute xmi:id="FlatQVT.LetExp.variable" name="variable" isOrdered="true"
+ type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.letExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Library" name="Library" superClass="FlatQVT.Module"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ListLiteralExp" name="ListLiteralExp"
+ superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.ListLiteralExp.element" name="element" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.listLiteralExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ListType" name="ListType" superClass="FlatQVT.CollectionType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.LiteralExp" name="LiteralExp" isAbstract="true"
+ superClass="FlatQVT.OclExpression"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.LogExp" name="LogExp" superClass="FlatQVT.OperationCallExp FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.LogExp.condition" name="condition" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.logOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.LogExp.assertExp" name="assertExp" isOrdered="true"
+ type="FlatQVT.AssertExp" opposite="FlatQVT.AssertExp.log"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.LoopExp" name="LoopExp" isAbstract="true"
+ superClass="FlatQVT.CallExp FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.LoopExp.body" name="body" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.loopBodyOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.LoopExp.iterator" name="iterator" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.loopExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Mapping" name="Mapping" superClass="FlatQVT.Rule FlatQVT.Area">
+ <ownedAttribute xmi:id="FlatQVT.Mapping.context" name="context" isOrdered="true"
+ lower="0" type="FlatQVT.Mapping" opposite="FlatQVT.Mapping.local"/>
+ <ownedAttribute xmi:id="FlatQVT.Mapping.local" name="local" lower="0" upper="*"
+ type="FlatQVT.Mapping" isComposite="true" opposite="FlatQVT.Mapping.context"/>
+ <ownedAttribute xmi:id="FlatQVT.Mapping.refinement" name="refinement" lower="0"
+ upper="*" type="FlatQVT.Mapping" opposite="FlatQVT.Mapping.specification"/>
+ <ownedAttribute xmi:id="FlatQVT.Mapping.specification" name="specification" lower="0"
+ upper="*" type="FlatQVT.Mapping" opposite="FlatQVT.Mapping.refinement"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.MappingBody" name="MappingBody"
+ superClass="FlatQVT.OperationBody">
+ <ownedAttribute xmi:id="FlatQVT.MappingBody.endSection" name="endSection" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.endOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingBody.initSection" name="initSection" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.initOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.MappingCallExp" name="MappingCallExp"
+ superClass="FlatQVT.ImperativeCallExp">
+ <ownedAttribute xmi:id="FlatQVT.MappingCallExp.isStrict" name="isStrict" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.MappingOperation" name="MappingOperation"
+ superClass="FlatQVT.ImperativeOperation">
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.disjunct" name="disjunct" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.disjuncter"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.inherited" name="inherited" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.inheriting"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.merged" name="merged" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.merging"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.refinedRelation" name="refinedRelation"
+ isOrdered="true" lower="0" type="FlatQVT.Relation" opposite="FlatQVT.Relation.refiningOperation"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.when" name="when" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.whenOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.where" name="where" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.whereOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.disjuncter" name="disjuncter"
+ isOrdered="true" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.disjunct"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.inheriting" name="inheriting"
+ isOrdered="true" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.inherited"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.merging" name="merging" isOrdered="true"
+ type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.merged"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingOperation.resolveExpression" name="resolveExpression"
+ isOrdered="true" type="FlatQVT.ResolveInExp" opposite="FlatQVT.ResolveInExp.inMapping"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.MappingParameter" name="MappingParameter"
+ superClass="FlatQVT.VarParameter">
+ <ownedAttribute xmi:id="FlatQVT.MappingParameter.extent" name="extent" isOrdered="true"
+ lower="0" type="FlatQVT.ModelParameter" opposite="FlatQVT.ModelParameter.mappingParameter"/>
+ <ownedAttribute xmi:id="FlatQVT.MappingParameter.referredDomain" name="referredDomain"
+ isOrdered="true" lower="0" type="FlatQVT.RelationDomain" opposite="FlatQVT.RelationDomain.referringParameter"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ModelParameter" name="ModelParameter"
+ superClass="FlatQVT.VarParameter">
+ <ownedAttribute xmi:id="FlatQVT.ModelParameter.module" name="module" isOrdered="true"
+ type="FlatQVT.OperationalTransformation" opposite="FlatQVT.OperationalTransformation.modelParameter"/>
+ <ownedAttribute xmi:id="FlatQVT.ModelParameter.mappingParameter" name="mappingParameter"
+ isOrdered="true" type="FlatQVT.MappingParameter" opposite="FlatQVT.MappingParameter.extent"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ModelType" name="ModelType" superClass="FlatQVT.Class">
+ <ownedAttribute xmi:id="FlatQVT.ModelType.additionalCondition" name="additionalCondition"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true"
+ opposite="FlatQVT.OclExpression.condOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.ModelType.conformanceKind" name="conformanceKind"
+ isOrdered="true" lower="0" default="effective">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.ModelType.metamodel" name="metamodel" isOrdered="true"
+ upper="*" type="FlatQVT.Package" opposite="FlatQVT.Package.modelType"/>
+ <ownedAttribute xmi:id="FlatQVT.ModelType.module" name="module" isOrdered="true"
+ type="FlatQVT.Module" opposite="FlatQVT.Module.usedModelType"/>
+ <ownedAttribute xmi:id="FlatQVT.ModelType.moduleImport" name="moduleImport" isOrdered="true"
+ type="FlatQVT.ModuleImport" opposite="FlatQVT.ModuleImport.binding"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Module" name="Module" superClass="FlatQVT.Class FlatQVT.Package">
+ <ownedAttribute xmi:id="FlatQVT.Module.configProperty" name="configProperty" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.Property" opposite="FlatQVT.Property.module"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.entry" name="entry" isOrdered="true" lower="0"
+ type="FlatQVT.EntryOperation" opposite="FlatQVT.EntryOperation.entryContext"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.isBlackbox" name="isBlackbox" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Module.moduleImport" name="moduleImport" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.ModuleImport" isComposite="true" opposite="FlatQVT.ModuleImport.module"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.ownedTag" name="ownedTag" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.Tag" isComposite="true" opposite="FlatQVT.Tag.owner"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.ownedVariable" name="ownedVariable" lower="0"
+ upper="*" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.variableOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.usedModelType" name="usedModelType" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.ModelType" opposite="FlatQVT.ModelType.module"/>
+ <ownedAttribute xmi:id="FlatQVT.Module.importingElement" name="importingElement"
+ isOrdered="true" type="FlatQVT.ModuleImport" opposite="FlatQVT.ModuleImport.importedModule"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ModuleImport" name="ModuleImport"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.ModuleImport.binding" name="binding" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.ModelType" opposite="FlatQVT.ModelType.moduleImport"/>
+ <ownedAttribute xmi:id="FlatQVT.ModuleImport.importedModule" name="importedModule"
+ isOrdered="true" type="FlatQVT.Module" opposite="FlatQVT.Module.importingElement"/>
+ <ownedAttribute xmi:id="FlatQVT.ModuleImport.kind" name="kind" isOrdered="true"
+ lower="0" type="FlatQVT.ImportKind"/>
+ <ownedAttribute xmi:id="FlatQVT.ModuleImport.module" name="module" isOrdered="true"
+ lower="0" type="FlatQVT.Module" opposite="FlatQVT.Module.moduleImport"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.MultiplicityElement" name="MultiplicityElement"
+ isAbstract="true">
+ <ownedAttribute xmi:id="FlatQVT.MultiplicityElement.isOrdered" name="isOrdered"
+ isOrdered="true" lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.MultiplicityElement.isUnique" name="isUnique"
+ isOrdered="true" lower="0" default="true">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.MultiplicityElement.lower" name="lower" isOrdered="true"
+ lower="0" default="1">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.MultiplicityElement.upper" name="upper" isOrdered="true"
+ lower="0" type="FlatQVT.UnlimitedNatural" default="1"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.NamedElement" name="NamedElement"
+ isAbstract="true" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.NamedElement.name" name="name" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.NamedElement.comment" name="comment" isOrdered="true"
+ type="FlatQVT.Comment" opposite="FlatQVT.Comment.annotatedElement"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.NavigationCallExp" name="NavigationCallExp"
+ superClass="FlatQVT.FeatureCallExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.NullLiteralExp" name="NullLiteralExp"
+ superClass="FlatQVT.LiteralExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.NumericLiteralExp" name="NumericLiteralExp"
+ isAbstract="true" superClass="FlatQVT.PrimitiveLiteralExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Object" name="Object"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ObjectExp" name="ObjectExp" superClass="FlatQVT.InstantiationExp">
+ <ownedAttribute xmi:id="FlatQVT.ObjectExp.body" name="body" isOrdered="true" type="FlatQVT.ConstructorBody"
+ isComposite="true" opposite="FlatQVT.ConstructorBody.objectExp"/>
+ <ownedAttribute xmi:id="FlatQVT.ObjectExp.referredObject" name="referredObject"
+ isOrdered="true" type="FlatQVT.Variable" opposite="FlatQVT.Variable.objectExpression"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ObjectTemplateExp" name="ObjectTemplateExp"
+ superClass="FlatQVT.TemplateExp">
+ <ownedAttribute xmi:id="FlatQVT.ObjectTemplateExp.part" name="part" lower="0"
+ upper="*" type="FlatQVT.PropertyTemplateItem" isComposite="true" opposite="FlatQVT.PropertyTemplateItem.objContainer"/>
+ <ownedAttribute xmi:id="FlatQVT.ObjectTemplateExp.referredClass" name="referredClass"
+ isOrdered="true" type="FlatQVT.Class" opposite="FlatQVT.Class.objectTemplateExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OclExpression" name="OclExpression"
+ isAbstract="true" superClass="FlatQVT.TypedElement">
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.altBodyOwner" name="altBodyOwner"
+ isOrdered="true" type="FlatQVT.AltExp" opposite="FlatQVT.AltExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.altCondOwner" name="altCondOwner"
+ isOrdered="true" type="FlatQVT.AltExp" opposite="FlatQVT.AltExp.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.assertOwner" name="assertOwner"
+ isOrdered="true" type="FlatQVT.AssertExp" opposite="FlatQVT.AssertExp.assertion"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.defaultOwner" name="defaultOwner"
+ isOrdered="true" type="FlatQVT.AssignExp" opposite="FlatQVT.AssignExp.defaultValue"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.leftOwner" name="leftOwner" isOrdered="true"
+ type="FlatQVT.AssignExp" opposite="FlatQVT.AssignExp.left"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.valueOwner" name="valueOwner" isOrdered="true"
+ type="FlatQVT.AssignExp" opposite="FlatQVT.AssignExp.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.valueAssignment" name="valueAssignment"
+ isOrdered="true" type="FlatQVT.Assignment" opposite="FlatQVT.Assignment.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.blockOwner" name="blockOwner" isOrdered="true"
+ type="FlatQVT.BlockExp" opposite="FlatQVT.BlockExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.appliedElement" name="appliedElement"
+ isOrdered="true" type="FlatQVT.CallExp" opposite="FlatQVT.CallExp.source"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.catchExp" name="catchExp" isOrdered="true"
+ type="FlatQVT.CatchExp" opposite="FlatQVT.CatchExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.collectionItem" name="collectionItem"
+ isOrdered="true" type="FlatQVT.CollectionItem" opposite="FlatQVT.CollectionItem.item"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.firstOwner" name="firstOwner" isOrdered="true"
+ type="FlatQVT.CollectionRange" opposite="FlatQVT.CollectionRange.first"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.lastOwner" name="lastOwner" isOrdered="true"
+ type="FlatQVT.CollectionRange" opposite="FlatQVT.CollectionRange.last"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.listContainer" name="listContainer"
+ isOrdered="true" type="FlatQVT.CollectionTemplateExp" opposite="FlatQVT.CollectionTemplateExp.member"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.computeOwner" name="computeOwner"
+ isOrdered="true" type="FlatQVT.ComputeExp" opposite="FlatQVT.ComputeExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.ownerProperty" name="ownerProperty"
+ isOrdered="true" type="FlatQVT.ContextualProperty" opposite="FlatQVT.ContextualProperty.initExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.keyOwner" name="keyOwner" isOrdered="true"
+ type="FlatQVT.DictLiteralPart" opposite="FlatQVT.DictLiteralPart.key"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.valOwner" name="valOwner" isOrdered="true"
+ type="FlatQVT.DictLiteralPart" opposite="FlatQVT.DictLiteralPart.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.topExpression" name="topExpression"
+ isOrdered="true" type="FlatQVT.ExpressionInOcl" opposite="FlatQVT.ExpressionInOcl.bodyExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.function" name="function" isOrdered="true"
+ type="FlatQVT.Function" opposite="FlatQVT.Function.queryExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.ifOwner" name="ifOwner" isOrdered="true"
+ type="FlatQVT.IfExp" opposite="FlatQVT.IfExp.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.elseOwner" name="elseOwner" isOrdered="true"
+ type="FlatQVT.IfExp" opposite="FlatQVT.IfExp.elseExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.thenOwner" name="thenOwner" isOrdered="true"
+ type="FlatQVT.IfExp" opposite="FlatQVT.IfExp.thenExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.loopCondOwner" name="loopCondOwner"
+ isOrdered="true" type="FlatQVT.ImperativeLoopExp" opposite="FlatQVT.ImperativeLoopExp.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.argOwner" name="argOwner" isOrdered="true"
+ type="FlatQVT.InstantiationExp" opposite="FlatQVT.InstantiationExp.argument"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.letExp" name="letExp" isOrdered="true"
+ type="FlatQVT.LetExp" opposite="FlatQVT.LetExp.in"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.listLiteralExp" name="listLiteralExp"
+ isOrdered="true" type="FlatQVT.ListLiteralExp" opposite="FlatQVT.ListLiteralExp.element"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.logOwner" name="logOwner" isOrdered="true"
+ type="FlatQVT.LogExp" opposite="FlatQVT.LogExp.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.loopBodyOwner" name="loopBodyOwner"
+ isOrdered="true" type="FlatQVT.LoopExp" opposite="FlatQVT.LoopExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.endOwner" name="endOwner" isOrdered="true"
+ type="FlatQVT.MappingBody" opposite="FlatQVT.MappingBody.endSection"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.initOwner" name="initOwner" isOrdered="true"
+ type="FlatQVT.MappingBody" opposite="FlatQVT.MappingBody.initSection"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.whenOwner" name="whenOwner" isOrdered="true"
+ type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.when"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.whereOwner" name="whereOwner" isOrdered="true"
+ type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.where"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.condOwner" name="condOwner" isOrdered="true"
+ type="FlatQVT.ModelType" opposite="FlatQVT.ModelType.additionalCondition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.contentOwner" name="contentOwner"
+ isOrdered="true" type="FlatQVT.OperationBody" opposite="FlatQVT.OperationBody.content"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.parentCall" name="parentCall" isOrdered="true"
+ type="FlatQVT.OperationCallExp" opposite="FlatQVT.OperationCallExp.argument"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.predicate" name="predicate" isOrdered="true"
+ type="FlatQVT.Predicate" opposite="FlatQVT.Predicate.conditionExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.slotAssignment" name="slotAssignment"
+ isOrdered="true" type="FlatQVT.PropertyAssignment" opposite="FlatQVT.PropertyAssignment.slotExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.propertyItem" name="propertyItem"
+ isOrdered="true" type="FlatQVT.PropertyTemplateItem" opposite="FlatQVT.PropertyTemplateItem.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.raiseExp" name="raiseExp" isOrdered="true"
+ type="FlatQVT.RaiseExp" opposite="FlatQVT.RaiseExp.argument"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.relationCallExp" name="relationCallExp"
+ isOrdered="true" type="FlatQVT.RelationCallExp" opposite="FlatQVT.RelationCallExp.argument"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.domainAssignment" name="domainAssignment"
+ isOrdered="true" type="FlatQVT.RelationDomainAssignment" opposite="FlatQVT.RelationDomainAssignment.valueExp"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.resolveExp" name="resolveExp" isOrdered="true"
+ type="FlatQVT.ResolveExp" opposite="FlatQVT.ResolveExp.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.returnExp" name="returnExp" isOrdered="true"
+ type="FlatQVT.ReturnExp" opposite="FlatQVT.ReturnExp.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.elsePartOwner" name="elsePartOwner"
+ isOrdered="true" type="FlatQVT.SwitchExp" opposite="FlatQVT.SwitchExp.elsePart"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.owner" name="owner" isOrdered="true"
+ type="FlatQVT.TemplateExp" opposite="FlatQVT.TemplateExp.where"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.tryBodyOwner" name="tryBodyOwner"
+ isOrdered="true" type="FlatQVT.TryExp" opposite="FlatQVT.TryExp.tryBody"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.tupleLiteralPart" name="tupleLiteralPart"
+ isOrdered="true" type="FlatQVT.TupleLiteralPart" opposite="FlatQVT.TupleLiteralPart.value"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.typedef" name="typedef" isOrdered="true"
+ type="FlatQVT.Typedef" opposite="FlatQVT.Typedef.condition"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.itemUnlink" name="itemUnlink" isOrdered="true"
+ type="FlatQVT.UnlinkExp" opposite="FlatQVT.UnlinkExp.item"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.tgtUnlink" name="tgtUnlink" isOrdered="true"
+ type="FlatQVT.UnlinkExp" opposite="FlatQVT.UnlinkExp.target"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.initializedElement" name="initializedElement"
+ isOrdered="true" type="FlatQVT.Variable" opposite="FlatQVT.Variable.initExpression"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.whileOwner" name="whileOwner" isOrdered="true"
+ type="FlatQVT.WhileExp" opposite="FlatQVT.WhileExp.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OclExpression.whileExpression" name="whileExpression"
+ isOrdered="true" type="FlatQVT.WhileExp" opposite="FlatQVT.WhileExp.condition"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Operation" name="Operation" superClass="FlatQVT.TypedElement FlatQVT.MultiplicityElement">
+ <ownedAttribute xmi:id="FlatQVT.Operation.class" name="class" isOrdered="true"
+ lower="0" type="FlatQVT.Class" opposite="FlatQVT.Class.ownedOperation"/>
+ <ownedAttribute xmi:id="FlatQVT.Operation.ownedParameter" name="ownedParameter"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.Parameter" isComposite="true"
+ opposite="FlatQVT.Parameter.operation"/>
+ <ownedAttribute xmi:id="FlatQVT.Operation.raisedException" name="raisedException"
+ lower="0" upper="*" type="FlatQVT.Type" opposite="FlatQVT.Type.operation"/>
+ <ownedAttribute xmi:id="FlatQVT.Operation.instantiationExp" name="instantiationExp"
+ isOrdered="true" type="FlatQVT.InstantiationExp" opposite="FlatQVT.InstantiationExp.initializationOperation"/>
+ <ownedAttribute xmi:id="FlatQVT.Operation.referringExp" name="referringExp" isOrdered="true"
+ type="FlatQVT.OperationCallExp" opposite="FlatQVT.OperationCallExp.referredOperation"/>
+ <ownedAttribute xmi:id="FlatQVT.Operation.relationImplementation" name="relationImplementation"
+ isOrdered="true" type="FlatQVT.RelationImplementation" opposite="FlatQVT.RelationImplementation.impl"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OperationBody" name="OperationBody"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.OperationBody.content" name="content" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.contentOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationBody.operation" name="operation" isOrdered="true"
+ lower="0" type="FlatQVT.ImperativeOperation" opposite="FlatQVT.ImperativeOperation.body"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationBody.variable" name="variable" lower="0"
+ upper="*" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.opBody"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OperationCallExp" name="OperationCallExp"
+ superClass="FlatQVT.FeatureCallExp">
+ <ownedAttribute xmi:id="FlatQVT.OperationCallExp.argument" name="argument" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.parentCall"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationCallExp.referredOperation" name="referredOperation"
+ isOrdered="true" lower="0" type="FlatQVT.Operation" opposite="FlatQVT.Operation.referringExp"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationCallExp.enforcementOperation" name="enforcementOperation"
+ isOrdered="true" type="FlatQVT.EnforcementOperation" opposite="FlatQVT.EnforcementOperation.operationCallExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OperationalTransformation" name="OperationalTransformation"
+ superClass="FlatQVT.Module">
+ <ownedAttribute xmi:id="FlatQVT.OperationalTransformation.intermediateClass" name="intermediateClass"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.Class" opposite="FlatQVT.Class.transfClient"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationalTransformation.intermediateProperty"
+ name="intermediateProperty" isOrdered="true" lower="0" upper="*" type="FlatQVT.Property"
+ opposite="FlatQVT.Property.transfClient"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationalTransformation.modelParameter" name="modelParameter"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.ModelParameter" isComposite="true"
+ opposite="FlatQVT.ModelParameter.module"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationalTransformation.refined" name="refined"
+ isOrdered="true" lower="0" type="FlatQVT.RelationalTransformation" opposite="FlatQVT.RelationalTransformation.refinement"/>
+ <ownedAttribute xmi:id="FlatQVT.OperationalTransformation.relation" name="relation"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.Relation" isComposite="true"
+ opposite="FlatQVT.Relation.owner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OppositePropertyCallExp" name="OppositePropertyCallExp"
+ superClass="FlatQVT.PropertyCallExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.OrderedSetType" name="OrderedSetType"
+ superClass="FlatQVT.CollectionType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Package" name="Package" superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.Package.nestedPackage" name="nestedPackage" lower="0"
+ upper="*" type="FlatQVT.Package" isComposite="true" opposite="FlatQVT.Package.nestingPackage"/>
+ <ownedAttribute xmi:id="FlatQVT.Package.nestingPackage" name="nestingPackage"
+ isOrdered="true" lower="0" type="FlatQVT.Package" opposite="FlatQVT.Package.nestedPackage"/>
+ <ownedAttribute xmi:id="FlatQVT.Package.ownedType" name="ownedType" lower="0"
+ upper="*" type="FlatQVT.Type" isComposite="true" opposite="FlatQVT.Type.package"/>
+ <ownedAttribute xmi:id="FlatQVT.Package.uri" name="uri" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Package.factory" name="factory" isOrdered="true"
+ type="FlatQVT.Factory" opposite="FlatQVT.Factory.package"/>
+ <ownedAttribute xmi:id="FlatQVT.Package.modelType" name="modelType" isOrdered="true"
+ type="FlatQVT.ModelType" opposite="FlatQVT.ModelType.metamodel"/>
+ <ownedAttribute xmi:id="FlatQVT.Package.typedModel" name="typedModel" isOrdered="true"
+ type="FlatQVT.TypedModel" opposite="FlatQVT.TypedModel.usedPackage"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Parameter" name="Parameter" superClass="FlatQVT.TypedElement FlatQVT.MultiplicityElement">
+ <ownedAttribute xmi:id="FlatQVT.Parameter.operation" name="operation" isOrdered="true"
+ lower="0" type="FlatQVT.Operation" opposite="FlatQVT.Operation.ownedParameter"/>
+ <ownedAttribute xmi:id="FlatQVT.Parameter.variable" name="variable" isOrdered="true"
+ type="FlatQVT.Variable" opposite="FlatQVT.Variable.representedParameter"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Pattern" name="Pattern" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Pattern.bindsTo" name="bindsTo" lower="0" upper="*"
+ type="FlatQVT.Variable" opposite="FlatQVT.Variable.pattern"/>
+ <ownedAttribute xmi:id="FlatQVT.Pattern.predicate" name="predicate" lower="0"
+ upper="*" type="FlatQVT.Predicate" isComposite="true" opposite="FlatQVT.Predicate.pattern"/>
+ <ownedAttribute xmi:id="FlatQVT.Pattern.whenOwner" name="whenOwner" isOrdered="true"
+ type="FlatQVT.Relation" opposite="FlatQVT.Relation.when"/>
+ <ownedAttribute xmi:id="FlatQVT.Pattern.whereOwner" name="whereOwner" isOrdered="true"
+ type="FlatQVT.Relation" opposite="FlatQVT.Relation.where"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Predicate" name="Predicate" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Predicate.conditionExpression" name="conditionExpression"
+ isOrdered="true" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.predicate"/>
+ <ownedAttribute xmi:id="FlatQVT.Predicate.pattern" name="pattern" isOrdered="true"
+ type="FlatQVT.Pattern" opposite="FlatQVT.Pattern.predicate"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.PrimitiveLiteralExp" name="PrimitiveLiteralExp"
+ isAbstract="true" superClass="FlatQVT.LiteralExp"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.PrimitiveType" name="PrimitiveType"
+ superClass="FlatQVT.DataType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Property" name="Property" superClass="FlatQVT.TypedElement FlatQVT.MultiplicityElement">
+ <ownedAttribute xmi:id="FlatQVT.Property.class" name="class" isOrdered="true"
+ lower="0" type="FlatQVT.Class" opposite="FlatQVT.Class.ownedAttribute"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.default" name="default" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Property.isComposite" name="isComposite" isOrdered="true"
+ lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Property.isDerived" name="isDerived" isOrdered="true"
+ lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Property.isID" name="isID" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Property.isReadOnly" name="isReadOnly" isOrdered="true"
+ lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Property.opposite" name="opposite" isOrdered="true"
+ lower="0" type="FlatQVT.Property" opposite="FlatQVT.Property.property"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.overriding" name="overriding" isOrdered="true"
+ type="FlatQVT.ContextualProperty" opposite="FlatQVT.ContextualProperty.overridden"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.oppKey" name="oppKey" isOrdered="true"
+ type="FlatQVT.Key" opposite="FlatQVT.Key.oppositePart"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.key" name="key" isOrdered="true" type="FlatQVT.Key"
+ opposite="FlatQVT.Key.part"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.module" name="module" isOrdered="true"
+ type="FlatQVT.Module" opposite="FlatQVT.Module.configProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.transfClient" name="transfClient" isOrdered="true"
+ type="FlatQVT.OperationalTransformation" opposite="FlatQVT.OperationalTransformation.intermediateProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.property" name="property" isOrdered="true"
+ type="FlatQVT.Property" opposite="FlatQVT.Property.opposite"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.assignment" name="assignment" isOrdered="true"
+ type="FlatQVT.PropertyAssignment" opposite="FlatQVT.PropertyAssignment.targetProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.referringExp" name="referringExp" isOrdered="true"
+ type="FlatQVT.PropertyCallExp" opposite="FlatQVT.PropertyCallExp.referredProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.propertyItem" name="propertyItem" isOrdered="true"
+ type="FlatQVT.PropertyTemplateItem" opposite="FlatQVT.PropertyTemplateItem.referredProperty"/>
+ <ownedAttribute xmi:id="FlatQVT.Property.tupleLiteralPart" name="tupleLiteralPart"
+ isOrdered="true" type="FlatQVT.TupleLiteralPart" opposite="FlatQVT.TupleLiteralPart.attribute"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.PropertyAssignment" name="PropertyAssignment"
+ superClass="FlatQVT.Assignment">
+ <ownedAttribute xmi:id="FlatQVT.PropertyAssignment.slotExpression" name="slotExpression"
+ isOrdered="true" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.slotAssignment"/>
+ <ownedAttribute xmi:id="FlatQVT.PropertyAssignment.targetProperty" name="targetProperty"
+ isOrdered="true" type="FlatQVT.Property" opposite="FlatQVT.Property.assignment"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.PropertyCallExp" name="PropertyCallExp"
+ superClass="FlatQVT.NavigationCallExp">
+ <ownedAttribute xmi:id="FlatQVT.PropertyCallExp.referredProperty" name="referredProperty"
+ isOrdered="true" lower="0" type="FlatQVT.Property" opposite="FlatQVT.Property.referringExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.PropertyTemplateItem" name="PropertyTemplateItem"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.PropertyTemplateItem.isOpposite" name="isOpposite"
+ isOrdered="true" lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.PropertyTemplateItem.objContainer" name="objContainer"
+ isOrdered="true" type="FlatQVT.ObjectTemplateExp" opposite="FlatQVT.ObjectTemplateExp.part"/>
+ <ownedAttribute xmi:id="FlatQVT.PropertyTemplateItem.referredProperty" name="referredProperty"
+ isOrdered="true" type="FlatQVT.Property" opposite="FlatQVT.Property.propertyItem"/>
+ <ownedAttribute xmi:id="FlatQVT.PropertyTemplateItem.value" name="value" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.propertyItem"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RaiseExp" name="RaiseExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.RaiseExp.argument" name="argument" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.raiseExp"/>
+ <ownedAttribute xmi:id="FlatQVT.RaiseExp.exception" name="exception" isOrdered="true"
+ type="FlatQVT.Type" opposite="FlatQVT.Type.raiseExpression"/>
+ </ownedType>
+ <ownedType xmi:type="emof:PrimitiveType" xmi:id="FlatQVT.Real" name="Real"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RealLiteralExp" name="RealLiteralExp"
+ superClass="FlatQVT.NumericLiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.RealLiteralExp.realSymbol" name="realSymbol" isOrdered="true"
+ lower="0" type="FlatQVT.Real"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RealizedVariable" name="RealizedVariable"
+ superClass="FlatQVT.Variable">
+ <ownedAttribute xmi:id="FlatQVT.RealizedVariable.bottomPattern" name="bottomPattern"
+ isOrdered="true" type="FlatQVT.BottomPattern" opposite="FlatQVT.BottomPattern.realizedVariable"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ReflectiveCollection" name="ReflectiveCollection"
+ superClass="FlatQVT.Object">
+ <ownedOperation xmi:id="FlatQVT.ReflectiveCollection.add" name="add" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.ReflectiveCollection.add.object" name="object"
+ isOrdered="true" lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveCollection.addAll" name="addAll" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.ReflectiveCollection.addAll.objects" name="objects"
+ isOrdered="true" lower="0" type="FlatQVT.ReflectiveSequence"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveCollection.clear" name="clear" isOrdered="true"
+ lower="0"/>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveCollection.remove" name="remove" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.ReflectiveCollection.remove.object" name="object"
+ isOrdered="true" lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveCollection.size" name="size" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedOperation>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ReflectiveSequence" name="ReflectiveSequence"
+ superClass="FlatQVT.ReflectiveCollection">
+ <ownedOperation xmi:id="FlatQVT.ReflectiveSequence.add" name="add" isOrdered="true"
+ lower="0">
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.add.index" name="index" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedParameter>
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.add.object" name="object"
+ isOrdered="true" lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveSequence.get" name="get" isOrdered="true"
+ lower="0" type="FlatQVT.Object">
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.get.index" name="index" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveSequence.remove" name="remove" isOrdered="true"
+ lower="0" type="FlatQVT.Object">
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.remove.index" name="index"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.ReflectiveSequence.set" name="set" isOrdered="true"
+ lower="0" type="FlatQVT.Object">
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.set.index" name="index" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Integer"/>
+ </ownedParameter>
+ <ownedParameter xmi:id="FlatQVT.ReflectiveSequence.set.object" name="object"
+ isOrdered="true" lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Relation" name="Relation" superClass="FlatQVT.Rule">
+ <ownedAttribute xmi:id="FlatQVT.Relation.isTopLevel" name="isTopLevel" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Relation.operationalImpl" name="operationalImpl"
+ lower="0" upper="*" type="FlatQVT.RelationImplementation" isComposite="true"
+ opposite="FlatQVT.RelationImplementation.relation"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.variable" name="variable" lower="0" upper="*"
+ type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.relation"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.when" name="when" isOrdered="true" lower="0"
+ type="FlatQVT.Pattern" isComposite="true" opposite="FlatQVT.Pattern.whenOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.where" name="where" isOrdered="true"
+ lower="0" type="FlatQVT.Pattern" isComposite="true" opposite="FlatQVT.Pattern.whereOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.refiningOperation" name="refiningOperation"
+ isOrdered="true" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.refinedRelation"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.owner" name="owner" isOrdered="true"
+ type="FlatQVT.OperationalTransformation" opposite="FlatQVT.OperationalTransformation.relation"/>
+ <ownedAttribute xmi:id="FlatQVT.Relation.relationCallExp" name="relationCallExp"
+ isOrdered="true" type="FlatQVT.RelationCallExp" opposite="FlatQVT.RelationCallExp.referredRelation"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RelationCallExp" name="RelationCallExp"
+ superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.RelationCallExp.argument" name="argument" isOrdered="true"
+ lower="2" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.relationCallExp"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationCallExp.referredRelation" name="referredRelation"
+ isOrdered="true" type="FlatQVT.Relation" opposite="FlatQVT.Relation.relationCallExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RelationDomain" name="RelationDomain"
+ superClass="FlatQVT.Domain">
+ <ownedAttribute xmi:id="FlatQVT.RelationDomain.defaultAssignment" name="defaultAssignment"
+ lower="0" upper="*" type="FlatQVT.RelationDomainAssignment" isComposite="true"
+ opposite="FlatQVT.RelationDomainAssignment.owner"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationDomain.pattern" name="pattern" isOrdered="true"
+ lower="0" type="FlatQVT.DomainPattern" isComposite="true" opposite="FlatQVT.DomainPattern.relationDomain"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationDomain.rootVariable" name="rootVariable"
+ isOrdered="true" type="FlatQVT.Variable" opposite="FlatQVT.Variable.relationDomain"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationDomain.referringParameter" name="referringParameter"
+ isOrdered="true" type="FlatQVT.MappingParameter" opposite="FlatQVT.MappingParameter.referredDomain"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RelationDomainAssignment" name="RelationDomainAssignment"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.RelationDomainAssignment.owner" name="owner" isOrdered="true"
+ type="FlatQVT.RelationDomain" opposite="FlatQVT.RelationDomain.defaultAssignment"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationDomainAssignment.valueExp" name="valueExp"
+ isOrdered="true" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.domainAssignment"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationDomainAssignment.variable" name="variable"
+ isOrdered="true" type="FlatQVT.Variable" opposite="FlatQVT.Variable.domainAssignment"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RelationImplementation" name="RelationImplementation"
+ superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.RelationImplementation.impl" name="impl" isOrdered="true"
+ type="FlatQVT.Operation" opposite="FlatQVT.Operation.relationImplementation"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationImplementation.inDirectionOf" name="inDirectionOf"
+ isOrdered="true" type="FlatQVT.TypedModel" opposite="FlatQVT.TypedModel.relationImplementation"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationImplementation.relation" name="relation"
+ isOrdered="true" type="FlatQVT.Relation" opposite="FlatQVT.Relation.operationalImpl"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.RelationalTransformation" name="RelationalTransformation"
+ superClass="FlatQVT.Transformation">
+ <ownedAttribute xmi:id="FlatQVT.RelationalTransformation.ownedKey" name="ownedKey"
+ lower="0" upper="*" type="FlatQVT.Key" isComposite="true" opposite="FlatQVT.Key.transformation"/>
+ <ownedAttribute xmi:id="FlatQVT.RelationalTransformation.refinement" name="refinement"
+ isOrdered="true" type="FlatQVT.OperationalTransformation" opposite="FlatQVT.OperationalTransformation.refined"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ResolveExp" name="ResolveExp" superClass="FlatQVT.CallExp FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.ResolveExp.condition" name="condition" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.resolveExp"/>
+ <ownedAttribute xmi:id="FlatQVT.ResolveExp.isDeferred" name="isDeferred" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.ResolveExp.isInverse" name="isInverse" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.ResolveExp.one" name="one" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.ResolveExp.target" name="target" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.resolveExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ResolveInExp" name="ResolveInExp"
+ superClass="FlatQVT.ResolveExp">
+ <ownedAttribute xmi:id="FlatQVT.ResolveInExp.inMapping" name="inMapping" isOrdered="true"
+ lower="0" type="FlatQVT.MappingOperation" opposite="FlatQVT.MappingOperation.resolveExpression"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.ReturnExp" name="ReturnExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.ReturnExp.value" name="value" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.returnExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Rule" name="Rule" isAbstract="true"
+ superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.Rule.domain" name="domain" isOrdered="true" lower="0"
+ upper="*" type="FlatQVT.Domain" isComposite="true" opposite="FlatQVT.Domain.rule"/>
+ <ownedAttribute xmi:id="FlatQVT.Rule.overrides" name="overrides" isOrdered="true"
+ lower="0" type="FlatQVT.Rule" opposite="FlatQVT.Rule.overridden"/>
+ <ownedAttribute xmi:id="FlatQVT.Rule.transformation" name="transformation" isOrdered="true"
+ lower="0" type="FlatQVT.Transformation" opposite="FlatQVT.Transformation.rule"/>
+ <ownedAttribute xmi:id="FlatQVT.Rule.overridden" name="overridden" isOrdered="true"
+ type="FlatQVT.Rule" opposite="FlatQVT.Rule.overrides"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.SequenceType" name="SequenceType"
+ superClass="FlatQVT.CollectionType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.SetType" name="SetType" superClass="FlatQVT.CollectionType"/>
+ <ownedType xmi:type="emof:Enumeration" xmi:id="FlatQVT.SeverityKind" name="SeverityKind">
+ <ownedLiteral xmi:id="FlatQVT.SeverityKind.error" name="error"/>
+ <ownedLiteral xmi:id="FlatQVT.SeverityKind.warning" name="warning"/>
+ <ownedLiteral xmi:id="FlatQVT.SeverityKind.fatal" name="fatal"/>
+ </ownedType>
+ <ownedType xmi:type="emof:PrimitiveType" xmi:id="FlatQVT.String" name="String"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.StringLiteralExp" name="StringLiteralExp"
+ superClass="FlatQVT.PrimitiveLiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.StringLiteralExp.stringSymbol" name="stringSymbol"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.SwitchExp" name="SwitchExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.SwitchExp.alternativePart" name="alternativePart"
+ isOrdered="true" lower="0" upper="*" type="FlatQVT.AltExp" isComposite="true"
+ opposite="FlatQVT.AltExp.altOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.SwitchExp.elsePart" name="elsePart" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.elsePartOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Tag" name="Tag" superClass="FlatQVT.Element">
+ <ownedAttribute xmi:id="FlatQVT.Tag.element" name="element" lower="0" upper="*"
+ type="FlatQVT.Element" opposite="FlatQVT.Element.tag"/>
+ <ownedAttribute xmi:id="FlatQVT.Tag.name" name="name" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Tag.value" name="value" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Tag.owner" name="owner" isOrdered="true" type="FlatQVT.Module"
+ opposite="FlatQVT.Module.ownedTag"/>
+ <ownedAttribute xmi:id="FlatQVT.Tag.transformation" name="transformation" isOrdered="true"
+ type="FlatQVT.Transformation" opposite="FlatQVT.Transformation.ownedTag"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TemplateExp" name="TemplateExp"
+ isAbstract="true" superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.TemplateExp.bindsTo" name="bindsTo" isOrdered="true"
+ lower="0" type="FlatQVT.Variable" opposite="FlatQVT.Variable.templateExp"/>
+ <ownedAttribute xmi:id="FlatQVT.TemplateExp.where" name="where" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.owner"/>
+ <ownedAttribute xmi:id="FlatQVT.TemplateExp.domainPattern" name="domainPattern"
+ isOrdered="true" type="FlatQVT.DomainPattern" opposite="FlatQVT.DomainPattern.templateExpression"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TemplateParameterType" name="TemplateParameterType"
+ superClass="FlatQVT.Type">
+ <ownedAttribute xmi:id="FlatQVT.TemplateParameterType.specification" name="specification"
+ isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Transformation" name="Transformation"
+ superClass="FlatQVT.Class FlatQVT.Package">
+ <ownedAttribute xmi:id="FlatQVT.Transformation.extends" name="extends" isOrdered="true"
+ lower="0" type="FlatQVT.Transformation" opposite="FlatQVT.Transformation.extendedBy"/>
+ <ownedAttribute xmi:id="FlatQVT.Transformation.modelParameter" name="modelParameter"
+ lower="0" upper="*" type="FlatQVT.TypedModel" isComposite="true" opposite="FlatQVT.TypedModel.transformation">
+ <ownedComment body="transformation">
+ <ownedComment body="http://schema.omg.org/spec/mof/2.0/emof.xmi#Property.oppositeRoleName"/>
+ </ownedComment>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="FlatQVT.Transformation.ownedTag" name="ownedTag" lower="0"
+ upper="*" type="FlatQVT.Tag" isComposite="true" opposite="FlatQVT.Tag.transformation"/>
+ <ownedAttribute xmi:id="FlatQVT.Transformation.rule" name="rule" lower="0" upper="*"
+ type="FlatQVT.Rule" isComposite="true" opposite="FlatQVT.Rule.transformation"/>
+ <ownedAttribute xmi:id="FlatQVT.Transformation.extendedBy" name="extendedBy" isOrdered="true"
+ type="FlatQVT.Transformation" opposite="FlatQVT.Transformation.extends"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TryExp" name="TryExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.TryExp.exceptClause" name="exceptClause" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.CatchExp" isComposite="true" opposite="FlatQVT.CatchExp.exceptOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.TryExp.tryBody" name="tryBody" isOrdered="true"
+ lower="0" upper="*" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.tryBodyOwner"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TupleLiteralExp" name="TupleLiteralExp"
+ superClass="FlatQVT.LiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.TupleLiteralExp.part" name="part" lower="0" upper="*"
+ type="FlatQVT.TupleLiteralPart" isComposite="true" opposite="FlatQVT.TupleLiteralPart.tupleLiteralExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TupleLiteralPart" name="TupleLiteralPart"
+ superClass="FlatQVT.TypedElement">
+ <ownedAttribute xmi:id="FlatQVT.TupleLiteralPart.attribute" name="attribute" isOrdered="true"
+ lower="0" type="FlatQVT.Property" opposite="FlatQVT.Property.tupleLiteralPart"/>
+ <ownedAttribute xmi:id="FlatQVT.TupleLiteralPart.tupleLiteralExp" name="tupleLiteralExp"
+ isOrdered="true" lower="0" type="FlatQVT.TupleLiteralExp" opposite="FlatQVT.TupleLiteralExp.part"/>
+ <ownedAttribute xmi:id="FlatQVT.TupleLiteralPart.value" name="value" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.tupleLiteralPart"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TupleType" name="TupleType" superClass="FlatQVT.Class FlatQVT.DataType"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Type" name="Type" isAbstract="true"
+ superClass="FlatQVT.NamedElement">
+ <ownedOperation xmi:id="FlatQVT.Type.isInstance" name="isInstance" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ <ownedParameter xmi:id="FlatQVT.Type.isInstance.object" name="object" isOrdered="true"
+ lower="0" type="FlatQVT.Object"/>
+ </ownedOperation>
+ <ownedAttribute xmi:id="FlatQVT.Type.package" name="package" isOrdered="true"
+ lower="0" type="FlatQVT.Package" opposite="FlatQVT.Package.ownedType"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.catchExp" name="catchExp" isOrdered="true"
+ type="FlatQVT.CatchExp" opposite="FlatQVT.CatchExp.exception"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.collectionType" name="collectionType" isOrdered="true"
+ type="FlatQVT.CollectionType" opposite="FlatQVT.CollectionType.elementType"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.keyDict" name="keyDict" isOrdered="true"
+ type="FlatQVT.DictionaryType" opposite="FlatQVT.DictionaryType.keyType"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.owningExpression" name="owningExpression"
+ isOrdered="true" type="FlatQVT.ExpressionInOcl" opposite="FlatQVT.ExpressionInOcl.generatedType"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.operation" name="operation" isOrdered="true"
+ type="FlatQVT.Operation" opposite="FlatQVT.Operation.raisedException"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.raiseExpression" name="raiseExpression" isOrdered="true"
+ type="FlatQVT.RaiseExp" opposite="FlatQVT.RaiseExp.exception"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.typeExp" name="typeExp" isOrdered="true"
+ type="FlatQVT.TypeExp" opposite="FlatQVT.TypeExp.referredType"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.typedElement" name="typedElement" isOrdered="true"
+ type="FlatQVT.TypedElement" opposite="FlatQVT.TypedElement.type"/>
+ <ownedAttribute xmi:id="FlatQVT.Type.typedef" name="typedef" isOrdered="true"
+ type="FlatQVT.Typedef" opposite="FlatQVT.Typedef.base"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TypeExp" name="TypeExp" superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.TypeExp.referredType" name="referredType" isOrdered="true"
+ lower="0" type="FlatQVT.Type" opposite="FlatQVT.Type.typeExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TypedElement" name="TypedElement"
+ isAbstract="true" superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.TypedElement.type" name="type" isOrdered="true"
+ lower="0" type="FlatQVT.Type" opposite="FlatQVT.Type.typedElement"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.TypedModel" name="TypedModel" superClass="FlatQVT.NamedElement">
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.dependsOn" name="dependsOn" lower="0"
+ upper="*" type="FlatQVT.TypedModel" opposite="FlatQVT.TypedModel.dependent"/>
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.transformation" name="transformation"
+ isOrdered="true" type="FlatQVT.Transformation" opposite="FlatQVT.Transformation.modelParameter"/>
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.usedPackage" name="usedPackage" upper="*"
+ type="FlatQVT.Package" opposite="FlatQVT.Package.typedModel"/>
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.domain" name="domain" isOrdered="true"
+ type="FlatQVT.Domain" opposite="FlatQVT.Domain.typedModel"/>
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.relationImplementation" name="relationImplementation"
+ isOrdered="true" type="FlatQVT.RelationImplementation" opposite="FlatQVT.RelationImplementation.inDirectionOf"/>
+ <ownedAttribute xmi:id="FlatQVT.TypedModel.dependent" name="dependent" isOrdered="true"
+ type="FlatQVT.TypedModel" opposite="FlatQVT.TypedModel.dependsOn"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Typedef" name="Typedef" superClass="FlatQVT.Class">
+ <ownedAttribute xmi:id="FlatQVT.Typedef.base" name="base" isOrdered="true" type="FlatQVT.Type"
+ opposite="FlatQVT.Type.typedef"/>
+ <ownedAttribute xmi:id="FlatQVT.Typedef.condition" name="condition" isOrdered="true"
+ lower="0" type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.typedef"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.URIExtent" name="URIExtent" superClass="FlatQVT.Extent">
+ <ownedOperation xmi:id="FlatQVT.URIExtent.contextURI" name="contextURI" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.URIExtent.element" name="element" isOrdered="true"
+ lower="0" type="FlatQVT.Element">
+ <ownedParameter xmi:id="FlatQVT.URIExtent.element.uri" name="uri" isOrdered="true"
+ lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:id="FlatQVT.URIExtent.uri" name="uri" isOrdered="true" lower="0">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#String"/>
+ <ownedParameter xmi:id="FlatQVT.URIExtent.uri.element" name="element" isOrdered="true"
+ lower="0" type="FlatQVT.Element"/>
+ </ownedOperation>
+ </ownedType>
+ <ownedType xmi:type="emof:PrimitiveType" xmi:id="FlatQVT.UnlimitedNatural" name="UnlimitedNatural"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.UnlimitedNaturalExp" name="UnlimitedNaturalExp"
+ superClass="FlatQVT.NumericLiteralExp">
+ <ownedAttribute xmi:id="FlatQVT.UnlimitedNaturalExp.symbol" name="symbol" isOrdered="true"
+ lower="0" type="FlatQVT.UnlimitedNatural"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.UnlinkExp" name="UnlinkExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.UnlinkExp.item" name="item" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.itemUnlink"/>
+ <ownedAttribute xmi:id="FlatQVT.UnlinkExp.target" name="target" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.tgtUnlink"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.VarParameter" name="VarParameter"
+ superClass="FlatQVT.Variable FlatQVT.Parameter">
+ <ownedAttribute xmi:id="FlatQVT.VarParameter.ctxOwner" name="ctxOwner" isOrdered="true"
+ lower="0" type="FlatQVT.ImperativeOperation" opposite="FlatQVT.ImperativeOperation.context"/>
+ <ownedAttribute xmi:id="FlatQVT.VarParameter.kind" name="kind" isOrdered="true"
+ lower="0" type="FlatQVT.DirectionKind"/>
+ <ownedAttribute xmi:id="FlatQVT.VarParameter.resOwner" name="resOwner" isOrdered="true"
+ lower="0" type="FlatQVT.ImperativeOperation" opposite="FlatQVT.ImperativeOperation.result"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.Variable" name="Variable" superClass="FlatQVT.TypedElement">
+ <ownedAttribute xmi:id="FlatQVT.Variable.initExpression" name="initExpression"
+ isOrdered="true" lower="0" type="FlatQVT.OclExpression" isComposite="true"
+ opposite="FlatQVT.OclExpression.initializedElement"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.letExp" name="letExp" isOrdered="true"
+ lower="0" type="FlatQVT.LetExp" opposite="FlatQVT.LetExp.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.representedParameter" name="representedParameter"
+ isOrdered="true" lower="0" type="FlatQVT.Parameter" opposite="FlatQVT.Parameter.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.catchExp" name="catchExp" isOrdered="true"
+ type="FlatQVT.CatchExp" opposite="FlatQVT.CatchExp.exceptionVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.matchingExp" name="matchingExp" isOrdered="true"
+ type="FlatQVT.CollectionTemplateExp" opposite="FlatQVT.CollectionTemplateExp.rest"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.computeOwner" name="computeOwner" isOrdered="true"
+ type="FlatQVT.ComputeExp" opposite="FlatQVT.ComputeExp.returnedElement"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.corePattern" name="corePattern" isOrdered="true"
+ type="FlatQVT.CorePattern" opposite="FlatQVT.CorePattern.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.selfOwner" name="selfOwner" isOrdered="true"
+ type="FlatQVT.ExpressionInOcl" opposite="FlatQVT.ExpressionInOcl.contextVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.varOwner" name="varOwner" isOrdered="true"
+ type="FlatQVT.ExpressionInOcl" opposite="FlatQVT.ExpressionInOcl.parameterVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.resultOwner" name="resultOwner" isOrdered="true"
+ type="FlatQVT.ExpressionInOcl" opposite="FlatQVT.ExpressionInOcl.resultVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.tgtOwner" name="tgtOwner" isOrdered="true"
+ type="FlatQVT.ImperativeIterateExp" opposite="FlatQVT.ImperativeIterateExp.target"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.instantiationExp" name="instantiationExp"
+ isOrdered="true" type="FlatQVT.InstantiationExp" opposite="FlatQVT.InstantiationExp.extent"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.baseExp" name="baseExp" isOrdered="true"
+ type="FlatQVT.IterateExp" opposite="FlatQVT.IterateExp.result"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.loopExp" name="loopExp" isOrdered="true"
+ type="FlatQVT.LoopExp" opposite="FlatQVT.LoopExp.iterator"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.variableOwner" name="variableOwner" isOrdered="true"
+ type="FlatQVT.Module" opposite="FlatQVT.Module.ownedVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.objectExpression" name="objectExpression"
+ isOrdered="true" type="FlatQVT.ObjectExp" opposite="FlatQVT.ObjectExp.referredObject"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.opBody" name="opBody" isOrdered="true"
+ type="FlatQVT.OperationBody" opposite="FlatQVT.OperationBody.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.pattern" name="pattern" isOrdered="true"
+ type="FlatQVT.Pattern" opposite="FlatQVT.Pattern.bindsTo"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.relation" name="relation" isOrdered="true"
+ type="FlatQVT.Relation" opposite="FlatQVT.Relation.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.relationDomain" name="relationDomain"
+ isOrdered="true" type="FlatQVT.RelationDomain" opposite="FlatQVT.RelationDomain.rootVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.domainAssignment" name="domainAssignment"
+ isOrdered="true" type="FlatQVT.RelationDomainAssignment" opposite="FlatQVT.RelationDomainAssignment.variable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.resolveExp" name="resolveExp" isOrdered="true"
+ type="FlatQVT.ResolveExp" opposite="FlatQVT.ResolveExp.target"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.templateExp" name="templateExp" isOrdered="true"
+ type="FlatQVT.TemplateExp" opposite="FlatQVT.TemplateExp.bindsTo"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.assignment" name="assignment" isOrdered="true"
+ type="FlatQVT.VariableAssignment" opposite="FlatQVT.VariableAssignment.targetVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.referringExp" name="referringExp" isOrdered="true"
+ type="FlatQVT.VariableExp" opposite="FlatQVT.VariableExp.referredVariable"/>
+ <ownedAttribute xmi:id="FlatQVT.Variable.declaration" name="declaration" isOrdered="true"
+ type="FlatQVT.VariableInitExp" opposite="FlatQVT.VariableInitExp.referredVariable"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.VariableAssignment" name="VariableAssignment"
+ superClass="FlatQVT.Assignment">
+ <ownedAttribute xmi:id="FlatQVT.VariableAssignment.targetVariable" name="targetVariable"
+ isOrdered="true" type="FlatQVT.Variable" opposite="FlatQVT.Variable.assignment"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.VariableExp" name="VariableExp"
+ superClass="FlatQVT.OclExpression">
+ <ownedAttribute xmi:id="FlatQVT.VariableExp.referredVariable" name="referredVariable"
+ isOrdered="true" lower="0" type="FlatQVT.Variable" opposite="FlatQVT.Variable.referringExp"/>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.VariableInitExp" name="VariableInitExp"
+ superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.VariableInitExp.referredVariable" name="referredVariable"
+ isOrdered="true" type="FlatQVT.Variable" isComposite="true" opposite="FlatQVT.Variable.declaration"/>
+ <ownedAttribute xmi:id="FlatQVT.VariableInitExp.withResult" name="withResult"
+ isOrdered="true" lower="0" default="false">
+ <type xmi:type="emof:PrimitiveType" href="http://schema.omg.org/spec/mof/2.0/emof.xmi#Boolean"/>
+ </ownedAttribute>
+ </ownedType>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.VoidType" name="VoidType" superClass="FlatQVT.Type"/>
+ <ownedType xmi:type="emof:Class" xmi:id="FlatQVT.WhileExp" name="WhileExp" superClass="FlatQVT.ImperativeExpression">
+ <ownedAttribute xmi:id="FlatQVT.WhileExp.body" name="body" isOrdered="true" type="FlatQVT.OclExpression"
+ isComposite="true" opposite="FlatQVT.OclExpression.whileOwner"/>
+ <ownedAttribute xmi:id="FlatQVT.WhileExp.condition" name="condition" isOrdered="true"
+ type="FlatQVT.OclExpression" isComposite="true" opposite="FlatQVT.OclExpression.whileExpression"/>
+ </ownedType>
+</emof:Package>
diff --git a/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatRelToCore.qvt b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatRelToCore.qvt
new file mode 100644
index 000000000..60212662c
--- /dev/null
+++ b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/FlatRelToCore.qvt
@@ -0,0 +1,2037 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2008 Tata Consultancy Services and others.
+-- All rights reserved. This program and the accompanying materials
+-- are made available under the terms of the Eclipse Public License v1.0
+-- which accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- Contributors:
+-- S.Reddy - Section 10.3 of the OMG MOF-QVT 1.0 specification
+-- E.D.Willink - contributions to drafts of the above
+-- E.D.Willink - adaptation to comply with QVT specification
+-- E.D.Willink - adaptation to be useable with ModelMorf
+--------------------------------------------------------------------------------
+transformation relToCore(relations:QVTMM; core:QVTMM)
+{
+
+key QVTMM::Mapping{name, _transformation};
+key QVTMM::GuardPattern{area};
+key QVTMM::BottomPattern{area};
+key QVTMM::Variable{name, type};
+key QVTMM::Type{name};
+key QVTMM::Class{name};
+key QVTMM::Property{name, class};
+key QVTMM::CoreDomain{name, rule};
+key QVTMM::TypedModel{name, usedPackage, _transformation};
+key QVTMM::Package{name};
+key QVTMM::Transformation{name};
+key QVTMM::Operation{name};
+key QVTMM::Predicate{pattern, conditionExpression};
+
+query getSharedDomainVars(r:QVTMM::Relation):Set(QVTMM::Variable)
+{
+ r._domain->iterate(d; vars: Set(QVTMM::Variable) = Set{} |
+ if (vars->isEmpty())
+ then
+ vars->union(d.oclAsType(QVTMM::RelationDomain).pattern.bindsTo)
+ else
+ vars->intersection(d.oclAsType(QVTMM::RelationDomain).pattern.bindsTo)
+ endif
+ )
+}
+
+query getWhenVars(r:QVTMM::Relation):Set(QVTMM::Variable)
+{
+ let
+ vs:Set(QVTMM::Variable) = Set{}
+ in
+ r._domain->iterate(d; vars: Set(QVTMM::Variable) = Set{} |
+ if (vars->isEmpty())
+ then
+ vars->union(d.oclAsType(QVTMM::RelationDomain).pattern.bindsTo)
+ else
+ vars->intersection(d.oclAsType(QVTMM::RelationDomain).pattern.bindsTo)
+ endif
+ )
+}
+
+-- Get variables occuring in an ocl expression
+-- Note: this function is not complete! It needs to be completed for other expressions
+query getVarsOfExp(e:QVTMM::OclExpression):Set(QVTMM::Variable)
+{
+ -- Walk the expr tree of the OclExpression and
+ -- collect the variables used in those expressions
+ let
+ vs:Set(QVTMM::Variable) = Set{}
+ in
+ if (e.oclIsTypeOf(QVTMM::VariableExp))
+ then
+ vs->including(e.oclAsType(QVTMM::VariableExp).referredVariable)
+ else
+ if (e.oclIsTypeOf(QVTMM::OperationCallExp))
+ then
+ let
+ oc:QVTMM::OperationCallExp = e.oclAsType(QVTMM::OperationCallExp)
+ in
+ vs->union(getVarsOfExp(oc.source))->union(
+ oc.argument->iterate(a; avs:Set(QVTMM::Variable)=Set{} | avs->union(getVarsOfExp(a)))
+ )
+ else
+ if (e.oclIsTypeOf(QVTMM::PropertyCallExp))
+ then
+ vs->union(getVarsOfExp(e.oclAsType(QVTMM::PropertyCallExp).source))
+ else
+ if (e.oclIsTypeOf(QVTMM::RelationCallExp))
+ then
+ let
+ rc:QVTMM::RelationCallExp = e.oclAsType(QVTMM::RelationCallExp)
+ in
+ vs->union(rc.argument->iterate(a; avs:Set(QVTMM::Variable)=Set{} |
+ avs->union(getVarsOfExp(a)))
+ )
+ else
+ vs
+ endif
+ endif
+ endif
+ endif
+}
+
+query filterOutPredicatesThatReferToVars(rpSet:Set(QVTMM::Predicate),
+ ownrdVars:Set(QVTMM::Variable)) :Set(QVTMM::Predicate)
+{
+ rpSet->iterate(p:QVTMM::Predicate; fpSet:Set(QVTMM::Predicate) = Set{}|
+ if (getVarsOfExp(p.conditionExpression)->intersection(ownrdVars)->isEmpty())
+ then
+ fpSet->including(p)
+ else
+ fpSet
+ endif
+ )
+}
+
+--Check if the given variable is bound to any template other than the one to be skipped
+query isVarBoundToSomeOtherTemplate(rootTe:QVTMM::ObjectTemplateExp,
+ skipTe:QVTMM::ObjectTemplateExp, v:QVTMM::Variable):Boolean
+{
+ if (rootTe = skipTe)
+ then
+ false
+ else
+ if (rootTe.bindsTo = v)
+ then
+ true
+ else
+ rootTe.part.value->select(pe | pe.oclIsKindOf(QVTMM::ObjectTemplateExp))->exists(pet |
+ isVarBoundToSomeOtherTemplate(pet.oclAsType(QVTMM::ObjectTemplateExp), skipTe, v))
+ endif
+
+ endif
+}
+
+top relation RelationalTransformationToMappingTransformation
+{
+ rtn, tmn:String;
+
+ domain relations rt:RelationalTransformation {
+ name = rtn,
+ modelParameter = rtm:TypedModel {
+ name = tmn,
+ usedPackage = up:Package{}
+ }
+ };
+
+ enforce domain core mt:Transformation {
+ name = rtn,
+ modelParameter = mtm:TypedModel {
+ name = tmn,
+ usedPackage = up
+ }
+ };
+}
+
+-- Rule 1: Corresponding to each relation there exists a trace class in core.
+-- The trace class contains a property corresponding to each object node in the
+-- pattern of each domain of the relation.
+--
+top relation RelationToTraceClass
+{
+ rn, vn:String;
+
+ domain relations r:Relation {
+ name = rn,
+ _domain = rd:RelationDomain {
+ pattern = rdp:DomainPattern {
+ templateExpression = t:ObjectTemplateExp {
+ bindsTo = tv:Variable {
+ name = vn,
+ type = c:Class {}
+ }
+ }
+ }
+ }
+ };
+ enforce domain core rc:Class {
+ name = 'T'+rn,
+ ownedAttribute = a:Property {
+ name = vn,
+ type = c
+ }
+ };
+ where {
+ SubTemplateToTraceClassProps(t, rc);
+ }
+}
+
+relation SubTemplateToTraceClassProps
+{
+ vn: String;
+
+ domain relations t:ObjectTemplateExp {
+ part = pt:PropertyTemplateItem {
+ value = tp:ObjectTemplateExp {
+ bindsTo = tv:Variable {
+ name = vn,
+ type = c:Class {}
+ }
+ }
+ }
+ };
+ enforce domain core rc:Class {
+ ownedAttribute = a:Property {
+ name=vn,
+ type=c
+ }
+ };
+ where {
+ SubTemplateToTraceClassProps(tp, rc);
+ }
+}
+
+-- For mapping to core we distinguish between two kinds of relations of a transformation:
+-- - top-level relations and invoked relations.
+-- Top-level relations are not invoked by any other relation in the transformation.
+-- There exists a single mapping (with perhaps contained mappings) for a top-level relation,
+-- whereas for an invoked relation there exists a separate mapping for each invoker-invoked
+-- combination.
+
+-- For mapping to core we also distinguish between check-only relations and enforceable
+-- relations. A check-only relation maps to a single core mapping, whereas an enforceable
+-- relation typically maps to a composite hierarchy of mappings in core.
+--
+
+-- Rule 2:
+-- The following are the common translation rules between
+-- a relation and a core mapping.
+-- 2.1: Variables of a RelationDomain that occur in the when clause become
+-- PatternVarables of the core domain guard.
+-- 2.2: All other Variables of a relationDomain become PatternVars
+-- of the core domain bottom pattern.
+-- 2.3: An instance variable corresponding to the trace class of the relation becomes part of
+-- the core mapping bottom pattern with its properties set(assigned or equated) to the
+-- corresponding core domain pattern variables.
+-- 2.4: A property template item in the relation domain pattern becomes an
+-- assignment (or equation in the case of check-only domains) in the core domain bottom pattern.
+-- 2.5: Predicates of the when clause become predicates of the core mapping guard.
+-- 2.6: Non relation invocation predicates of the where clause become predicates of the core
+-- mapping bottom.
+-- 2.6.1: relation invocation predicates of the where clause are ignored in this mapping, but
+-- are reflected in the mapping corresponding to the invoked relation.
+--
+
+-- All Object template expressions (at the top level of the DomainPattern)
+-- become assignments in the core domain bottom. Nested
+-- ObjectTemplateExpressions become assignments in composed mappings.
+--
+
+-- Rule 3 (extends Rule 2):
+-- 3.1: A relation is 'check-only' if it does not have any enforceable domains.
+-- 3.2: Only the trace class variable in the mapping bottom is 'realized'; there are no
+-- other 'realized' variables in any of the mapping areas.
+-- 3.3: A property template item in a relation domain becomes an equation in the core domain
+-- bottom.
+-- 3.4: A property template item in a relation domain that refers to a shared variable
+-- becomes an equation in the mapping bottom.
+-- 3.5: Shared variables referenced in property template items of relation domains become
+-- variables of the mapping bottom.
+--
+top relation TopLevelRelationToMappingForChecking
+{
+ allDomainVars: Set(QVTMM::Variable);
+ sharedDomainVars: Set(QVTMM::Variable);
+ unsharedWhereVars: Set(QVTMM::Variable);
+ whenVars: Set(QVTMM::Variable);
+ whereVars: Set(QVTMM::Variable);
+ rn: String;
+ mbVars:Set(QVTMM::Variable);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+
+ domain relations r:Relation {
+ _transformation = rt,
+ isTopLevel = true,
+ name = rn
+ } {
+ not r._domain->exists(d| d.isEnforceable = true)
+ };
+ enforce domain core m:Mapping {
+ _transformation = mt,
+ name = rn,
+ guardPattern = mg:GuardPattern {
+ area = m
+ },
+ bottomPattern = mb:BottomPattern {
+ bindsTo = vs:Set(Variable) {
+ tcv:RealizedVariable {} ++ mbVars
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ allDomainVars = r._domain->iterate(md; acc:Set(QVTMM::RelationDomain)=Set{} |
+ acc->including(md.oclAsType(QVTMM::RelationDomain))).pattern.bindsTo->asSet();
+ whenVars = r._when.bindsTo;
+ whereVars = r._where.bindsTo;
+
+ sharedDomainVars = getSharedDomainVars(r);
+ unsharedWhereVars =
+ (whereVars - whenVars - allDomainVars)->union(sharedDomainVars);
+
+ RelationToTraceClassVar(r, tcv);
+ RWhenPatternToMGuardPattern(r, mg);
+ if (unsharedWhereVars->isEmpty())
+ then
+ mbVars = Set{}
+ else
+ RVarSetToMVarSet(unsharedWhereVars->asSequence(), mbVars)
+ endif;
+ -- Only non relation invocation predicates are copied from where clause to mapping
+ -- bottom.
+ RWherePatternToMPattern(r, mb);
+ RDomainToMDomainForChecking(r, m);
+ }
+}
+
+relation RWherePatternToMPattern
+{
+ domain relations r:Relation{
+ _where = wherep:Pattern { }
+ };
+ enforce domain core mp:Pattern {};
+ where {
+ RSimplePatternToMPattern(wherep, mp);
+ }
+}
+
+relation UnsharedWhenVarsToMgVars
+{
+ domain relations unsharedWhenVars:Set(Variable) {_++_};
+ enforce domain core mg:GuardPattern {
+ bindsTo = mgVars:Set(Variable) {}
+ };
+ where {
+ RVarSetToMVarSet(unsharedWhenVars->asSequence(), mgVars);
+ }
+}
+
+relation DomainVarsSharedWithWhenToDgVars
+{
+ domain relations domainVarsSharedWithWhen:Set(Variable) {_++_};
+ enforce domain core dg:GuardPattern {
+ bindsTo = dgVars:Set(Variable) {}
+ };
+ where {
+ RVarSetToMVarSet(domainVarsSharedWithWhen->asSequence(), dgVars);
+ }
+}
+
+relation DomainBottomUnSharedVarsToDbVars
+{
+ domain relations domainBottomUnSharedVars:Set(Variable) {_++_};
+ enforce domain core db:BottomPattern {
+ bindsTo = dbVars:Set(Variable) {}
+ };
+ where {
+ RVarSetToMVarSet(domainBottomUnSharedVars->asSequence(), dbVars);
+ }
+}
+
+-- Rule 4 (extends Rule 2):
+-- 4.1: A separate mapping is generated for each enforced domain of the relation.
+-- 4.2: In this mapping only the enforced domain in question is marked as enforced in core;
+-- all its opposite domains are marked in core as checked at most (i.e. either left as
+-- they are or downgraded to checked if marked as enforced).
+-- 4.3: The enforced domain's pattern gets decomposed into nested mappings as follows:
+-- - root pattern object variable becomes a realized variable in the domain bottom
+-- pattern of the current mapping.
+-- - all identifying property template items become assignments in the domain bottom
+-- pattern of the current mapping.
+-- - all non identifying property template items of primitive type become assignments
+-- in the bottom pattern of a nested mapping.
+-- - each non identifying property template item of object type results in a nested
+-- mapping which will have:
+-- - a realized variable in the domain bottom, corresponding to the variable of the
+-- property value object.
+-- - a property assignment from parent object variable to this variable in the
+-- domain bottom.
+-- - and its own nested mappings as above recursively.
+-- 4.4: Predicates of the where clause that refer to variables of the enforced domain get
+-- distributed down to the nested mappings as variable bindings accumulate in the nested
+-- mappings.
+-- 4.5: all other opposite domains are mapped to their respective core domain parts as
+-- described in Rule 3, i.e. their patterns are not decomposed down into nested mappings.
+-- 4.6: A black-box operational implementation, if any, that the relation has for the
+-- enforced domain becomes a pair of enforcement operations (one for creation and one for
+-- deletion) in the domain-bottom pattern, both pointing to the same operation call
+-- expression that takes its arguments from the variables corresponding to the root objects
+-- of the domains of the relation.
+--
+top relation TopLevelRelationToMappingForEnforcement
+{
+ allDomainVars: Set(QVTMM::Variable);
+ oppositeDomainVars: Set(QVTMM::Variable);
+ sharedDomainVars: Set(QVTMM::Variable);
+ predicatesWithVarBindings: Set(QVTMM::Predicate);
+ predicatesWithoutVarBindings: Set(QVTMM::Predicate);
+ unsharedWhenVars: Set(QVTMM::Variable);
+ unsharedWhereVars: Set(QVTMM::Variable);
+ domainVarsSharedWithWhen: Set(QVTMM::Variable);
+ domainBottomUnSharedVars: Set(QVTMM::Variable);
+ rdSeq, rdtSeq, relImplSeq: Sequence(QVTMM::Element);
+ rdSet: Set(QVTMM::Element);
+ rdVarsSeq: Sequence(Set(QVTMM::Element));
+ rdtSet: Set(QVTMM::Element);
+ rdtVarsSeq: Sequence(Set(QVTMM::Element));
+ rn, dn, tmn: String;
+ rOppositeDomains:Set(QVTMM::RelationDomain);
+ oppDomainSeq:Sequence(QVTMM::Element);
+ whenVars: Set(QVTMM::Variable);
+ whereVars: Set(QVTMM::Variable);
+ mbVars: Set(QVTMM::Variable);
+ rpSet: Set(QVTMM::Predicate);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+
+ domain relations r:Relation {
+ _transformation = rt,
+ isTopLevel = true,
+ name = rn,
+ _domain = rds:Set(RelationDomain) {
+ rd:RelationDomain {
+ isEnforceable = true,
+ name = dn,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up:Package{},
+ _transformation = rt
+ },
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable) {},
+ templateExpression = te:ObjectTemplateExp {
+ bindsTo = tev:Variable {}
+ }
+ }
+ } ++ rOppositeDomains
+ }
+ };
+ enforce domain core m:Mapping {
+ _transformation = mt,
+ name = rn+'_'+dn,
+ guardPattern = mg:GuardPattern {
+ area = m
+ },
+ bottomPattern = mb:BottomPattern {
+ bindsTo = vs:Set(Variable) {
+ tcv:RealizedVariable {} ++ mbVars
+ }
+ },
+ _domain = md:CoreDomain {
+ name = dn,
+ isEnforceable = true,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ guardPattern = dg:GuardPattern {
+ area = md
+ },
+ bottomPattern = db:BottomPattern {
+ bindsTo = mtev:Variable {}
+ }
+ } --TODO: add var only if tev not in whenVars
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ allDomainVars = r._domain->iterate(md; acc:Set(QVTMM::RelationDomain)=Set{} |
+ acc->including(md.oclAsType(QVTMM::RelationDomain))).pattern.bindsTo->asSet();
+ whenVars = r._when.bindsTo;
+ whereVars = r._where.bindsTo;
+
+ -- Exclude where clause relation calls.
+ -- The predicate corresponding to a where clause relation call is included not in this
+ -- mapping but in the one corresponding to the invoked relation (refer to rule 2.6.1)
+ rpSet = r._where.predicate->reject(p |
+ p.conditionExpression.oclIsTypeOf(QVTMM::RelationCallExp));
+
+ oppositeDomainVars = rOppositeDomains->iterate(d; vars: Set(QVTMM::Variable) = Set{} |
+ vars->union(d.oclAsType(QVTMM::RelationDomain).pattern.bindsTo));
+ sharedDomainVars = getSharedDomainVars(r);
+ domainBottomUnSharedVars = domainVars - whenVars - sharedDomainVars;
+
+ unsharedWhereVars =
+ (whereVars - whenVars - allDomainVars)->union(sharedDomainVars);
+
+ predicatesWithVarBindings =
+ filterOutPredicatesThatReferToVars(rpSet, domainBottomUnSharedVars);
+ predicatesWithoutVarBindings = rpSet - predicatesWithVarBindings;
+ unsharedWhenVars = whenVars - allDomainVars;
+ domainVarsSharedWithWhen = domainVars->intersection(whenVars);
+ rdSeq = Sequence{r, rd};
+ rdSet = Set{r, rd};
+ rdVarsSeq = Sequence{rdSet, oppositeDomainVars};
+ rdtSet = Set{r, rd, te};
+ rdtVarsSeq = Sequence{rdtSet, predicatesWithoutVarBindings, domainBottomUnSharedVars};
+ oppDomainSeq = Sequence{r, rd};
+ relImplSeq = Sequence{r, rd};
+
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ RWhenPatternToMGuardPattern(r, mg);
+ DomainVarsSharedWithWhenToDgVars(domainVarsSharedWithWhen, dg);
+ RVarToMRealizedVar(tev, mtev);
+ if (unsharedWhereVars->isEmpty())
+ then
+ mbVars = Set{}
+ else
+ RVarSetToMVarSet(unsharedWhereVars->asSequence(), mbVars)
+ endif;
+ RPredicateSetToMBPredicateSet(predicatesWithVarBindings->asSequence(), mb);
+ RDomainToMDBottomForEnforcement(rdtVarsSeq, db);
+ ROppositeDomainVarsToTraceClassProps(rdVarsSeq, mb);
+ TROppositeDomainsToMappingForEnforcement(oppDomainSeq, m);
+ RRelImplToMBottomEnforcementOperation(relImplSeq, mb);
+ }
+}
+
+-- Rule 5 (extends Rule 3):
+-- 5.1: an invoked relation maps to as many core mappings as the relations that invoke it.
+-- i.e. there exists a separate core mapping for each invoker-invoked pair.
+-- 5.2: The guard pattern of the mapping will have a variable corresponding to the trace
+-- class of the invoker relation, with root object variables of all the patterns of all the
+-- domains of the invoked relation being equated with corresponding properties of this
+-- trace class .
+-- 5.3: The root object variable of a relation domain's pattern becomes a pattern variable
+-- in the core domain guard (this is in addition to the variables that occur in the when clause
+-- as per rule 2.1).
+--
+top relation InvokedRelationToMappingForChecking
+{
+ allDomainVars: Set(QVTMM::Variable);
+ sharedDomainVars: Set(QVTMM::Variable);
+ unsharedWhereVars: Set(QVTMM::Variable);
+ seqForInvoker: Sequence(QVTMM::Element);
+ rn, irn: String;
+ mbVars:Set(QVTMM::Variable);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+ whenVars: Set(QVTMM::Variable);
+ whereVars: Set(QVTMM::Variable);
+
+ domain relations r:Relation {
+ _transformation = rt,
+ isTopLevel = false,
+ name = rn,
+ relationCallExp = ri:RelationCallExp {
+ predicate = p:Predicate {
+ pattern = pt:Pattern {
+ whereOwner = ir:Relation {name = irn}
+ }
+ }
+ }
+ } {
+ not r._domain->exists(d| d.isEnforceable = true)
+ };
+ enforce domain core m:Mapping {
+ _transformation = mt,
+ name = rn+'_'+irn,
+ guardPattern = mg:GuardPattern {
+ area = m
+ },
+ bottomPattern = mb:BottomPattern {
+ bindsTo = vs:Set(Variable) {
+ tcv:RealizedVariable {} ++ mbVars
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ allDomainVars = r._domain->iterate(md; acc:Set(QVTMM::RelationDomain)=Set{} |
+ acc->including(md.oclAsType(QVTMM::RelationDomain))).pattern.bindsTo->asSet();
+ whenVars = r._when.bindsTo;
+ whereVars = r._where.bindsTo;
+ sharedDomainVars = getSharedDomainVars(r);
+ unsharedWhereVars =
+ (whereVars - whenVars - allDomainVars)->union(sharedDomainVars);
+ seqForInvoker = Sequence{ ir, ri, r};
+
+ RelationToTraceClassVar(r, tcv);
+ RWhenPatternToMGuardPattern(r, mg);
+ RInvokerToMGuard(seqForInvoker, mg);
+ if (unsharedWhereVars->isEmpty())
+ then
+ mbVars = Set{}
+ else
+ RVarSetToMVarSet(unsharedWhereVars->asSequence(), mbVars)
+ endif;
+ RWherePatternToMPattern(r, mb);
+ RDomainToMDomainForChecking(r, m);
+ }
+}
+
+-- Rule 6 (extends Rule 4):
+-- 6.1: an invoked relation maps to as many core mappings as the relations that invoke it.
+-- i.e. there exists a separate core mapping for each invoker-invoked pair.
+-- 6.2: The guard pattern of the mapping will have a variable corresponding to the trace
+-- class of the invoker relation, with root object variables of all the patterns of all the
+-- domains of the invoked relation being equated with corresponding properties of this
+-- trace class .
+-- 6.3: The root object variable of a relation domain's pattern becomes a pattern variable
+-- in the core domain guard (this is in addition to the variables that occur in the when clause
+-- as per rule 2.1).
+--
+top relation InvokedRelationToMappingForEnforcement
+{
+ allDomainVars: Set(QVTMM::Variable);
+ oppositeDomainVars: Set(QVTMM::Variable);
+ sharedDomainVars: Set(QVTMM::Variable);
+ predicatesWithVarBindings: Set(QVTMM::Predicate);
+ predicatesWithoutVarBindings: Set(QVTMM::Predicate);
+ unsharedWhenVars: Set(QVTMM::Variable);
+ unsharedWhereVars: Set(QVTMM::Variable);
+ domainTopVars: Set(QVTMM::Variable);
+ domainBottomUnSharedVars: Set(QVTMM::Variable);
+ rdSeq, relImplSeq: Sequence(QVTMM::Element);
+ rdSet: Set(QVTMM::Element);
+ rdVarsSeq: Sequence(Set(QVTMM::Element));
+ rdtSet: Set(QVTMM::Element);
+ rdtVarsSeq: Sequence(Set(QVTMM::Element));
+ seqForInvoker: Sequence(QVTMM::Element);
+ rn, irn, dn, tmn: String;
+ rOppositeDomains:Set(QVTMM::RelationDomain);
+ oppDomainSeq:Sequence(QVTMM::Element);
+ whenVars: Set(QVTMM::Variable);
+ whereVars: Set(QVTMM::Variable);
+ mbVars: Set(QVTMM::Variable);
+ rpSet: Set(QVTMM::Predicate);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+
+ domain relations r:Relation {
+ _transformation = rt,
+ isTopLevel = false,
+ name = rn,
+ relationCallExp = ri:RelationCallExp {
+ predicate = p:Predicate {
+ pattern = pt:Pattern {
+ whereOwner = ir:Relation {name = irn}
+ }
+ }
+ },
+ _domain = rds:Set(RelationDomain) {
+ rd:RelationDomain {
+ isEnforceable = true,
+ name = dn,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up:Package{},
+ _transformation = rt
+ },
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable) {},
+ templateExpression = te:ObjectTemplateExp {
+ bindsTo = tev:Variable {}
+ }
+ }
+ } ++ rOppositeDomains
+ }
+ };
+ enforce domain core m:Mapping {
+ _transformation = mt,
+ name = rn+'_'+irn+'_'+dn,
+ guardPattern = mg:GuardPattern {
+ area = m
+ },
+ bottomPattern = mb:BottomPattern {
+ bindsTo = vs:Set(Variable) {
+ tcv:RealizedVariable {} ++ mbVars
+ }
+ },
+ _domain = md:CoreDomain {
+ name = dn,
+ isEnforceable = true,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ guardPattern = dg:GuardPattern {
+ bindsTo = dgVars:Set(Variable) {}
+ },
+ bottomPattern = db:BottomPattern {
+ area = md
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ allDomainVars = r._domain->iterate(md; acc:Set(QVTMM::RelationDomain)=Set{} |
+ acc->including(md.oclAsType(QVTMM::RelationDomain))).pattern.bindsTo->asSet();
+ whenVars = r._when.bindsTo;
+ whereVars = r._where.bindsTo;
+
+ -- Exclude where clause relation calls.
+ -- The predicate corresponding to a where clause relation call is included not in this
+ -- mapping but in the one corresponding to the invoked relation (refer to rule 2.6.1)
+ rpSet = r._where.predicate->reject(p |
+ p.conditionExpression.oclIsTypeOf(QVTMM::RelationCallExp));
+
+ oppositeDomainVars = rOppositeDomains->iterate(d; vars: Set(QVTMM::Variable) = Set{} |
+ vars->union(d.pattern.bindsTo));
+ sharedDomainVars = getSharedDomainVars(r);
+ domainBottomUnSharedVars =
+ (domainVars - whenVars - sharedDomainVars)->excluding(tev);
+ unsharedWhereVars =
+ (whereVars - whenVars - allDomainVars)->union(sharedDomainVars);
+ predicatesWithVarBindings =
+ filterOutPredicatesThatReferToVars(rpSet, domainBottomUnSharedVars);
+ predicatesWithoutVarBindings = rpSet - predicatesWithVarBindings;
+ unsharedWhenVars = whenVars - allDomainVars;
+ domainTopVars = domainVars->intersection(whenVars)->including(tev);
+ rdSeq = Sequence{r, rd};
+ rdSet = Set{r, rd};
+ rdVarsSeq = Sequence{rdSet, oppositeDomainVars};
+ rdtSet = Set{r, rd, te};
+ rdtVarsSeq = Sequence{rdtSet, predicatesWithoutVarBindings, domainBottomUnSharedVars};
+ oppDomainSeq = Sequence{r, ir, rd};
+ seqForInvoker = Sequence{ir, ri, r};
+ relImplSeq = Sequence{r, rd};
+
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ if (unsharedWhereVars->isEmpty())
+ then
+ mbVars = Set{}
+ else
+ RVarSetToMVarSet(unsharedWhereVars->asSequence(), mbVars)
+ endif;
+ RPredicateSetToMBPredicateSet(predicatesWithVarBindings->asSequence(), mb);
+ RWhenPatternToMGuardPattern(r, mg);
+ RInvokerToMGuard(seqForInvoker, mg);
+ RVarSetToMVarSet(domainTopVars->asSequence(), dgVars);
+ RDomainToMDBottomForEnforcement(rdtVarsSeq, db);
+ ROppositeDomainVarsToTraceClassProps(rdVarsSeq, mb);
+ IROppositeDomainsToMappingForEnforcement(oppDomainSeq, m);
+ RRelImplToMBottomEnforcementOperation(relImplSeq, mb);
+ }
+}
+
+relation RDomainToMDomainForChecking
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ domainVarsSharedWithWhen: Set(QVTMM::Variable);
+ domainBottomUnSharedVars: Set(QVTMM::Variable);
+ seqForDomainPtrn: Sequence(QVTMM::Element);
+ whenVars: Set(QVTMM::Variable);
+ dn, tmn: String;
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+
+ domain relations r:Relation {
+ _domain = rd:RelationDomain {
+ name = dn,
+ isCheckable = true,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up:Package{},
+ _transformation = rt
+ },
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable){},
+ templateExpression = te:ObjectTemplateExp {}
+ }
+ }
+ };
+ enforce domain core m:Mapping {
+ bottomPattern = mb:BottomPattern {
+ area = m
+ },
+ _domain = md:CoreDomain {
+ name = dn,
+ isCheckable = true,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ guardPattern = dg:GuardPattern {
+ area = md
+ },
+ bottomPattern = db:BottomPattern {
+ area = md
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ whenVars = r._when.bindsTo;
+ sharedDomainVars = getSharedDomainVars(r);
+ domainVarsSharedWithWhen = domainVars->intersection(whenVars);
+ domainBottomUnSharedVars = domainVars - whenVars - sharedDomainVars;
+ seqForDomainPtrn = Sequence{r, te};
+
+ DomainVarsSharedWithWhenToDgVars(domainVarsSharedWithWhen, dg);
+ DomainBottomUnSharedVarsToDbVars(domainBottomUnSharedVars, db);
+ RDomainPatternToMDBottomPattern(seqForDomainPtrn, db);
+ RDomainVarsToTraceClassProps(rd, mb);
+ }
+}
+
+-- opposite domains of a top-level relation's enforced domain are mapped as per rules
+-- 4.2 and 4.5
+-- In addition, as per rule 6.3 the root object variable of a relation domain's pattern
+-- becomes a pattern variable in the core domain guard (this is in addition to the variables
+-- that occur in the when clause as per rule 2.1).
+--
+relation IROppositeDomainsToMappingForEnforcement
+{
+ sharedDomainVars:Set(QVTMM::Variable);
+ domainTopVars: Set(QVTMM::Variable);
+ domainBottomUnSharedVars: Set(QVTMM::Variable);
+ domainBottomSharedVars: Set(QVTMM::Variable);
+ seqForDomainPtrn: Sequence(QVTMM::Element);
+ dn, tmn: String;
+ c: Boolean;
+ mbVars:Set(QVTMM::Variable);
+ whenVars:Set(QVTMM::Variable);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+ up: QVTMM::Package;
+
+ domain relations oppDomainSeq:Sequence(Element) {
+ r:Relation {
+ _domain = rds:Set(RelationDomain) {
+ ord:RelationDomain { -- opposite domain
+ name = dn,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = rt
+ },
+ isCheckable = c,
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable) {},
+ templateExpression = te:ObjectTemplateExp {
+ bindsTo = tev:Variable {}
+ }
+ }
+ } ++ _
+ }
+ },
+ ir:Relation{},
+ rd:RelationDomain{}
+ ++ _
+ } {
+ ord <> rd
+ };
+ enforce domain core m:Mapping {
+ _domain = cd:CoreDomain {
+ name = dn,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ isCheckable = c,
+ isEnforceable = false,
+ guardPattern = dg:GuardPattern {
+ bindsTo = dgVars:Set(Variable) {}
+ },
+ bottomPattern = db:BottomPattern {
+ bindsTo = dbVars:Set(Variable) {}
+ }
+ },
+ bottomPattern = mb:BottomPattern {
+ area = m
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ whenVars = r._when.bindsTo;
+ domainTopVars = domainVars->intersection(whenVars)->including(tev);
+ sharedDomainVars = getSharedDomainVars(r);
+ domainBottomUnSharedVars = (domainVars - whenVars - sharedDomainVars)->excluding(tev);
+ domainBottomSharedVars =
+ (domainVars - whenVars)->intersection(sharedDomainVars)->excluding(tev);
+ seqForDomainPtrn = Sequence{r, te};
+
+ RVarSetToMVarSet(domainTopVars->asSequence(), dgVars);
+ RVarSetToMVarSet(domainBottomUnSharedVars->asSequence(), dbVars);
+ RVarSetToMBVarSet(domainBottomSharedVars->asSequence(), mb);
+ RDomainPatternToMDBottomPattern(seqForDomainPtrn, db);
+ }
+}
+
+-- opposite domains of an invoked relation's enforced domain are mapped as per rules
+-- 4.2 and 4.5
+--
+relation TROppositeDomainsToMappingForEnforcement
+{
+ sharedDomainVars:Set(QVTMM::Variable);
+ domainTopVars: Set(QVTMM::Variable);
+ domainBottomUnSharedVars: Set(QVTMM::Variable);
+ domainBottomSharedVars: Set(QVTMM::Variable);
+ seqForDomainPtrn: Sequence(QVTMM::Element);
+ dn, tmn: String;
+ c: Boolean;
+ mbVars:Set(QVTMM::Variable);
+ whenVars:Set(QVTMM::Variable);
+ rt: QVTMM::RelationalTransformation;
+ mt: QVTMM::Transformation;
+ up: QVTMM::Package;
+
+ domain relations oppDomainSeq:Sequence(Element) {
+ r:Relation {
+ _domain = rds:Set(RelationDomain) {
+ ord:RelationDomain {
+ name = dn,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = rt
+ },
+ isCheckable = c,
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable) {},
+ templateExpression = te:ObjectTemplateExp {}
+ }
+ } ++ _
+ }
+ },
+ rd:RelationDomain{}
+ ++ _
+ } {
+ ord <> rd
+ };
+ enforce domain core m:Mapping {
+ _domain = cd:CoreDomain {
+ name = dn,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ isCheckable = c,
+ isEnforceable = false,
+ guardPattern = dg:GuardPattern {
+ bindsTo = dgVars:Set(Variable) {},
+ area = cd
+ },
+ bottomPattern = db:BottomPattern {
+ bindsTo = dbVars:Set(Variable) {}
+ }
+ },
+ bottomPattern = mb:BottomPattern {
+ area = m
+ }
+ };
+ where {
+ whenVars = r._when.bindsTo;
+ domainTopVars = domainVars->intersection(whenVars);
+ sharedDomainVars = getSharedDomainVars(r);
+ domainBottomUnSharedVars = domainVars - whenVars - sharedDomainVars;
+ domainBottomSharedVars =
+ (domainVars - whenVars)->intersection(sharedDomainVars);
+ seqForDomainPtrn = Sequence{r, te};
+
+--## RelationalTransformationToMappingTransformation(rt, mt);
+ RVarSetToMVarSet(domainTopVars->asSequence(), dgVars);
+ RVarSetToMVarSet(domainBottomUnSharedVars->asSequence(), dbVars);
+ RVarSetToMBVarSet(domainBottomSharedVars->asSequence(), mb);
+ RDomainPatternToMDBottomPattern(seqForDomainPtrn, db);
+ }
+}
+
+relation RWhenPatternToMGuardPattern
+{
+ allDomainVars: Set(QVTMM::Variable);
+ unsharedWhenVars: Set(QVTMM::Variable);
+
+ domain relations r:Relation{
+ _when = whenp:Pattern {
+ bindsTo = whenVars:Set(Variable) {}
+ }
+ };
+ enforce domain core mg:GuardPattern {};
+ where {
+ allDomainVars = r._domain->iterate(md; acc:Set(QVTMM::RelationDomain)=Set{} |
+ acc->including(md.oclAsType(QVTMM::RelationDomain))).pattern.bindsTo->asSet();
+ unsharedWhenVars = whenVars - allDomainVars;
+
+ RWhenRelCallToMGuard(whenp, mg);
+ RSimplePatternToMPattern(whenp, mg);
+ UnsharedWhenVarsToMgVars(unsharedWhenVars, mg);
+ }
+}
+
+relation RVarSetToMVarSet
+{
+ rvRest: Sequence(QVTMM::Variable);
+ mvRest: Set(QVTMM::Variable);
+
+ domain relations rvSeq:Sequence(Variable) {rv:Variable {}++rvRest};
+ enforce domain core mvSet:Set(Variable) {mv:Variable {}++mvRest};
+ where {
+ RVarToMVar(rv, mv);
+ if (rvRest->isEmpty())
+ then
+ mvRest = Set{}
+ else
+ RVarSetToMVarSet(rvRest, mvRest)
+ endif;
+ }
+}
+
+relation RVarSetToMBVarSet
+{
+ rvRest: Sequence(QVTMM::Variable);
+ mvRest: Set(QVTMM::Variable);
+
+ domain relations rvSeq:Sequence(Variable) {rv:Variable {}++rvRest};
+ enforce domain core mb:BottomPattern {
+ bindsTo = mv:Variable {}
+ };
+ where {
+ RVarToMVar(rv, mv);
+ RVarSetToMBVarSet(rvRest, mb);
+ }
+}
+
+relation RVarSetToDGVarSet
+{
+ rvRest: Sequence(QVTMM::Variable);
+ mvRest: Set(QVTMM::Variable);
+
+ domain relations rvSeq:Sequence(Variable) {rv:Variable {}++rvRest};
+ enforce domain core dg:GuardPattern {
+ bindsTo = mv:Variable {}
+ };
+ where {
+ RVarToMVar(rv, mv);
+ RVarSetToDGVarSet(rvRest, dg);
+ }
+}
+
+relation RVarToMVar
+{
+ n: String;
+
+ domain relations rv:Variable {name=n, type=t:Type {}};
+ enforce domain core mv:Variable {name=n, type=t};
+}
+
+relation RVarToMRealizedVar
+{
+ n: String;
+
+ domain relations rv:Variable {name=n, type=t:Type {}};
+ enforce domain core mv:RealizedVariable {name=n, type=t};
+}
+
+relation RSimplePatternToMPattern
+{
+ domain relations rp:Pattern {
+ predicate = pd:Predicate {
+ conditionExpression = re:OclExpression {}
+ }
+ }
+ {
+ not re.oclIsTypeOf(RelationCallExp)
+ };
+ enforce domain core mp:Pattern {
+ predicate = mpd:Predicate{
+ conditionExpression = me:OclExpression {}
+ }
+ };
+ where {
+ RExpToMExp(re, me);
+ }
+}
+
+-- Relation invocation in when clause maps to a trace class pattern in mapping guard.
+-- Relation call argument position corresponds to the domain position in the invoked relation.
+-- Domain's root pattern object var gives us the corresponding trace class prop.
+--
+relation RWhenRelCallToMGuard
+{
+ domain relations rp:Pattern {
+ predicate = pd:Predicate {
+ conditionExpression = e:RelationCallExp {
+ referredRelation = r:Relation {
+ _domain = dseq:Sequence(RelationDomain) {}
+ },
+ argument = aseq:Sequence(VariableExp) {}
+ }
+ }
+ };
+ enforce domain core mp:GuardPattern {};
+
+ where {
+ aseq->forAll( a | RWhenRelCallArgToMGuardPredicate( Sequence{ r, a, dseq->at(aseq->indexOf(a)) }, mp) );
+ }
+}
+
+relation RWhenRelCallArgToMGuardPredicate
+{
+ tc: QVTMM::Class;
+ dvn: String;
+ mv:QVTMM::Variable;
+
+ domain relations daSeq:Sequence(Element) {
+ r:Relation{},
+ ve:VariableExp {
+ referredVariable = v:Variable {}
+ },
+ d:RelationDomain {
+ rootVariable = dv:Variable {name = dvn}
+ }
+ ++ _
+ };
+ enforce domain core mp:GuardPattern {
+ bindsTo = vd:Variable {
+ name = tc.name+'_v',
+ type = tc
+ },
+ predicate = mpd:Predicate {
+ conditionExpression = ee:OperationCallExp { -- vd.dvn = mv
+ source = pe:PropertyCallExp {
+ source = pve:VariableExp{referredVariable = vd},
+ referredProperty = pep:Property{name = dvn, class = vd.type.oclAsType(QVTMM::Class)}
+ },
+ referredOperation = eo:Operation{name = '='},
+ argument = ave:VariableExp{referredVariable = mv}
+ }
+ }
+ };
+ when {
+ RelationToTraceClass(r, tc);
+ }
+ where {
+ RVarToMVar(v, mv);
+ }
+}
+
+-- invocation argument position corresponds to the _domain position in invoked relation.
+-- Invocation argument variable name gives the invoker trace class prop name;
+-- Domain's root pattern object var gives us core _domain guard var
+--
+relation RInvokerToMGuard
+{
+ domain relations seqForInvoker:Sequence(Element) {
+ ir:Relation {}, -- invoking relation
+ ri:RelationCallExp {
+ argument = aseq:Sequence(VariableExp) {}
+ },
+ r:Relation { -- invoked relation
+ _domain = dseq:Sequence(RelationDomain) {}
+ }
+ ++ _
+ };
+ enforce domain core mg:GuardPattern {};
+ where {
+ aseq->forAll( a | RInvokerToMGuardPredicate( Sequence{ ir, a, dseq->at(aseq->indexOf(a)) }, mg) );
+ }
+}
+
+relation RInvokerToMGuardPredicate
+{
+ vn: String;
+ tc: QVTMM::Class;
+ mdv: QVTMM::Variable;
+
+ domain relations seqForInvoker:Sequence(Element) {
+ ir:Relation {}, -- invoking relation
+ ve:VariableExp {referredVariable = v:Variable {name=vn}},
+ d:RelationDomain { rootVariable = dv:Variable {} }
+ ++ _
+ };
+ enforce domain core mg:GuardPattern {
+ bindsTo = vd:Variable {
+ name = tc.name+'_v',
+ type = tc
+ },
+ predicate = pd:Predicate {
+ conditionExpression = ee:OperationCallExp { -- vd.vn = mdv
+ source = pe:PropertyCallExp {
+ source = mve:VariableExp{referredVariable = vd},
+ referredProperty = pep:Property{name = vn, class = vd.type.oclAsType(QVTMM::Class)}
+ },
+ referredOperation = eo:Operation{name = '='},
+ argument = ave:VariableExp{referredVariable = mdv}
+ }
+ }
+ };
+ when {
+ RelationToTraceClass(ir, tc);
+ }
+ where {
+ RVarToMVar(dv, mdv);
+ }
+}
+
+relation RDomainPatternToMDBottomPattern
+{
+ domain relations seqForDomainPtrn:Sequence(Element) {};
+ enforce domain core db:BottomPattern {
+ area = cd:CoreDomain{
+ rule = m:Mapping {
+ bottomPattern = mb:BottomPattern{area = m}
+ }
+ }
+ }; -- domain bottom
+ where {
+ RDomainPatternToMDBottomPatternComposite(seqForDomainPtrn, db);
+ RDomainPatternToMDBottomPatternSimpleNonVarExpr(seqForDomainPtrn, db);
+ RDomainPatternToMDBottomPatternSimpleUnSharedVarExpr(seqForDomainPtrn, db);
+ RDomainPatternToMDBottomPatternSimpleSharedVarExpr(seqForDomainPtrn, mb);
+ }
+}
+
+relation RDomainToMDBottomForEnforcement
+{
+ remainingUnBoundDomainVars: Set(QVTMM::Variable);
+ predicatesWithVarBindings:Set(QVTMM::Predicate);
+ remainingPredicatesWithoutVarBindings:Set(QVTMM::Predicate);
+ rdSeq, rtSeq, rtdSeq: Sequence(QVTMM::Element);
+ rdtVarsSeqRest: Sequence(Set(QVTMM::Element));
+ predicatesWithoutVarBindings:Set(QVTMM::Predicate);
+ unboundDomainVars:Set(QVTMM::Variable);
+ tcv, mv: QVTMM::Variable;
+
+ domain relations rdtVarsSeq:Sequence(Set(Element)) {
+ rdtSet:Set(Element) {
+ r:Relation{},
+ rd:RelationDomain{},
+ te:ObjectTemplateExp {bindsTo = v:Variable {}}
+ ++ _
+ }
+ ++ _
+ };
+ enforce domain core db:BottomPattern { -- domain bottom
+ area = cd:CoreDomain {
+ rule = m:Mapping {
+ bottomPattern = mb:BottomPattern {
+ area = m
+ }
+ }
+ }
+ };
+ where {
+ --## rdtVarsSeq->at(2) = predicatesWithoutVarBindings;
+ --## rdtVarsSeq->at(3) = unboundDomainVars;
+
+ -- remainingUnBoundDomainVars = unboundDomainVars - Set{v};
+ -- predicatesWithVarBindings = filterOutPredicatesThatReferToVars(
+ -- predicatesWithoutVarBindings, remainingUnBoundDomainVars);
+
+ -- remainingPredicatesWithoutVarBindings =
+ -- predicatesWithoutVarBindings - predicatesWithVarBindings;
+ -- rtSeq = Sequence{r, te};
+ -- rtdSeq = Sequence{r, te, rd};
+ -- rdtVarsSeqRest = Sequence{rdtSet, remainingPredicatesWithoutVarBindings, remainingUnBoundDomainVars};
+
+ -- RDomainToMDBottomForEnforcementOfIdentityProp(rtSeq, db);
+ -- RDomainVarToMDBottomAssignmnetForEnforcement(rdtVarsSeq, mb);
+ --RDomainToMDBottomForEnforcementOfIdentityPropObject(rdtSeq, mb);
+ -- RDomainToMDBottomForEnforcementOfNonIdentityPropPrimitive(rtdSeq, m);
+ -- RDomainToMDBottomForEnforcementOfNonIdentityPropObject(rdtVarsSeqRest, m);
+ -- RDomainToMBottomPredicateForEnforcement(rdtVarsSeq, mb);
+ }
+}
+
+relation RDomainVarToMDBottomAssignmnetForEnforcement
+{
+ rdSeq : Sequence(QVTMM::Element);
+ tcv, mv: QVTMM::Variable;
+
+ domain relations rdtVarsSeq:Sequence(Set(Element)) {
+ rdtSet:Set(Element) {
+ r:Relation{},
+ rd:RelationDomain{},
+ te:ObjectTemplateExp {bindsTo = v:Variable {}}
+ ++ _
+ }
+ ++ _
+ };
+ enforce domain core mb:BottomPattern { -- domain bottom
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = tcv},
+ targetProperty = tp:Property{name = v.name, class = tcv.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mv}
+ }
+ };
+ where {
+ rdSeq = Sequence{r, rd};
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ RVarToMVar(v, mv);
+ }
+}
+
+relation RDomainToMBottomPredicateForEnforcement
+{
+ remainingUnBoundDomainVars: Set(QVTMM::Variable);
+ predicatesWithVarBindings:Set(QVTMM::Predicate);
+ rdSeq: Sequence(QVTMM::Element);
+ predicatesWithoutVarBindings:Set(QVTMM::Predicate);
+ unboundDomainVars:Set(QVTMM::Variable);
+ tcv, mv: QVTMM::Variable;
+
+ domain relations rdtVarsSeq:Sequence(Set(Element)) {
+ rdtSet:Set(Element) {
+ r:Relation{},
+ rd:RelationDomain{},
+ te:ObjectTemplateExp {bindsTo = v:Variable {}}
+ ++ _
+ }
+ ++ _
+ };
+ enforce domain core mb:BottomPattern {
+ predicate = pd:Predicate {
+ conditionExpression = ee:OperationCallExp { -- tcv.(v.name) = mv
+ source = pe:PropertyCallExp {
+ --source = tcv,
+ source = pve:VariableExp{referredVariable = tcv},
+ referredProperty = pep:Property{
+ name = v.name,
+ class = tcv.type.oclAsType(QVTMM::Class)
+ }
+ },
+ referredOperation = eo:Operation{name = '='},
+ argument = ave:VariableExp{referredVariable = mv}
+ }
+ }
+ };
+ where {
+ rdSeq = let s : Sequence(QVTMM::Element) = Sequence{} in s->append(r)->append(rd);
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ RVarToMVar(v, mv);
+
+--## rdtVarsSeq->at(2) = predicatesWithoutVarBindings;
+--## rdtVarsSeq->at(3) = unboundDomainVars;
+
+-- remainingUnBoundDomainVars = unboundDomainVars - Set{v};
+-- predicatesWithVarBindings = filterOutPredicatesThatReferToVars(
+-- predicatesWithoutVarBindings, remainingUnBoundDomainVars);
+
+-- RPredicateSetToMBPredicateSet(predicatesWithVarBindings->asSequence(), mb);
+ }
+}
+
+relation RPredicateSetToMBPredicateSet
+{
+ rpRest: Sequence(QVTMM::Predicate);
+
+ domain relations predSeq:Sequence(Predicate) {
+ rp:Predicate {
+ conditionExpression = re:OclExpression {}
+ }
+ ++ rpRest
+ };
+ enforce domain core mb:BottomPattern {
+ predicate = mp:Predicate {
+ conditionExpression = me:OclExpression {}
+ }
+ };
+ where {
+ RExpToMExp(re, me);
+ RPredicateSetToMBPredicateSet(rpRest, mb);
+ }
+}
+
+relation RDomainToMDBottomForEnforcementOfIdentityProp
+{
+ seqForAssignment: Sequence(QVTMM::Element);
+
+ domain relations rtSeq:Sequence(Element) {
+ r:Relation{},
+ te:ObjectTemplateExp {
+ bindsTo = v:Variable {type=c:Class {}},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {},
+ value = e:OclExpression {}
+ }
+ } {
+ c._key.part->includes(pp)
+ }
+ ++ _
+ };
+ enforce domain core db:BottomPattern {
+ area = cd:CoreDomain {
+ rule = m:Mapping {
+ bottomPattern = mb:BottomPattern{
+ area = m
+ }
+ }
+ }
+ }; -- domain bottom
+ where {
+ seqForAssignment = Sequence{r, v, pp, e};
+ RDomainPatternExprToMappingDomainAssignment(seqForAssignment, db);
+ RDomainPatternExprToMappingDomainVarAssignment(seqForAssignment, db);
+ RDomainPatternExprToMappingDomainTemplateVarAssignment(seqForAssignment, db);
+ RDomainPatternExprToMappingBottomVarAssignment(seqForAssignment, mb);
+ }
+}
+
+relation RDomainToMDBottomForEnforcementOfIdentityPropObject
+{
+ seqForAssignment: Sequence(QVTMM::Element);
+ mtv, tcv : QVTMM::Variable;
+ rdSeq : Sequence(QVTMM::Element);
+
+ domain relations rtSeq:Sequence(Element) {
+ r:Relation{},
+ rd:RelationDomain{},
+ te:ObjectTemplateExp {
+ bindsTo = v:Variable {type=c:Class {}},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {},
+ value = e:ObjectTemplateExp {bindsTo = tv:Variable{}}
+ }
+ } {
+ c._key.part->includes(pp)
+ }
+ ++ _
+ };
+ enforce domain core mb:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = tcv},
+ targetProperty = tp:Property{name = tv.name, class = tcv.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mtv}
+ }
+ }; -- domain bottom
+ where {
+ rdSeq = Sequence{r, rd};
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ RVarToMVar(tv, mtv);
+ }
+}
+
+relation RDomainPatternExprToMappingDomainAssignment
+{
+ pn: String;
+ mv: QVTMM::Variable;
+
+ domain relations seqForAssignment: Sequence(Element) {
+ _,
+ v:Variable {},
+ pp:Property {name = pn},
+ e:OclExpression {} {
+ not e.oclIsTypeOf(VariableExp) and not e.oclIsTypeOf(ObjectTemplateExp)
+ } ++ _
+ };
+ enforce domain core db:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = me:OclExpression{}
+ }
+ };
+ where {
+ RVarToMVar(v, mv);
+ RExpToMExp(e, me);
+ }
+}
+
+relation RDomainPatternExprToMappingDomainVarAssignment
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ rev, mev : QVTMM::Variable;
+ pn: String;
+
+ domain relations seqForAssignment: Sequence(Element) {
+ r:Relation {},
+ v:Variable {},
+ pp:Property {name = pn},
+ e:VariableExp {referredVariable = rev}
+ ++ _
+ } {
+ not sharedDomainVars->includes(e.referredVariable)
+ };
+ enforce domain core db:BottomPattern {
+ realizedVariable = mv:RealizedVariable {},
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = me:VariableExp{referredVariable = mev}
+ }
+ };
+ when {
+ sharedDomainVars = getSharedDomainVars(r);
+ }
+ where {
+ RVarToMRealizedVar(v, mv);
+ RVarToMVar(rev, mev);
+ }
+}
+
+relation RDomainPatternExprToMappingDomainTemplateVarAssignment
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ rev, mev: QVTMM::Variable;
+ pn: String;
+
+ domain relations seqForAssignment: Sequence(Element) {
+ r:Relation {},
+ v:Variable {},
+ pp:Property {name = pn},
+ e:ObjectTemplateExp {bindsTo = rev}
+ ++ _
+ } {
+ not sharedDomainVars->includes(rev)
+ };
+ enforce domain core db:BottomPattern {
+ realizedVariable = mv:RealizedVariable {},
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = me:VariableExp{referredVariable = mev}
+ }
+ };
+ when {
+ sharedDomainVars = getSharedDomainVars(r);
+ }
+ where {
+ RVarToMRealizedVar(v, mv);
+ RVarToMVar(rev, mev);
+ }
+}
+
+relation RDomainPatternExprToMappingBottomVarAssignment
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ rev, mev : QVTMM::Variable;
+ pn: String;
+
+ domain relations seqForAssignment: Sequence(Element) {
+ r:Relation {},
+ v:Variable {},
+ pp:Property {name = pn},
+ e:VariableExp {referredVariable = rev}
+ ++ _
+ } {
+ sharedDomainVars->includes(e.referredVariable)
+ };
+ enforce domain core mb:BottomPattern {
+ realizedVariable = mv:RealizedVariable {},
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = me:VariableExp{referredVariable = mev}
+ }
+ };
+ when {
+ sharedDomainVars = getSharedDomainVars(r);
+ }
+ where {
+ RVarToMRealizedVar(v, mv);
+ RVarToMVar(rev, mev);
+ }
+}
+
+relation RDomainToMDBottomForEnforcementOfNonIdentityPropPrimitive
+{
+ pn: String;
+ mv: QVTMM::Variable;
+ rtdeSeq: Sequence(QVTMM::Element);
+
+ domain relations rtdSeq:Sequence(Element) {
+ r:Relation{
+ _transformation = rt:RelationalTransformation{}
+ },
+ te:ObjectTemplateExp {
+ bindsTo = v:Variable {type = c:Class {}},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = e:OclExpression {}
+ }
+ } {
+ (not c._key.part->includes(pp)) and (not e.oclIsKindOf(TemplateExp))
+ },
+ rd:RelationDomain {
+ pattern = rdp:DomainPattern {
+ templateExpression = rdt:ObjectTemplateExp {}
+ }
+ }
+ ++ _
+ };
+ enforce domain core m:Mapping {
+ local = cm:Mapping {
+ name = m.name+'_forNonIdentityProp',
+ _transformation = mt:Transformation{},
+ bottomPattern = bp:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = me:OclExpression{}
+ }
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ RVarToMVar(v, mv);
+ RExpToMExp(e, me);
+
+ rtdeSeq = Sequence{r, te, rd, e};
+
+--## RDomainToMComposedMappingGuard(rtdeSeq, cm);
+ }
+}
+
+--relation RDomainToMComposedMappingGuard
+--{
+-- pn, dn, tmn: String;
+-- tcv, mv: QVTMM::Variable;
+-- rdSeq: Sequence(QVTMM::Element);
+-- mt: QVTMM::Transformation;
+--
+-- domain relations rtdSeq:Sequence(Element) {
+-- r:Relation{
+-- _transformation = rt:RelationalTransformation{}
+-- },
+-- te:ObjectTemplateExp {},
+-- rd:RelationDomain {
+-- name = dn,
+-- typedModel = dir:TypedModel {
+-- name = tmn,
+-- usedPackage = up:Package{},
+-- _transformation = rt
+-- },
+-- pattern = rdp:DomainPattern {
+-- templateExpression = rdt:ObjectTemplateExp {}
+-- }
+-- },
+-- ve:VariableExp {referredVariable = v:Variable {}}
+-- ++ _
+-- } {
+-- isVarBoundToSomeOtherTemplate(rdt, te, v)
+-- };
+-- enforce domain core cm:Mapping {
+-- guardPattern = mg:GuardPattern {
+-- predicate = pd:Predicate {
+-- conditionExpression = ee:OperationCallExp { -- vd.vn = mdv
+-- source = pe:PropertyCallExp {
+-- source = ve1:VariableExp{referredVariable = tcv},
+-- referredProperty = tp:Property {
+-- name = mv.name,
+-- class = mv.type.oclAsType(QVTMM::Class)
+-- }
+-- },
+-- referredOperation = eo:Operation{name = '='},
+-- argument = ve2:VariableExp{referredVariable = mv}
+-- }
+-- }
+-- },
+-- _domain = cd:CoreDomain {
+-- name = dn,
+-- typedModel = mdir:TypedModel {
+-- name = tmn,
+-- usedPackage = up,
+-- _transformation = mt
+-- },
+-- guardPattern = cmdg:GuardPattern {
+-- bindsTo = mv
+-- }
+-- }
+-- };
+-- when {
+-- RelationalTransformationToMappingTransformation(rt, mt);
+-- }
+-- where {
+-- rdSeq = Sequence{r, rd};
+-- RelationDomainToTraceClassVar(rdSeq, tcv);
+-- RVarToMVar(v, mv);
+-- }
+--}
+
+relation RDomainToMDBottomForEnforcementOfNonIdentityPropObject
+{
+ rdtSetNext: Set(QVTMM::Element);
+ rdtVarsSeqRest: Sequence(Set(QVTMM::Element));
+ predicatesWithoutVarBindings:Set(QVTMM::Predicate);
+ unboundDomainVars:Set(QVTMM::Variable);
+ dn, pn, tmn: String;
+ mv: QVTMM::Variable;
+
+ domain relations rdtVarsSeq:Sequence(Set(Element)) {
+ rdtSet:Set(Element) {
+ r:Relation{
+ _transformation = rt:RelationalTransformation{}
+ },
+ rd:RelationDomain {
+ name = dn,
+ typedModel = dir:TypedModel {
+ name = tmn,
+ usedPackage = up:Package{},
+ _transformation = rt
+ }
+ },
+ te:ObjectTemplateExp {
+ bindsTo = v:Variable {type = c:Class {}},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = pte:ObjectTemplateExp {bindsTo = pv:Variable {}}
+ }
+ } {
+ not c._key.part->includes(pp)
+ }
+ ++ _
+ }
+ ++ _
+ };
+ enforce domain core m:Mapping {
+ local = cm:Mapping {
+ name = m.name+'_for_'+pv.name,
+ _transformation = mt:Transformation{},
+ _domain = cd:CoreDomain {
+ name = dn,
+ isEnforceable = true,
+ typedModel = mdir:TypedModel {
+ name = tmn,
+ usedPackage = up,
+ _transformation = mt
+ },
+ bottomPattern = cmdb:BottomPattern {
+ realizedVariable = mpv:RealizedVariable {},
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = mv},
+ targetProperty = tp:Property{name = pn, class = mv.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mpv}
+ }
+ }
+ },
+ bottomPattern = mb:BottomPattern {
+ area = cm
+ }
+ }
+ };
+ when {
+ RelationalTransformationToMappingTransformation(rt, mt);
+ }
+ where {
+ RVarToMVar(v, mv);
+ RVarToMRealizedVar(pv, mpv);
+
+--## rdtVarsSeq->at(2) = predicatesWithoutVarBindings;
+--## rdtVarsSeq->at(3) = unboundDomainVars;
+
+-- rdtSetNext = Set{r, rd, pte};
+-- rdtVarsSeqRest = Sequence{rdtSetNext, predicatesWithoutVarBindings, unboundDomainVars};
+-- RDomainToMDBottomForEnforcement(rdtVarsSeqRest, cmdb);
+ }
+}
+
+relation RDomainPatternToMDBottomPatternComposite
+{
+ nextSeqForDomainPtrn: Sequence(QVTMM::Element);
+ sharedDomainVars:Set(QVTMM::Variable);
+ pn: String;
+ mvte, mvpte: QVTMM::Variable;
+
+ domain relations seqForDomainPtrn:Sequence(Element) {
+ r:Relation{},
+ te:ObjectTemplateExp {
+ bindsTo = vte:Variable {},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = pte:ObjectTemplateExp {bindsTo = vpte:Variable {}}
+ }
+ }
+ ++ _
+ };
+ enforce domain core db:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = mvte},
+ targetProperty = tp:Property{name = pn, class = mvte.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mvpte}
+ }
+ };
+ where {
+ RVarToMVar(vte, mvte);
+ RVarToMVar(vpte, mvpte);
+ nextSeqForDomainPtrn = Sequence{r, pte};
+ RDomainPatternToMDBottomPattern(nextSeqForDomainPtrn, db);
+ }
+}
+
+relation RDomainPatternToMDBottomPatternSimpleUnSharedVarExpr
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ pn: String;
+ mvte, mvpte: QVTMM::Variable;
+
+ domain relations seqForDomainPtrn:Sequence(Element) {
+ r:Relation{},
+ te:ObjectTemplateExp {
+ bindsTo = vte:Variable {},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = e:VariableExp {referredVariable = vpte:Variable {}}
+ }
+ }
+ ++ _
+ } {
+ not sharedDomainVars->includes(vpte)
+ };
+ enforce domain core db:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = mvte},
+ targetProperty = tp:Property{name = pn, class = mvte.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mvpte}
+ }
+ };
+ when {
+ sharedDomainVars = getSharedDomainVars(r);
+ }
+ where {
+ RVarToMVar(vte, mvte);
+ RVarToMVar(vpte, mvpte);
+ }
+}
+
+relation RDomainPatternToMDBottomPatternSimpleSharedVarExpr
+{
+ sharedDomainVars: Set(QVTMM::Variable);
+ pn: String;
+ mvte, mvpte: QVTMM::Variable;
+
+ domain relations seqForDomainPtrn:Sequence(Element) {
+ r:Relation{},
+ te:ObjectTemplateExp {
+ bindsTo = vte:Variable {},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = e:VariableExp {referredVariable=vpte:Variable {}}
+ }
+ }
+ ++ _
+ } {
+ sharedDomainVars->includes(vpte)
+ };
+ enforce domain core mb:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = mvte},
+ targetProperty = tp:Property{name = pn, class = mvte.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mvpte}
+ }
+ };
+ when {
+ sharedDomainVars = getSharedDomainVars(r);
+ }
+ where {
+ RVarToMVar(vte, mvte);
+ RVarToMVar(vpte, mvpte);
+ }
+}
+
+relation RDomainPatternToMDBottomPatternSimpleNonVarExpr
+{
+ pn: String;
+ mvte: QVTMM::Variable;
+
+ domain relations seqForDomainPtrn:Sequence(Element) {
+ _,
+ te:ObjectTemplateExp {
+ bindsTo = vte:Variable {},
+ part = pt:PropertyTemplateItem {
+ referredProperty = pp:Property {name = pn},
+ value = e:OclExpression {}
+ }
+ } ++ _
+ } {
+ not e.oclIsKindOf(TemplateExp) and not e.oclIsTypeOf(VariableExp)
+ };
+ enforce domain core db:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve:VariableExp{referredVariable = mvte},
+ targetProperty = tp:Property{name = pn, class = mvte.type.oclAsType(QVTMM::Class)},
+ value = me:OclExpression{}
+ }
+ };
+ where {
+ RVarToMVar(vte, mvte);
+ RExpToMExp(e, me);
+ }
+}
+
+relation RDomainVarsToTraceClassProps
+{
+ tcv, mdv: QVTMM::Variable;
+
+ domain relations rd:RelationDomain {
+ rule = r:Relation{},
+ pattern = dp:DomainPattern {
+ bindsTo = domainVars:Set(Variable) {dv:Variable {templateExp = te: TemplateExp{}}++_}
+ }
+ };
+ enforce domain core mb:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = tcv},
+ targetProperty = tp:Property{name = dv.name, class = tcv.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mdv}
+ }
+ };
+ where {
+ RelationToTraceClassVar(r, tcv);
+ RVarToMVar(dv, mdv);
+ }
+}
+
+relation ROppositeDomainVarsToTraceClassProps
+{
+ rdSeq: Sequence(QVTMM::Element);
+ tcv, mdv: QVTMM::Variable;
+
+ domain relations rdVarsSeq:Sequence(Set(Element)) {
+ rdSet: Set(Element) {
+ r:Relation {},
+ rd:RelationDomain {} ++ _
+ },
+ domainVars:Set(Variable) {dv:Variable{templateExp = te:TemplateExp{}} ++ _}
+ ++ _
+ };
+ enforce domain core mb:BottomPattern {
+ assignment = a:PropertyAssignment {
+ slotExpression = ve1:VariableExp{referredVariable = tcv},
+ targetProperty = tp:Property{name = dv.name, class = tcv.type.oclAsType(QVTMM::Class)},
+ value = ve2:VariableExp{referredVariable = mdv}
+ }
+ };
+ where {
+ rdSeq = let s : Sequence(QVTMM::Element) = Sequence{} in s->append(r)->append(rd);
+ RelationDomainToTraceClassVar(rdSeq, tcv);
+ RVarToMVar(dv, mdv);
+ }
+}
+
+relation RRelImplToMBottomEnforcementOperation
+{
+ emptySet:Set(QVTMM::EnforcementOperation);
+
+ domain relations repImplSeq:Sequence(Element) {
+ r:Relation {
+ operationalImpl = ri:RelationImplementation {
+ inDirectionOf = tm:TypedModel{},
+ impl = op:Operation{}
+ }
+ },
+ rd:RelationDomain {typedModel = tm:TypedModel{}}
+ ++ _
+ };
+ enforce domain core mb:BottomPattern {
+ enforcementOperation = eoSet:Set(EnforcementOperation) {
+ eoc:EnforcementOperation {
+ enforcementMode = 'Creation',
+ operationCallExp = oce:OperationCallExp {
+ referredOperation = op
+ }
+ },
+ eod:EnforcementOperation {
+ enforcementMode = 'Deletion',
+ operationCallExp = oce
+ }
+ ++ emptySet
+ }
+ }
+ default_values
+ {
+ emptySet = Set{};
+ };
+ where {
+ RRelDomainsToMOpCallArg(r, oce);
+ }
+}
+
+relation RRelDomainsToMOpCallArg
+{
+ domain relations r:Relation {
+ _domain = rd:RelationDomain {
+ pattern = p:DomainPattern{bindsTo = rv:Variable{}}
+ }
+ };
+ enforce domain core oce:OperationCallExp {
+ argument = ar:VariableExp {
+ referredVariable = mv:Variable {}
+ }
+ };
+ where {
+ RVarToMVar(rv, mv);
+ }
+}
+
+relation RelationToTraceClassVar
+{
+ rn: String;
+ tc: QVTMM::Class;
+
+ domain relations r:Relation {name = rn};
+ enforce domain core tcv:RealizedVariable {
+ name = rn+'_v',
+ type = tc
+ };
+ when {
+ RelationToTraceClass(r, tc);
+ }
+}
+
+relation RelationDomainToTraceClassVar
+{
+ rn, dn: String;
+ tc: QVTMM::Class;
+
+ domain relations rdSeq:Sequence(Element) {
+ r:Relation {name = rn},
+ d:RelationDomain{name = dn}
+ ++ _
+ };
+ enforce domain core tcv:RealizedVariable {
+ name = rn+'_'+dn+'_v',
+ type = tc
+ };
+ when {
+ RelationToTraceClass(r, tc);
+ }
+}
+
+-- copy an ocl expression
+-- For space reasons this relation is not expanded out here
+relation RExpToMExp
+{
+ domain relations re:OclExpression{};
+ enforce domain core me:OclExpression{} /*implementedby CopyOclExpession(re, me)*/;
+}
+
+} \ No newline at end of file
diff --git a/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/run.bat b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/run.bat
new file mode 100644
index 000000000..7a7643789
--- /dev/null
+++ b/examples/org.eclipse.qvtd.examples.qvtrelation.modelmorf/qvtrsrc/RelToCore/run.bat
@@ -0,0 +1,3 @@
+del CoreUM.xml /Q
+CALL C:\Tools\ModelMorf\pre-beta-4\modelmorf.bat -m QVTMM -mf FlatQVT.xml -c FlatRelToCore.qvt -u relations -f RelUM.xml -u core -f CoreUM.xml -t relToCore -d core -q enforce
+pause \ No newline at end of file

Back to the top