public EnArImporterQVT(EnArExplorer explorer) { this.explorer = explorer; this.emofImporter = new EnArImporterEMOF(explorer); Tuple <List <EMOF.IPackage>, Dictionary <string, EMOF.IPackage> > res = this.emofImporter.ConstructMetamodels(); metamodels.AddRange(res.Item1); foreach (KeyValuePair <string, EMOF.IPackage> keyValuePair in res.Item2) { aliases[keyValuePair.Key] = keyValuePair.Value; } }
private QVTBase.ITypedModel ConstructTypedModel(QVTRelations.IRelationalTransformation relationTransformation, EnAr.Connector qvtTransformationLinkConnector) { // We determine the typedmodel based on the FQN given on the connector string modelNameTag = explorer.GetTaggedValue(qvtTransformationLinkConnector, "modelName"); string metaModelNameTag = explorer.GetTaggedValue(qvtTransformationLinkConnector, "metaModelName"); string typedModelName = ""; string metamodelFQNOrAlias = ""; EMOF.IPackage metamodelPackage = null; if (!modelNameTag.IsNullOrEmpty()) { if (modelNameTag.Contains(':')) { string[] split = modelNameTag.Split(':'); typedModelName = split[0]; metamodelFQNOrAlias = split[1]; } else if (metaModelNameTag != null) { typedModelName = modelNameTag; } } if (metamodelFQNOrAlias.IsNullOrEmpty() && metaModelNameTag != null) { // Case real link if (metaModelNameTag.StartsWith("{")) { EnAr.Package enArMetamodelPackage = explorer.GetPackageByGuid(metaModelNameTag); metamodelPackage = emofImporter.GetEMOFPackage(enArMetamodelPackage); } // Case string name else { metamodelFQNOrAlias = metaModelNameTag; } } if (metamodelPackage == null) { // The metamodel package can be found either using the FQN or one of its aliases metamodelPackage = metamodels.FirstOrDefault(metamodel => EnArImporterEMOF.GetFQN(metamodel) == metamodelFQNOrAlias || (aliases.ContainsKey(metamodelFQNOrAlias) && metamodel == aliases[metamodelFQNOrAlias])); } /*if (typedModelName.IsNullOrEmpty() && metamodelPackage == null) * { * throw new InvalidQVTRelationsModelException("A domain link must either indicate the model name with the pattern <model name>:<metamodel name>, or must provide a tag 'metaModelName'.", qvtTransformationLinkConnector); * }*/ // Case primitive domains... could probably be managed better if (metamodelPackage == null) { return(null); } // We first check that the relational transformation doesn't already have this typed model QVTBase.ITypedModel typedModel = relationTransformation.ModelParameter.FirstOrDefault(p => (typedModelName.IsNullOrEmpty() || p.Name == typedModelName) && p.UsedPackage.FirstOrDefault(p2 => p2 == metamodelPackage) != null); // If there is none, we create one if (typedModel == null) { typedModel = new QVTBase.TypedModel() { Name = typedModelName, Transformation = relationTransformation, }; typedModel.UsedPackage.Add(metamodelPackage); } return(typedModel); }