Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }