private EMOF.IPackage ConstructPackage(EnAr.Package metamodelPackage) { if (elementToPackage.ContainsKey(metamodelPackage)) { return(elementToPackage[metamodelPackage]); } else { // We create the Package EMOF.IPackage package = new EMOF.Package() { Name = metamodelPackage.Name }; elementToPackage.Add(metamodelPackage, package); // We create its owned Types foreach (EnAr.Element classChild in explorer.GetChildrenElementsWithType(metamodelPackage, "class")) { EMOF.IType type = ConstructType(classChild); package.OwnedType.Add(type); type.Package = package; } // We create its nested Packages foreach (EnAr.Package metamodelChild in explorer.GetChildrenPackages(metamodelPackage)) { EMOF.IPackage nestedPackage = ConstructPackage(metamodelChild); package.NestedPackage.Add(nestedPackage); nestedPackage.NestingPackage = package; } return(package); } }
private QVTRelations.IRelationalTransformation ConstructRelationalTransformation(EnAr.Element transformationElement) { // We create a Transformation object QVTRelations.RelationalTransformation transformation = new QVTRelations.RelationalTransformation { Name = transformationElement.Name, }; // We first find the "Functions" class that contains the functions of the transformation EnAr.Element functionsClass = explorer.GetChildrenElementsWithType(transformationElement, "class").FirstOrDefault(e => e.Stereotype.IsNullOrEmpty()); if (functionsClass != null) { // For each method, we create a Function in the QVT transforamtion foreach (EnAr.Method method in functionsClass.Methods.OfType <EnAr.Method>()) { ConstructFunction(transformation, method); } } // We browse the children EA elements with the stereotype "qvtRelation" IList <EnAr.Element> relationsElements = explorer.GetChildrenElementsWithTypeAndStereotype(transformationElement, "class", "qvtRelation"); // First pass: we create the basic relations (to manage relation calls later) foreach (EnAr.Element relationElement in relationsElements) { ConstructBasicRelation(transformation, relationElement); } // Second pass, we finish the relations (with relation calls) foreach (EnAr.Element relationElement in relationsElements) { FinishRelation(transformation, relationElement); } // We look for the tag 'qvtKey' string qvtKeyString = explorer.GetTaggedValue(transformationElement, "qvtKey"); if (!string.IsNullOrWhiteSpace(qvtKeyString)) { ISet <EMOF.IClass> classes = FindAllClassesUsedInTransformation(transformation); IList <QvtKeyParserResult> parsed = QvtKeyParser.Parse(qvtKeyString); foreach (QvtKeyParserResult keyParserResult in parsed) { QVTRelations.IKey key = ConstructKey(classes, keyParserResult); QVTRelations.IKey existingKey = transformation.OwnedKey.FirstOrDefault(k => k.Identifies == key.Identifies); if (existingKey == null) { transformation.OwnedKey.Add(key); } else { MergeKeyInto(existingKey, key); } } } // We check if some relation-level keys should not be removed because subsumed by global keys foreach (QVTRelations.IRelation relationWithKeys in relationsWithKeys) { foreach (QVTRelations.IKey key in relationWithKeys.Keys().ToList()) { QVTRelations.IKey superKey = transformation.OwnedKey.FirstOrDefault(k => Subsumes(k, key)); if (superKey != null) { relationWithKeys.Keys().Remove(key); } } } //TODO QVT Query Functions owned by the transformation? return(transformation); }