internal static CommonTypeReference Parse(CommonModelElement cme, ClassRepository memberOf) { CommonTypeReference retVal = new CommonTypeReference(); retVal.Name = cme.Name; retVal.SortKey = cme.SortKey; // Annotations if (cme.Annotations != null) retVal.Documentation = DocumentationParser.Parse(cme.Annotations.Documentation); retVal.DerivedFrom = cme; // Create a type reference retVal.Class = new TypeReference(); // Entry Class specified? if (cme.EntryClass == null) { // Need to find it Package p = (Package)cme.Container.MemberOfRepository.Find(cme.BoundStaticModel); if (p is GlobalStaticModel && (p as GlobalStaticModel).OwnedEntryPoint.Count > 0) { cme.EntryClass = new SpecializationClass(); cme.EntryClass.Name = (p as GlobalStaticModel).OwnedEntryPoint[0].ClassName; } else if (p != null) throw new InvalidOperationException(string.Format("Can't determine the entry point for '{0}'!", p.PackageLocation.ToString(MifCompiler.NAME_FORMAT))); else return null; // Can't find the package } retVal.Class.Name = string.Format("{0}.{1}", cme.BoundStaticModel.ToString(MifCompiler.NAME_FORMAT), cme.EntryClass.Name); // Pseudo Heiarchy to get back to the class repository retVal.MemberOf = memberOf; retVal.Class.MemberOf = memberOf; // Classifier code retVal.ClassifierCode = cme.SupplierStructuralDomain.Code.Code; // Notify complete retVal.FireParsed(); // Now return return retVal; }
/// <summary> /// Parse the specified stub as a common model element reference /// </summary> internal static CommonTypeReference Parse(StubDefinition stub, ClassRepository classRepository) { CommonTypeReference retVal = new CommonTypeReference(); // Create the return value basic parameters retVal.Name = stub.Name; retVal.SortKey = stub.SortKey; if(stub.Annotations != null) retVal.Documentation = DocumentationParser.Parse(stub.Annotations.Documentation); retVal.DerivedFrom = stub; if (stub.SupplierStructuralDomain != null && stub.SupplierStructuralDomain.Code != null) retVal.ClassifierCode = stub.SupplierStructuralDomain.Code.Code; retVal.Class = new TypeReference(); // Return value class binding if (stub.TypeStaticModel != null) { Package p = (Package)stub.Container.MemberOfRepository.Find(stub.TypeStaticModel); if (p is GlobalStaticModel && (p as GlobalStaticModel).OwnedEntryPoint.Count > 0) { string entryClassName = stub.EntryClass; if(entryClassName == null) throw new InvalidOperationException(string.Format("Package '{1}' points to a valid model with more than one entry point, however no entryClass was specified ", stub.TypeStaticModel.ToString(MifCompiler.NAME_FORMAT))); // Did we find the class with an entry point? var search = (p as GlobalStaticModel).OwnedClass.Find(o=>o.Choice is MohawkCollege.EHR.HL7v3.MIF.MIF20.StaticModel.Flat.Class && (o.Choice as MohawkCollege.EHR.HL7v3.MIF.MIF20.StaticModel.Flat.Class).Name == entryClassName); var entryClass = search.Choice as MohawkCollege.EHR.HL7v3.MIF.MIF20.StaticModel.Flat.Class; // Entry class is not null if (entryClass == null) throw new InvalidOperationException(string.Format("Can't find entry class '{0}' in package '{1}', or entry class is not a class", entryClassName, stub.TypeStaticModel.ToString(MifCompiler.NAME_FORMAT))); retVal.Class.Name = string.Format("{0}.{1}", stub.TypeStaticModel.ToString(MifCompiler.NAME_FORMAT), entryClass.Name); } else if (p is GlobalStaticModel && (p as GlobalStaticModel).OwnedEntryPoint.Count == 1) retVal.Class.Name = string.Format("{0}.{1}", stub.TypeStaticModel.ToString(MifCompiler.NAME_FORMAT), (p as GlobalStaticModel).OwnedEntryPoint[0].Name); else if (p != null) throw new InvalidOperationException(string.Format("Can't find static model '{0}'!", p.PackageLocation.ToString(MifCompiler.NAME_FORMAT))); else return null; // Can't find the package } // Pseudo Heiarchy to get back to the class repository retVal.MemberOf = classRepository; retVal.Class.MemberOf = classRepository; // Notify complete retVal.FireParsed(); // Now return return retVal; }