Example #1
0
 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();
 }
Example #2
0
        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());
        }
Example #3
0
        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\">&quot;{1}&quot;</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\">&quot;{1}&quot;</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\">&quot;{1}&quot;</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) + "."));
                }
            }
        }
Example #6
0
        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) + "."));
                }
            }
        }