コード例 #1
0
        public static JschemaXmlComment CreateFromXml(XElement xmlElement)
        {
            if (xmlElement == null)
            {
                return(null);
            }
            var smdXmlComment = new JschemaXmlComment
            {
                DemoValue = GetAttributeValue(xmlElement, "demoValue", null),
                Exclude   = bool.Parse(GetAttributeValue(xmlElement, "exclude", "false")),
                Element   = xmlElement
            };

            return(smdXmlComment);
        }
コード例 #2
0
        public static JschemaXmlComment CreateFromXml(XElement xmlElement)
        {
            if(xmlElement==null)
            {
                return null;
            }
            var smdXmlComment = new JschemaXmlComment
                                    {
                                        DemoValue = GetAttributeValue(xmlElement, "demoValue", null),
                                        Exclude = bool.Parse(GetAttributeValue(xmlElement, "exclude", "false")),
                                        Element = xmlElement
                                    };

            return smdXmlComment;
        }
コード例 #3
0
        public JObject EmitDtoJson(XmlDocSource xmlDocSource)
        {
            var schemaObj  = new JObject();
            var assemblies = xmlDocSource.Dtos.Select(a => a.Assembly).ToArray();


            schemaObj["version"] = xmlDocSource.RouteAssembly.Version;
            var schemaProperties = new JObject();

            schemaObj["properties"] = schemaProperties;

            var types     = UtilityExtensions.GetSchemaTypes(assemblies);
            var exception = new MetadataValidationException(typeof(object), "", "Errors generating meta for types", "");

            foreach (Type type in types)
            {
                try
                {
                    var typeNode   = type.GetXmlDocTypeNodeWithJSchema();
                    var jschemaXml =
                        JschemaXmlComment.CreateFromXml(typeNode.XPathSelectElement("jschema"));

                    if (jschemaXml.Exclude)
                    {
                        continue; //Skip to next type
                    }
                    var typeObj = new JObject();
                    typeObj["id"] = type.Name;

                    if (type.IsEnum)
                    {
                        RenderEnum(type, typeObj);
                    }
                    else if (type.IsClass)
                    {
                        RenderType(type, typeObj);
                    }
                    else
                    {
                        throw new NotSupportedException(type.Name + " is not supported ");
                    }

                    ApplyDescription(typeObj, typeNode);

                    if (jschemaXml.DemoValue != null)
                    {
                        typeObj["demoValue"] = jschemaXml.DemoValue;
                    }

                    schemaProperties.Add(type.Name, typeObj);
                }
                catch (MetadataValidationException ex)
                {
                    exception.AggregatedExceptions.Add(ex);
                }
            }

            if (exception.AggregatedExceptions.Count > 0)
            {
                throw exception;
            }
            return(schemaObj);
        }
コード例 #4
0
        public static void RenderType(Type type, JObject typeObj)
        {
            var    typeException = new MetadataValidationException(type, "", "Errors occured generating type meta.", "See aggregated exceptions.");
            string typeName      = type.Name;

            typeObj["type"] = "object";

            if (type.BaseType != null && type.BaseType != typeof(object))
            {
                typeObj["extends"] = "#." + type.BaseType.Name;
            }


            var properties = new JObject();

            typeObj["properties"] = properties;

            foreach (var propertyInfo in type.GetProperties())
            {
                string memberName = propertyInfo.Name;
                var    pnode      = type.GetXmlDocPropertyNode(memberName);
                if (pnode != null)
                {
                    var jschemaXml = JschemaXmlComment.CreateFromXml(pnode.XPathSelectElement("jschema"));

                    if (jschemaXml != null)
                    {
                        bool isBaseMember = pnode.Attribute("name").Value != "P:" + type.FullName + "." + propertyInfo.Name;

                        if (!jschemaXml.Exclude && !isBaseMember)
                        {
                            var pobj = new JObject();
                            properties[memberName] = pobj;


                            RenderTypeMeta(pobj, propertyInfo.PropertyType);

                            foreach (var item in jschemaXml.Element.Attributes())
                            {
                                string name  = item.Name.ToString();
                                string value = item.Value;
                                ApplyPropertyAttribute(pobj, value, typeName, name);
                            }
                            ApplyDescription(pobj, pnode);
                        }
                    }
                    else
                    {
                        typeException.AggregatedExceptions.Add(new MetadataValidationException(type, memberName, "Member does not have <jschema> element. All DTO properties must have a jschema element", "All DTO properties must have <jschema> element. If you wish to exclude the property use the exclude='true' in jschema"));
                    }
                }
                else
                {
                    typeException.AggregatedExceptions.Add(new MetadataValidationException(type, memberName, "Member is not documented with XML docs. All DTO properties must be documented with XML docs", "Document method with xml documentation as well as jschema element"));
                }
            }

            // #TODO - throw if public fields are present
            foreach (var field in type.GetFields())
            {
                typeException.AggregatedExceptions.Add(new MetadataValidationException(type, field.Name, "A DTO type must not implement public fields", "Change field to property by adding {get;set;}"));
            }

            if (typeException.AggregatedExceptions.Count > 0)
            {
                throw typeException;
            }
        }