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); }
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; }
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); }
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; } }