public static CdmTraitGroupReference FromData(CdmCorpusContext ctx, JToken obj)
        {
            // Note: Trait group reference by definition cannot be specified as a simple named reference

            if (obj == null || obj["traitGroupReference"] == null)
            {
                return(null);
            }

            bool?   optional = null;
            dynamic traitGroup;

            if (obj["optional"] != null)
            {
                if (bool.TryParse(obj["optional"].ToString(), out bool optVal))
                {
                    optional = optVal;
                }
            }

            if (obj["traitGroupReference"] is JValue)
            {
                traitGroup = (string)obj["traitGroupReference"];
            }
            else
            {
                traitGroup = TraitGroupPersistence.FromData(ctx, obj["traitGroupReference"]);
            }

            CdmTraitGroupReference traitGroupReference = ctx.Corpus.MakeRef <CdmTraitGroupReference>(CdmObjectType.TraitGroupRef, traitGroup, false);

            if (optional != null)
            {
                traitGroupReference.Optional = optional;
            }

            return(traitGroupReference);
        }
Beispiel #2
0
        public static CdmDocumentDefinition FromObject(CdmCorpusContext ctx, string name, string nameSpace, string path, DocumentContent obj)
        {
            var doc = ctx.Corpus.MakeObject <CdmDocumentDefinition>(CdmObjectType.DocumentDef, name);

            doc.FolderPath = path;
            doc.Namespace  = nameSpace;

            if (!StringUtils.IsBlankByCdmStandard(obj.Schema))
            {
                doc.Schema = obj.Schema;
            }

            if (!StringUtils.IsBlankByCdmStandard(obj.DocumentVersion))
            {
                doc.DocumentVersion = obj.DocumentVersion;
            }

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

            if (obj.Definitions != null)
            {
                for (int i = 0; i < obj.Definitions.Count; i++)
                {
                    dynamic d = obj.Definitions[i];
                    if (d["dataTypeName"] != null)
                    {
                        doc.Definitions.Add(DataTypePersistence.FromData(ctx, d));
                    }
                    else if (d["purposeName"] != null)
                    {
                        doc.Definitions.Add(PurposePersistence.FromData(ctx, d));
                    }
                    else if (d["attributeGroupName"] != null)
                    {
                        doc.Definitions.Add(AttributeGroupPersistence.FromData(ctx, d));
                    }
                    else if (d["traitName"] != null)
                    {
                        doc.Definitions.Add(TraitPersistence.FromData(ctx, d));
                    }
                    else if (d["traitGroupName"] != null)
                    {
                        doc.Definitions.Add(TraitGroupPersistence.FromData(ctx, d));
                    }
                    else if (d["entityShape"] != null)
                    {
                        doc.Definitions.Add(ConstantEntityPersistence.FromData(ctx, d));
                    }
                    else if (d["entityName"] != null)
                    {
                        doc.Definitions.Add(EntityPersistence.FromData(ctx, d));
                    }
                }
            }

            var isResolvedDoc = false;

            if (doc.Definitions.Count == 1 && doc.Definitions[0] is CdmEntityDefinition entity)
            {
                var resolvedTrait = entity.ExhibitsTraits.Item("has.entitySchemaAbstractionLevel");
                // Tries to figure out if the document is in resolved form by looking for the schema abstraction trait
                // or the presence of the attribute context.
                isResolvedDoc = resolvedTrait != null && string.Equals((resolvedTrait as CdmTraitReference).Arguments[0].Value, "resolved");
                isResolvedDoc = isResolvedDoc || entity.AttributeContext != null;
            }

            if (!StringUtils.IsBlankByCdmStandard(obj.JsonSchemaSemanticVersion))
            {
                doc.JsonSchemaSemanticVersion = obj.JsonSchemaSemanticVersion;
                if (CompareJsonSemanticVersion(ctx, doc.JsonSchemaSemanticVersion) > 0)
                {
                    if (isResolvedDoc)
                    {
                        Logger.Warning(ctx, Tag, nameof(FromObject), null, CdmLogCode.WarnPersistUnsupportedJsonSemVer, JsonSemanticVersion, doc.JsonSchemaSemanticVersion);
                    }
                    else
                    {
                        Logger.Error(ctx, Tag, nameof(FromObject), null, CdmLogCode.ErrPersistUnsupportedJsonSemVer, JsonSemanticVersion, doc.JsonSchemaSemanticVersion);
                    }
                }
            }
            else
            {
                Logger.Warning(ctx, Tag, nameof(FromObject), null, CdmLogCode.WarnPersistJsonSemVerMandatory);
            }

            return(doc);
        }