Exemple #1
0
        public void TestCdmCollectionRemoveMethod()
        {
            var cdmCorpus = new CdmCorpusDefinition();

            cdmCorpus.Storage.DefaultNamespace = "local";
            cdmCorpus.Storage.Mount("local", new LocalAdapter("CdmCorpus/LocalPath"));

            var ctx = cdmCorpus.Ctx;

            var cdmDocument = new CdmDocumentDefinition(ctx, "NameOfDocument");
            var collection  = new CdmCollection <CdmAttributeContext>(ctx, cdmDocument, Enums.CdmObjectType.AttributeContextDef);

            var addedDocument = collection.Add("nameOfNewDocument");

            var addedDocument2 = collection.Add("otherDocument");

            Assert.AreEqual(2, collection.Count);

            bool removed = collection.Remove(addedDocument);

            Assert.IsTrue(removed);

            // try to remove a second time.
            removed = collection.Remove(addedDocument);
            Assert.IsFalse(removed);
            Assert.AreEqual(1, collection.Count);
        }
Exemple #2
0
        public void TestCdmCollectionRemoveAt()
        {
            var cdmCorpus = new CdmCorpusDefinition();

            cdmCorpus.Storage.DefaultNamespace = "local";
            cdmCorpus.Storage.Mount("local", new LocalAdapter("CdmCorpus/LocalPath"));

            var ctx = cdmCorpus.Ctx;

            var cdmDocument = new CdmDocumentDefinition(ctx, "NameOfDocument");
            var collection  = new CdmCollection <CdmAttributeContext>(ctx, cdmDocument, Enums.CdmObjectType.AttributeContextDef);

            var addedDocument = collection.Add("nameOfNewDocument");

            var addedDocument2 = collection.Add("otherDocument");

            Assert.AreEqual(2, collection.Count);

            collection.RemoveAt(0);
            Assert.AreEqual(1, collection.Count);
            Assert.AreEqual(addedDocument2, collection[0]);
            collection.RemoveAt(1);
            Assert.AreEqual(1, collection.Count);
            Assert.AreEqual(addedDocument2, collection[0]);
            collection.RemoveAt(0);
            Assert.AreEqual(0, collection.Count);
        }
Exemple #3
0
        public void TestCdmCollectionAddMethod()
        {
            var cdmCorpus = new CdmCorpusDefinition();

            cdmCorpus.Storage.DefaultNamespace = "local";
            cdmCorpus.Storage.Mount("local", new LocalAdapter("CdmCorpus/LocalPath"));

            var ctx = cdmCorpus.Ctx;

            var cdmDocument = new CdmDocumentDefinition(ctx, "NameOfDocument");
            var collection  = new CdmCollection <CdmAttributeContext>(ctx, cdmDocument, Enums.CdmObjectType.AttributeContextDef);

            var addedAttributeContext = collection.Add("nameOfNewAttribute");

            Assert.AreEqual(1, collection.Count);
            Assert.AreEqual("nameOfNewAttribute", collection[0].Name);
            Assert.AreEqual(cdmDocument, collection[0].Owner);
            Assert.AreEqual(ctx, collection[0].Ctx);

            Assert.AreEqual(collection[0], addedAttributeContext);

            var attributeContext = new CdmAttributeContext(ctx, "NameOfAttributeContext");
            var addedAttribute   = collection.Add(attributeContext);

            Assert.AreEqual(2, collection.Count);
            Assert.AreEqual(attributeContext, addedAttribute);
            Assert.AreEqual(attributeContext, collection[1]);
            Assert.AreEqual(cdmDocument, attributeContext.Owner);
        }
Exemple #4
0
 /// <summary>
 /// Adds all elements of a list to a CdmCollection
 /// </summary>
 public static void AddListToCdmCollection <T>(CdmCollection <T> cdmCollection, List <T> list) where T : CdmObject
 {
     if (cdmCollection != null && list != null)
     {
         foreach (var element in list)
         {
             cdmCollection.Add(element);
         }
     }
 }
Exemple #5
0
        /// <summary>
        /// Get a string version of the relationship collection
        /// </summary>
        /// <param name="relationships"></param>
        /// <returns></returns>
        internal static string GetRelationshipStrings(CdmCollection <CdmE2ERelationship> relationships)
        {
            StringBuilder bldr = new StringBuilder();

            foreach (var rel in relationships)
            {
                bldr.AppendLine($"{rel.Name}|{rel.ToEntity}|{rel.ToEntityAttribute}|{rel.FromEntity}|{rel.FromEntityAttribute}");
            }
            return(bldr.ToString());
        }
        /// <summary>
        /// Validates the creation of an attribute group and return its definition
        /// </summary>
        /// <param name="attributes">The collection of attributes.</param>
        /// <param name="attributeGroupName">The attribute group name.</param>
        /// <param name="attributesSize">The expected size of the attributes collection.</param>
        /// <returns></returns>
        private CdmAttributeGroupDefinition ValidateAttributeGroup(CdmCollection <CdmAttributeItem> attributes, string attributeGroupName, int attributesSize = 1, int index = 0)
        {
            Assert.AreEqual(attributesSize, attributes.Count);
            Assert.AreEqual(CdmObjectType.AttributeGroupRef, attributes[index].ObjectType);
            CdmAttributeGroupReference attGroupReference = attributes[index] as CdmAttributeGroupReference;

            Assert.IsNotNull(attGroupReference.ExplicitReference);

            CdmAttributeGroupDefinition attGroupDefinition = attGroupReference.ExplicitReference as CdmAttributeGroupDefinition;

            Assert.AreEqual(attributeGroupName, attGroupDefinition.AttributeGroupName);

            return(attGroupDefinition);
        }
Exemple #7
0
        /// <summary>
        /// Get the traits for all the attributes of a resolved entity
        /// </summary>
        /// <param name="resolvedEntity"></param>
        private void GetTraits(CdmCollection <CdmAttributeItem> attributes)
        {
            foreach (CdmAttributeItem attrib in attributes)
            {
                string attribCorpusPath = attrib.AtCorpusPath;
                bldr.AppendLine(attribCorpusPath);

                if (attrib is CdmAttributeGroupReference)
                {
                    CdmAttributeGroupDefinition attGroupDef = (CdmAttributeGroupDefinition)(attrib as CdmAttributeGroupReference).ExplicitReference;
                    bldr.AppendLine(attGroupDef.AtCorpusPath);
                    GetTraitCollection(attGroupDef.ExhibitsTraits);
                    GetTraits(attGroupDef.Members);
                }
                else
                {
                    GetTraitCollection(attrib.AppliedTraits);
                }
            }
        }
Exemple #8
0
        public void TestCdmCollectionChangeMakesDocumentDirty()
        {
            var manifest   = CdmCollectionHelperFunctions.GenerateManifest();
            var collection = new CdmCollection <CdmEntityReference>(manifest.Ctx, manifest, Enums.CdmObjectType.EntityRef);

            manifest.IsDirty = false;
            collection.Add(new CdmEntityReference(manifest.Ctx, "name", false));
            Assert.IsTrue(manifest.IsDirty);
            manifest.IsDirty = false;
            collection.Add("theName");
            Assert.IsTrue(manifest.IsDirty);
            var entity     = new CdmEntityReference(manifest.Ctx, "otherEntity", false);
            var entityList = new List <CdmEntityReference>()
            {
                entity
            };

            manifest.IsDirty = false;
            collection.AddRange(entityList);
            Assert.IsTrue(manifest.IsDirty);
            manifest.IsDirty = false;
            var entity2 = new CdmEntityReference(manifest.Ctx, "otherEntity2", false);

            collection.Insert(0, entity2);
            Assert.IsTrue(manifest.IsDirty);

            manifest.IsDirty = false;
            collection.Remove(entity);
            Assert.IsTrue(manifest.IsDirty);

            manifest.IsDirty = false;
            collection.RemoveAt(0);
            Assert.IsTrue(manifest.IsDirty);

            manifest.IsDirty = false;
            collection.Clear();
            Assert.IsTrue(manifest.IsDirty);
        }
Exemple #9
0
        public void TestCdmCollectionAddingList()
        {
            var cdmCorpus = new CdmCorpusDefinition();

            cdmCorpus.Storage.DefaultNamespace = "local";
            cdmCorpus.Storage.Mount("local", new LocalAdapter("CdmCorpus/LocalPath"));

            var ctx = cdmCorpus.Ctx;

            var cdmDocument = new CdmDocumentDefinition(ctx, "NameOfDocument");
            var collection  = new CdmCollection <CdmEntityDeclarationDefinition>(ctx, cdmDocument, Enums.CdmObjectType.LocalEntityDeclarationDef);

            var entityList = new List <CdmEntityDeclarationDefinition>();

            for (int i = 0; i < 2; i++)
            {
                var entity = new CdmEntityDefinition(cdmCorpus.Ctx, $"entityName_{i}", null);

                CdmCollectionHelperFunctions.CreateDocumentForEntity(cdmCorpus, entity);

                var entityDeclaration = cdmCorpus.MakeObject <CdmEntityDeclarationDefinition>(Enums.CdmObjectType.LocalEntityDeclarationDef, entity.EntityName, false);
                entityDeclaration.Owner      = entity.Owner;
                entityDeclaration.EntityPath = $"{entity.Owner.AtCorpusPath}/{entity.EntityName}";

                entityList.Add(entityDeclaration);
            }
            Assert.AreEqual(0, collection.Count);

            collection.AddRange(entityList);

            Assert.AreEqual(2, collection.Count);

            for (int i = 0; i < 2; i++)
            {
                Assert.AreEqual($"entityName_{i}", collection[i].EntityName);
            }
        }
        public static async Task <CdmTypeAttributeDefinition> FromData(CdmCorpusContext ctx, Attribute obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var attribute = ctx.Corpus.MakeObject <CdmTypeAttributeDefinition>(CdmObjectType.TypeAttributeDef, obj.Name);

            // Do a conversion between CDM data format and model.json data type.
            attribute.DataFormat = DataTypeFromData(obj.DataType);

            attribute.Description = obj.Description;

            if (obj.IsHidden == true)
            {
                var isHiddenTrait = ctx.Corpus.MakeObject <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden");
                isHiddenTrait.IsFromProperty = true;
                attribute.AppliedTraits.Add(isHiddenTrait);
            }

            await Utils.ProcessAnnotationsFromData(ctx, obj, attribute.AppliedTraits);

            ExtensionHelper.ProcessExtensionFromJson(ctx, obj, attribute.AppliedTraits, extensionTraitDefList);

            return(attribute);
        }
Exemple #11
0
 public static void ValidateAttributesCollection(List <AttributeExpectedValue> expected, CdmCollection <CdmAttributeItem> actual)
 {
     Assert.AreEqual(expected.Count, actual.Count);
     for (int i = 0; i < actual.AllItems.Count; i++)
     {
         if (actual.AllItems[i].GetType() == typeof(CdmTypeAttributeDefinition))
         {
             AttributeExpectedValue     exp = (AttributeExpectedValue)expected[i];
             CdmTypeAttributeDefinition act = (CdmTypeAttributeDefinition)actual.AllItems[i];
             ValidateTypeAttributeDefinition(exp, act);
         }
         else if (actual.AllItems[i].GetType() == typeof(CdmAttributeGroupReference))
         {
             AttributeExpectedValue     exp = (AttributeExpectedValue)expected[i];
             CdmAttributeGroupReference act = (CdmAttributeGroupReference)actual.AllItems[i];
             ValidateAttributeGroupRef(exp, act);
         }
     }
 }
Exemple #12
0
        public static async Task <CdmDataPartitionDefinition> FromData(CdmCorpusContext ctx, Partition obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var partition = ctx.Corpus.MakeObject <CdmDataPartitionDefinition>(CdmObjectType.DataPartitionDef, obj.Name);

            partition.Description             = obj.Description;
            partition.Location                = ctx.Corpus.Storage.AdapterPathToCorpusPath(obj.Location);
            partition.RefreshTime             = obj.RefreshTime;
            partition.LastFileModifiedTime    = obj.LastFileModifiedTime;
            partition.LastFileStatusCheckTime = obj.LastFileStatusCheckTime;

            if (obj.IsHidden == true)
            {
                var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true);
                partition.ExhibitsTraits.Add(isHiddenTrait);
            }

            await Utils.ProcessAnnotationsFromData(ctx, obj, partition.ExhibitsTraits);

            if (obj.FileFormatSettings != null)
            {
                var csvFormatTrait = Utils.CreateCsvTrait(obj.FileFormatSettings, ctx);

                if (csvFormatTrait == null)
                {
                    Logger.Error(typeof(DataPartitionPersistence).ToString(), ctx as ResolveContext, "There was a problem while processing csv format settings inside data partition.");

                    return(null);
                }

                partition.ExhibitsTraits.Add(csvFormatTrait);
            }
            ExtensionHelper.ProcessExtensionFromJson(ctx, obj, partition.ExhibitsTraits, extensionTraitDefList);

            return(partition);
        }
Exemple #13
0
        /// <summary>
        /// Adds the remaining definitions of extensions to extensionDoc.
        /// Then adds extensionDoc to the folder of the manifest and
        /// adds it's path to the list of imports
        /// </summary>
        /// <param name="ctx">The context</param>
        /// <param name="extensionDoc">The document where the definitions will be added. This document will be added to folder and it's path to importDocs</param>
        /// <param name="extensionTraitDefList">The list of definitions to be added to schema.</param>
        /// <param name="folder">The folder that contains the manifest and where the document containing the schema will be placed.</param>
        /// <param name="importDocs">The list of paths of documents containing schemas for the manifest.</param>
        private static void CreateExtensionDocAndAddToFolderAndImports(CdmCorpusContext ctx, CdmDocumentDefinition extensionDoc, CdmCollection <CdmTraitDefinition> extensionTraitDefList, CdmFolderDefinition folder, List <CdmImport> importDocs)
        {
            if (extensionTraitDefList.Count > 0)
            {
                // pull out the extension trait definitions into a new custom extension document
                extensionTraitDefList.Select((CdmTraitDefinition cdmTraitDef) => (CdmObjectDefinition)cdmTraitDef).ToList().ForEach((CdmObjectDefinition cdmObjectDef) =>
                {
                    extensionDoc.Definitions.Add(cdmObjectDef);
                });
                extensionDoc.Folder = folder;

                // import the cdm extensions into this new document that has the custom extensions
                CdmImport baseExtensionImport = ctx.Corpus.MakeObject <CdmImport>(CdmObjectType.Import);
                baseExtensionImport.CorpusPath = "cdm:/extensions/base.extension.cdm.json";
                extensionDoc.Imports.Add(baseExtensionImport);

                // add the extension doc to the folder, will wire everything together as needed
                folder.Documents.Add(extensionDoc);

                // import this new customer extension doc into the list of imports for the origial doc
                CdmImport extensionImport = ctx.Corpus.MakeObject <CdmImport>(CdmObjectType.Import);
                extensionImport.CorpusPath = ctx.Corpus.Storage.CreateRelativeCorpusPath(extensionDoc.AtCorpusPath, extensionDoc);
                importDocs.Add(extensionImport);
            }
        }
Exemple #14
0
        public static async Task <CdmManifestDefinition> FromData(CdmCorpusContext ctx, Model obj, CdmFolderDefinition folder)
        {
            #region Prepare extenisonDoc
            var extensionDoc = ctx.Corpus.MakeObject <CdmDocumentDefinition>(CdmObjectType.DocumentDef,
                                                                             (string.IsNullOrEmpty(folder.Name) ? folder.Namespace : folder.Name) + ".extension.cdm.json");
            CdmCollection <CdmTraitDefinition> extensionTraitDefList = new CdmCollection <CdmTraitDefinition>(ctx, extensionDoc, CdmObjectType.TraitDef);
            #endregion

            #region Set manifest fields
            CdmManifestDefinition manifest = ctx.Corpus.MakeObject <CdmManifestDefinition>(CdmObjectType.ManifestDef, obj.Name);

            manifest.Explanation               = obj.Description;
            manifest.LastFileModifiedTime      = obj.ModifiedTime;
            manifest.LastChildFileModifiedTime = obj.LastChildFileModifiedTime;
            manifest.LastFileStatusCheckTime   = obj.LastFileStatusCheckTime;

            if (obj.Application != null)
            {
                var applicationTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.managedBy", false);
                applicationTrait.IsFromProperty = true;

                var arg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "application");
                arg.Value = obj.Application;
                applicationTrait.Arguments.Add(arg);

                manifest.ExhibitsTraits.Add(applicationTrait);
            }

            if (obj.Version != null)
            {
                var versionTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.modelConversion.modelVersion", false);

                var arg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "version");
                arg.Value = obj.Version;
                versionTrait.Arguments.Add(arg);

                manifest.ExhibitsTraits.Add(versionTrait);
            }

            if (obj.Culture != null)
            {
                var cultureTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.partition.culture", false);
                cultureTrait.IsFromProperty = true;

                var arg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "culture");
                arg.Value = obj.Culture;
                cultureTrait.Arguments.Add(arg);

                manifest.ExhibitsTraits.Add(cultureTrait);
            }

            if (obj.IsHidden == true)
            {
                var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true);
                isHiddenTrait.IsFromProperty = true;
                manifest.ExhibitsTraits.Add(isHiddenTrait);
            }

            var referenceModels = new Dictionary <string, string>();

            if (obj.ReferenceModels != null)
            {
                var referenceModelsTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.modelConversion.referenceModelMap", false);

                var arg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "referenceModelMap");
                arg.Value = JToken.FromObject(obj.ReferenceModels);
                referenceModelsTrait.Arguments.Add(arg);

                manifest.ExhibitsTraits.Add(referenceModelsTrait);

                foreach (var referenceModel in obj.ReferenceModels)
                {
                    referenceModels.Add(referenceModel.Id, referenceModel.Location);
                }
            }

            var entitySchemaByName = new Dictionary <string, string>();
            if (obj.Entities != null && obj.Entities.Count > 0)
            {
                foreach (var element in obj.Entities)
                {
                    CdmEntityDeclarationDefinition entity = null;

                    if ((string)element["$type"] == "LocalEntity")
                    {
                        entity = await LocalEntityDeclarationPersistence.FromData(ctx, folder, element.ToObject <LocalEntity>(), extensionTraitDefList);
                    }
                    else if ((string)element["$type"] == "ReferenceEntity")
                    {
                        var referenceEntity = element.ToObject <ReferenceEntity>();
                        if (!referenceModels.ContainsKey(referenceEntity.ModelId))
                        {
                            Logger.Error(nameof(ManifestPersistence), ctx, $"Model Id {referenceEntity.ModelId} from {referenceEntity.Name} not found in referenceModels.");

                            return(null);
                        }
                        entity = await ReferencedEntityDeclarationPersistence.FromData(ctx, referenceEntity, referenceModels[referenceEntity.ModelId], extensionTraitDefList);
                    }
                    else
                    {
                        Logger.Error(nameof(ManifestPersistence), ctx, "There was an error while trying to parse entity type.");
                    }

                    if (entity != null)
                    {
                        manifest.Entities.Add(entity);
                        if (entity is CdmLocalEntityDeclarationDefinition localEntity)
                        {
                            entitySchemaByName.Add(entity.EntityName, localEntity.EntityPath);
                        }
                        else if (entity is CdmReferencedEntityDeclarationDefinition referenceEntity)
                        {
                            entitySchemaByName.Add(entity.EntityName, referenceEntity.EntityPath);
                        }
                    }
                    else
                    {
                        Logger.Error(nameof(ManifestPersistence), ctx, "There was an error while trying to parse entity type.");
                    }
                }
            }

            if (obj.Relationships != null && obj.Relationships.Count > 0)
            {
                foreach (var element in obj.Relationships)
                {
                    var relationship = await RelationshipPersistence.FromData(ctx, element, entitySchemaByName);

                    if (relationship != null)
                    {
                        manifest.Relationships.Add(relationship);
                    }
                    else
                    {
                        Logger.Error(nameof(ManifestPersistence), ctx, "There was an error while trying to convert model.json local entity to cdm local entity declaration.");
                    }
                }
            }

            if (obj.Imports != null)
            {
                foreach (var element in obj.Imports)
                {
                    manifest.Imports.Add(CdmFolder.ImportPersistence.FromData(ctx, element));
                }
            }

            await Utils.ProcessAnnotationsFromData(ctx, obj, manifest.ExhibitsTraits);

            ExtensionHelper.ProcessExtensionFromJson(ctx, obj, manifest.ExhibitsTraits, extensionTraitDefList);
            #endregion

            #region Use extensionDoc, finalize importDocs

            List <CdmImport> importDocs = await ExtensionHelper.StandardImportDetection(ctx, extensionTraitDefList);

            CreateExtensionDocAndAddToFolderAndImports(ctx, extensionDoc, extensionTraitDefList, folder, importDocs);
            await AddImportDocsToManifest(ctx, importDocs, manifest);

            #endregion

            // We need to set up folder path and namespace of a manifest to be able to retrieve that object.
            folder.Documents.Add(manifest);

            return(manifest);
        }
Exemple #15
0
        public static async Task <CdmEntityDefinition> FromData(CdmCorpusContext ctx, LocalEntity obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var entity = ctx.Corpus.MakeObject <CdmEntityDefinition>(CdmObjectType.EntityDef, obj.Name);

            entity.Description = obj.Description;

            await Utils.ProcessAnnotationsFromData(ctx, obj, entity.ExhibitsTraits);

            if (obj.Attributes != null)
            {
                foreach (dynamic attribute in obj.Attributes)
                {
                    var typeAttribute = await TypeAttributePersistence.FromData(ctx, attribute, extensionTraitDefList);

                    if (typeAttribute != null)
                    {
                        entity.Attributes.Add(typeAttribute);
                    }
                    else
                    {
                        Logger.Error(nameof(EntityPersistence), (ResolveContext)ctx, "There was an error while trying to convert model.json attribute to cdm attribute.");
                        return(null);
                    }
                }
            }
            ExtensionHelper.ProcessExtensionFromJson(ctx, obj, entity.ExhibitsTraits, extensionTraitDefList);

            return(entity);
        }
Exemple #16
0
        public static async Task <CdmDocumentDefinition> FromData(CdmCorpusContext ctx, LocalEntity obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var docName  = $"{obj.Name}.cdm.json";
            var document = ctx.Corpus.MakeObject <CdmDocumentDefinition>(CdmObjectType.DocumentDef, docName);

            // import at least foundations
            var foundationsImport = ctx.Corpus.MakeObject <CdmImport>(CdmObjectType.Import);

            foundationsImport.CorpusPath = "cdm:/foundations.cdm.json";
            document.Imports.Add(foundationsImport);

            var entity = await EntityPersistence.FromData(ctx, obj, extensionTraitDefList);

            if (entity == null)
            {
                Logger.Error(nameof(DocumentPersistence), ctx, "There was an error while trying to convert a model.json entity to the CDM entity.");
                return(null);
            }

            if (obj.Imports != null)
            {
                foreach (var import in obj.Imports)
                {
                    if (import.CorpusPath?.Equals("cdm:/foundations.cdm.json") == true)
                    {
                        // don't add foundations twice
                        continue;
                    }
                    document.Imports.Add(CdmFolder.ImportPersistence.FromData(ctx, import));
                }
            }

            document.Definitions.Add(entity);

            return(document);
        }
        public static async Task <CdmLocalEntityDeclarationDefinition> FromData(CdmCorpusContext ctx, CdmFolderDefinition documentFolder, LocalEntity obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var localEntity = ctx.Corpus.MakeObject <CdmLocalEntityDeclarationDefinition>(CdmObjectType.LocalEntityDeclarationDef, obj.Name);

            var entityDoc = await DocumentPersistence.FromData(ctx, obj, extensionTraitDefList);

            if (entityDoc == null)
            {
                Logger.Error(nameof(LocalEntityDeclarationPersistence), ctx, "There was an error while trying to fetch the entity doc from local entity declaration persistence.");
                return(null);
            }

            documentFolder.Documents.Add(entityDoc);

            // Entity schema path is the path to the doc containing the entity definition.
            localEntity.EntityPath  = ctx.Corpus.Storage.CreateRelativeCorpusPath($"{entityDoc.AtCorpusPath}/{obj.Name}", entityDoc);
            localEntity.Explanation = obj.Description;
            localEntity.LastChildFileModifiedTime = obj.LastChildFileModifiedTime;
            localEntity.LastFileModifiedTime      = obj.LastFileModifiedTime;
            localEntity.LastFileStatusCheckTime   = obj.LastFileStatusCheckTime;

            if (obj.IsHidden == true)
            {
                var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true);
                isHiddenTrait.IsFromProperty = true;
                localEntity.ExhibitsTraits.Add(isHiddenTrait);
            }

            // Add traits for schema entity info.
            if (obj.Schemas != null)
            {
                var t2pm = new TraitToPropertyMap(localEntity);
                t2pm.UpdatePropertyValue("cdmSchemas", obj.Schemas);
            }

            // Data partitions are part of the local entity, add them here.
            if (obj.Partitions != null)
            {
                foreach (var element in obj.Partitions)
                {
                    var cdmPartition = await DataPartitionPersistence.FromData(ctx, element, extensionTraitDefList);

                    if (cdmPartition != null)
                    {
                        localEntity.DataPartitions.Add(cdmPartition);
                    }
                    else
                    {
                        Logger.Error(nameof(LocalEntityDeclarationPersistence), ctx, "There was an error while trying to fetch the entity doc from local entity declaration persistence.");
                        return(null);
                    }
                }
            }

            return(localEntity);
        }
Exemple #18
0
        /// <summary>
        /// For all the definitions (name, type) we have found for extensions, search in CDM Standard Schema for definition files.
        /// If we find a definition in a CDM Standard Schema file, we add that file to importsList.
        /// At the same time, the found definition is removed from extensionTraitDefList.
        /// When this function returns, extensionTraitDefList only contains definitions that are not present in any CDM Standard Schema file,
        /// and a list of CDM Standard Schema files with relevant definitions is returned.
        /// </summary>
        /// <param name="ctx"> The context</param>
        /// <param name="extensionTraitDefList"> The list of all definitions for all found extensions. Function modifies this list by removing definitions found in CDM Standard Schema files.</param>
        /// <returns> A list of CDM Standard Schema files to import.</returns>
        public static async Task <List <CdmImport> > StandardImportDetection(CdmCorpusContext ctx, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            List <CdmImport> importsList = new List <CdmImport>();

            // have to go from end to start because I might remove elements
            for (int traitIndex = extensionTraitDefList.Count - 1; traitIndex >= 0; traitIndex--)
            {
                CdmTraitDefinition extensionTraitDef = extensionTraitDefList[traitIndex];
                if (!TraitDefIsExtension(extensionTraitDef))
                {
                    Logger.Error(nameof(ExtensionHelper), ctx, $"Invalid extension trait name {extensionTraitDef.TraitName}, expected prefix {ExtensionTraitNamePrefix}.");

                    return(null);
                }

                string[] extensionBreakdown = RemoveExtensionTraitNamePrefix(extensionTraitDef.TraitName).Split(':');
                if (extensionBreakdown.Length > 1)
                {
                    string extensionName  = extensionBreakdown[0];
                    string fileName       = $"{extensionName}.extension.cdm.json";
                    string fileCorpusPath = $"cdm:/extensions/{fileName}";
                    CdmDocumentDefinition extensionDoc = await FetchDefDoc(ctx, fileName);

                    // If no document was found for that extensionName, the trait does not have a document with it's definition.
                    // Trait will be kept in extensionTraitDefList (a document with its definition will be created locally)
                    if (extensionDoc == null)
                    {
                        continue;
                    }

                    // There is a document with extensionName, now we search for the trait in the document.
                    // If we find it, we remove the trait from extensionTraitDefList and add the document to imports.
                    CdmTraitDefinition matchingTrait = extensionDoc.Definitions.AllItems.Find(
                        (definition) => definition.ObjectType == CdmObjectType.TraitDef && definition.GetName() == extensionTraitDef.TraitName)
                                                       as CdmTraitDefinition;
                    if (matchingTrait != null)
                    {
                        List <CdmParameterDefinition> parameterList = matchingTrait.Parameters.AllItems;
                        if (
                            extensionTraitDef.Parameters.AllItems.TrueForAll(
                                (CdmParameterDefinition extensionParameter) =>
                                parameterList.Exists(
                                    (CdmParameterDefinition defParameter) => defParameter.Name == extensionParameter.Name)
                                )
                            )
                        {
                            extensionTraitDefList.Remove(extensionTraitDefList[traitIndex]);
                            if (!importsList.Exists((CdmImport importDoc) => importDoc.CorpusPath == fileCorpusPath))
                            {
                                CdmImport importObject = ctx.Corpus.MakeObject <CdmImport>(CdmObjectType.Import);
                                importObject.CorpusPath = fileCorpusPath;
                                importsList.Add(importObject);
                            }
                        }
                    }
                }
            }
            return(importsList);
        }
Exemple #19
0
        /// <summary>
        /// Processes extensions from an object which was obtained from a "model.json" file.
        /// From every extension found, it's value (name, value) is added to traitRefSet,
        /// and it's definition (name, type) is added to extensionTraitDefList.
        /// </summary>
        /// <param name="ctx"> The context </param>
        /// <param name="sourceObject"> The object obtained from "model.json" file.</param>
        /// <param name="traitRefSet"> The list of extensions found, in the form of (name & value).</param>
        /// <param name="extensionTraitDefList"> The list of definitions. For each extension, it's definition is added to this list (name & type).</param>
        public static void ProcessExtensionFromJson(
            CdmCorpusContext ctx,
            MetadataObject sourceObject,
            CdmTraitCollection traitRefSet,
            CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var extensions = sourceObject.ExtensionFields;

            foreach (JProperty extensionAsJProperty in extensions.Children())
            {
                string             traitName         = AddExtensionTraitNamePrefix(extensionAsJProperty.Name);
                CdmTraitReference  extensionTraitRef = ctx.Corpus.MakeObject <CdmTraitReference>(CdmObjectType.TraitRef, traitName);
                CdmTraitDefinition extensionTraitDef = extensionTraitDefList.AllItems.Find((CdmTraitDefinition trait) => trait.TraitName == traitName);
                bool traitExists = extensionTraitDef != null;
                if (!traitExists)
                {
                    extensionTraitDef = ctx.Corpus.MakeObject <CdmTraitDefinition>(CdmObjectType.TraitDef, traitName);
                    extensionTraitDef.ExtendsTrait = ctx.Corpus.MakeObject <CdmTraitReference>(CdmObjectType.TraitRef, "is.extension", true);
                }

                var extensionValue = extensionAsJProperty.Value;
                var extensionType  = extensionValue.Type;

                var shouldLookIntoProperties = extensionType == JTokenType.Object;

                if (shouldLookIntoProperties)
                {
                    var extensionValueAsJObject = extensionValue as JObject;
                    // extensionProperty.Name is here the equivalent of extensionProperty from TS project
                    foreach (JProperty extensionProperty in extensionValueAsJObject.Children())
                    {
                        // for every extensionProperty will have to save the (name, value) pair into extensionArgument,
                        // which will be saved in extensionTraitRef (the entity that will contain the data)
                        // (name, type) will be saved in extensionParameter,
                        // which will be saved in extensionTraitDef (the definition of the data, that can be saved in a schema file)
                        JToken extensionPropertyValue = extensionProperty.Value;

                        if (extensionPropertyValue == null)
                        {
                            continue;
                        }

                        CdmArgumentDefinition extensionArgument = ctx.Corpus.MakeObject <CdmArgumentDefinition>(
                            CdmObjectType.ArgumentDef,
                            extensionProperty.Name
                            );
                        CdmParameterDefinition extensionParameter = extensionTraitDef.Parameters.AllItems.Find(
                            (CdmParameterDefinition parameter) => parameter.Name == extensionProperty.Name);
                        bool parameterExists = extensionParameter != null;
                        if (!parameterExists)
                        {
                            extensionParameter             = ctx.Corpus.MakeObject <CdmParameterDefinition>(CdmObjectType.ParameterDef, extensionProperty.Name);
                            extensionParameter.DataTypeRef = ctx.Corpus.MakeObject <CdmDataTypeReference>(CdmObjectType.DataTypeRef,
                                                                                                          ConvertJTokenTypeToExpectedString(extensionPropertyValue.Type),
                                                                                                          true);
                        }

                        if (extensionPropertyValue is JValue extensionPropertyValueAsJValue)
                        {
                            extensionArgument.Value = extensionPropertyValueAsJValue.Value;
                        }
                        else
                        {
                            extensionArgument.Value = extensionPropertyValue;
                        }

                        extensionTraitRef.Arguments.Add(extensionArgument);
                        if (!parameterExists)
                        {
                            extensionTraitDef.Parameters.Add(extensionParameter);
                        }
                    }
                }
                else
                {
                    CdmArgumentDefinition  extensionArgument  = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, traitName);
                    CdmParameterDefinition extensionParameter = extensionTraitDef.Parameters.AllItems.Find((CdmParameterDefinition parameter) => parameter.Name == traitName);
                    bool parameterExists = extensionParameter != null;
                    if (!parameterExists)
                    {
                        extensionParameter             = ctx.Corpus.MakeObject <CdmParameterDefinition>(CdmObjectType.ParameterDef, traitName);
                        extensionParameter.DataTypeRef = ctx.Corpus.MakeObject <CdmDataTypeReference>(
                            CdmObjectType.DataTypeRef,
                            ConvertJTokenTypeToExpectedString(extensionType),
                            true);
                    }

                    extensionArgument.Value = extensionValue;
                    extensionTraitRef.Arguments.Add(extensionArgument);
                    if (!parameterExists)
                    {
                        extensionTraitDef.Parameters.Add(extensionParameter);
                    }
                }

                if (!traitExists)
                {
                    extensionTraitDefList.Add(extensionTraitDef);
                }

                traitRefSet.Add(extensionTraitRef);
            }
        }
        public static async Task <CdmReferencedEntityDeclarationDefinition> FromData(CdmCorpusContext ctx, ReferenceEntity obj, string location, CdmCollection <CdmTraitDefinition> extensionTraitDefList)
        {
            var referencedEntity = ctx.Corpus.MakeObject <CdmReferencedEntityDeclarationDefinition>(CdmObjectType.ReferencedEntityDeclarationDef, obj.Name);

            var corpusPath = ctx.Corpus.Storage.AdapterPathToCorpusPath(location);

            referencedEntity.EntityName              = obj.Name;
            referencedEntity.EntityPath              = $"{corpusPath}/{obj.Source}";
            referencedEntity.Explanation             = obj.Description;
            referencedEntity.LastFileModifiedTime    = obj.LastFileModifiedTime;
            referencedEntity.LastFileStatusCheckTime = obj.LastFileStatusCheckTime;

            await Utils.ProcessAnnotationsFromData(ctx, obj, referencedEntity.ExhibitsTraits);

            if (obj.IsHidden == true)
            {
                var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true);
                isHiddenTrait.IsFromProperty = true;
                referencedEntity.ExhibitsTraits.Add(isHiddenTrait);
            }

            var trait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.propertyContent.multiTrait", true);

            trait.SimpleNamedReference = false;
            trait.IsFromProperty       = true;
            var argument = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "modelId");

            argument.Value = obj.ModelId;
            trait.Arguments.Add(argument);
            referencedEntity.ExhibitsTraits.Add(trait);

            ExtensionHelper.ProcessExtensionFromJson(ctx, obj, referencedEntity.ExhibitsTraits, extensionTraitDefList);
            return(referencedEntity);
        }