public static string JsonRepresentation(MetadataParameter[] parameters) { var builder = new StringBuilder(); builder.AppendLine("<pre>"); builder.AppendLine("{"); JsonRepresentationBlock(builder, parameters, 1); builder.AppendLine("}"); builder.AppendLine("</pre>"); return builder.ToString(); }
public MetadataParameter[] GetTypeParameters(Type type, JsonMapperEntryMode?mode = null, bool patch = false, string prefix = null) { // get JSON mapping manager var mapper = _jsonMapperManager.GetMapper(type); if (mapper == null) { return new MetadataParameter[] { } } ; // create parameters from mapping entries var parameters = new List <MetadataParameter>(); foreach (var parameter in mapper.Entries.Where(e => mode == null || (mode.Value & e.Mode) == mode.Value)) { // add parameter that corresponds to the mapped property var propertyType = parameter.EntityProperty.PropertyType; var isJsonObject = parameter.EntityProperty.IsDefined(typeof(JsonFieldAttribute), false); var param = new MetadataParameter { Name = prefix + parameter.JsonProperty, Type = isJsonObject ? "object" : ToJsonType(propertyType), IsRequred = !patch && IsRequired(parameter.EntityProperty), Documentation = _xmlCommentReader.GetPropertyElement(parameter.EntityProperty).ElementContents("summary"), }; parameters.Add(param); // add child object parameters if (param.Type == "object" && !isJsonObject) { parameters.AddRange(GetTypeParameters(propertyType, mode, false, param.Name + ".")); } else if (param.Type == "array") { var elementType = propertyType.GetInterfaces().First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable <>)).GetGenericArguments().First(); if (ToJsonType(elementType) == "object") { parameters.AddRange(GetTypeParameters(elementType, mode, false, param.Name + "[].")); } } } return(parameters.ToArray()); }
private static void JsonRepresentationBlock(StringBuilder builder, MetadataParameter[] parameters, int indent) { var isFirstProperty = true; var processed = new List<MetadataParameter>(); foreach (var parameter in parameters) { if (processed.Contains(parameter)) continue; if (!isFirstProperty) builder.AppendLine(","); isFirstProperty = false; var innerObject = parameters.Where(p => p.Name.StartsWith(parameter.Name + ".")); if (innerObject.Any()) { var innerParams = innerObject.Select(o => new MetadataParameter { Name = o.Name.Substring(parameter.Name.Length + 1), Type = o.Type }).ToArray(); builder.AppendFormat("{0}<span class=\"green\">"{1}"</span>: {{\n", new string(' ', 4 * indent), Encode(parameter.Name)); JsonRepresentationBlock(builder, innerParams, indent + 1); builder.AppendFormat("{0}}}", new string(' ', 4 * indent)); processed.AddRange(innerObject); continue; } var innerArray = parameters.Where(p => p.Name.StartsWith(parameter.Name + "[].")); if (innerArray.Any()) { var innerParams = innerArray.Select(o => new MetadataParameter { Name = o.Name.Substring(parameter.Name.Length + 3), Type = o.Type }).ToArray(); builder.AppendFormat("{0}<span class=\"green\">"{1}"</span>: [\n", new string(' ', 4 * indent), Encode(parameter.Name)); builder.AppendFormat("{0}{{\n", new string(' ', 4 * (indent + 1))); JsonRepresentationBlock(builder, innerParams, indent + 2); builder.AppendFormat("{0}}}\n", new string(' ', 4 * (indent + 1))); builder.AppendFormat("{0}]", new string(' ', 4 * indent)); processed.AddRange(innerArray); continue; } builder.AppendFormat("{0}<span class=\"green\">"{1}"</span>: <span class=\"blue\">{{{2}}}</span>", new string(' ', 4 * indent), Encode(parameter.Name), Encode(parameter.Type)); } builder.AppendLine(); }
public MetadataParameter[] GetTypeParameters(Type type, JsonMapperEntryMode? mode = null, string prefix = null) { // get JSON mapping manager var mapper = _jsonMapperManager.GetMapper(type); if (mapper == null) return new MetadataParameter[] { }; // create parameters from mapping entries var parameters = new List<MetadataParameter>(); foreach (var parameter in mapper.Entries.Where(e => mode == null || (mode.Value & e.Mode) == mode.Value)) { // add parameter that corresponds to the mapped property var propertyType = parameter.EntityProperty.PropertyType; var isJsonObject = parameter.EntityProperty.IsDefined(typeof(JsonFieldAttribute), false); var param = new MetadataParameter { Name = prefix + parameter.JsonProperty, Type = isJsonObject ? "object" : ToJsonType(propertyType), IsRequred = IsRequired(parameter.EntityProperty), Documentation = _xmlCommentReader.GetPropertyElement(parameter.EntityProperty).ElementContents("summary"), }; parameters.Add(param); // add child object parameters if (param.Type == "object" && !isJsonObject) { parameters.AddRange(GetTypeParameters(propertyType, mode, param.Name + ".")); } else if (param.Type == "array") { var elementType = propertyType.GetInterfaces().First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)).GetGenericArguments().First(); if (ToJsonType(elementType) == "object") { parameters.AddRange(GetTypeParameters(elementType, mode, param.Name + "[].")); } } } return parameters.ToArray(); }
public void AdjustParameters(List<MetadataParameter> parameters, XElement adjustElement, JsonMapperEntryMode? jsonMode = null) { foreach (var parameterElement in adjustElement.Elements("parameter") .Where(p => p.Attribute("name") != null)) { var name = (string)parameterElement.Attribute("name"); var type = (string)parameterElement.Attribute("type"); var mode = (string)parameterElement.Attribute("mode"); var required = (bool?)parameterElement.Attribute("required"); var after = (string)parameterElement.Attribute("after"); // remove an existing parameter if (mode == "remove") { parameters.RemoveAll(p => p.Name.StartsWith(name)); continue; } // add or update an existing parameter var param = parameters.FirstOrDefault(p => p.Name == name); if (param == null) { param = new MetadataParameter { Name = name, Type = type }; var index = parameters.Count; if (after != null) { var target = parameters.FirstOrDefault(p => p.Name == after); if (target != null) index = parameters.IndexOf(target) + 1; } parameters.Insert(index, param); } if (!string.IsNullOrEmpty(parameterElement.Contents())) { param.Documentation = parameterElement.Contents(); } if (required != null) { param.IsRequred = required.Value; } // if element includes cref - parse the specified type and add parameters from it var cref = GetCrefType(parameterElement); if (cref != null) { if (param.Type == null) param.Type = "object"; var paramJsonMode = jsonMode; if (paramJsonMode != null && mode == "OneWayOnly") paramJsonMode = paramJsonMode.Value | JsonMapperEntryMode.OneWayOnly; parameters.AddRange(GetTypeParameters(cref, paramJsonMode, param.Name + (type == "array" ? "[]" : null) + ".")); } } }
public void AdjustParameters(List <MetadataParameter> parameters, XElement adjustElement, JsonMapperEntryMode?jsonMode = null) { foreach (var parameterElement in adjustElement.Elements("parameter") .Where(p => p.Attribute("name") != null)) { var name = (string)parameterElement.Attribute("name"); var type = (string)parameterElement.Attribute("type"); var mode = (string)parameterElement.Attribute("mode"); var required = (bool?)parameterElement.Attribute("required"); var after = (string)parameterElement.Attribute("after"); // remove an existing parameter if (mode == "remove") { parameters.RemoveAll(p => p.Name.StartsWith(name)); continue; } // add or update an existing parameter var param = parameters.FirstOrDefault(p => p.Name == name); if (param == null) { param = new MetadataParameter { Name = name, Type = type }; var index = parameters.Count; if (after != null) { var target = parameters.FirstOrDefault(p => p.Name == after); if (target != null) { index = parameters.IndexOf(target) + 1; } } parameters.Insert(index, param); } if (!string.IsNullOrEmpty(parameterElement.Contents())) { param.Documentation = parameterElement.Contents(); } if (required != null) { param.IsRequred = required.Value; } // if element includes cref - parse the specified type and add parameters from it var cref = GetCrefType(parameterElement); if (cref != null) { if (param.Type == null) { param.Type = "object"; } var paramJsonMode = jsonMode; if (paramJsonMode != null && mode == "OneWayOnly") { paramJsonMode = paramJsonMode.Value | JsonMapperEntryMode.OneWayOnly; } parameters.AddRange(GetTypeParameters(cref, paramJsonMode, prefix: param.Name + (type == "array" ? "[]" : null) + ".")); } } }