void UniversalWriterSubnodes(SerializationWriterContext ctx, object instance, IEnumerable <Element> elements)
 {
     // PROPERTY as SUBNODE:
     // composite not null
     // collection
     foreach (var element in elements.OrderBy(x => x.Name))
     {
         var subObj = element.GetValue(instance);
         if (!IsInAttrib(subObj))
         {
             var subList = subObj as IList;
             if (subObj != null && (subList == null || subList.Count > 0))                     // subList == null - this is composite
             {
                 ctx.Write($"{Indentation(ctx.Indentation)}<{instance.GetType().Name}.{element.Name}>");
                 ctx.Indentation++;
                 if (subList != null)
                 {
                     ctx.Result.AppendLine();
                     for (int index = 0; index < subList.Count; index++)
                     {
                         var item = subList[index];
                         GetWriter(item.GetType())(ctx, item);
                     }
                 }
                 else
                 {
                     UniversalWriter(ctx, subObj);
                 }
                 ctx.Indentation--;
                 ctx.WriteLine($"{Indentation(ctx.Indentation)}</{instance.GetType().Name}.{element.Name}>");
             }
         }
     }
 }
Ejemplo n.º 2
0
        public static async Task SerializeAsync(Uri baseUri, OeParseUriContext parseUriContext, Db.OeEntityAsyncEnumerator asyncEnumerator, Stream stream)
        {
            IEdmModel      edmModel     = parseUriContext.EdmModel;
            OeEntryFactory entryFactory = parseUriContext.EntryFactory;
            String         contentType  = parseUriContext.Headers.ContentType;

            var settings = new ODataMessageWriterSettings()
            {
                BaseUri = baseUri,
                EnableMessageStreamDisposal = false,
                ODataUri    = parseUriContext.ODataUri,
                Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames,
                Version     = ODataVersion.V4
            };

            IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, edmModel))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet);
                ODataWriter writer    = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType);
                var         getWriter = new GetWriter(baseUri, parseUriContext.Headers.MetadataLevel, writer);
                await getWriter.SerializeAsync(entryFactory, asyncEnumerator, stream);
            }
        }
Ejemplo n.º 3
0
        public static async Task SerializeAsync(OeQueryContext queryContext, Db.OeAsyncEnumerator asyncEnumerator, String contentType, Stream stream)
        {
            OeEntryFactory entryFactory = queryContext.EntryFactory;
            var            settings     = new ODataMessageWriterSettings()
            {
                BaseUri = queryContext.ODataUri.ServiceRoot,
                EnableMessageStreamDisposal = false,
                ODataUri    = queryContext.ODataUri,
                Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames,
                Version     = ODataVersion.V4
            };

            IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet);
                ODataWriter writer    = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType);
                var         getWriter = new GetWriter(queryContext, writer);
                await getWriter.SerializeAsync(entryFactory, asyncEnumerator, queryContext).ConfigureAwait(false);
            }
        }
        private static Action <StringBuilder, object?> Build(Type type)
        {
            if (type.IsValueType || type == typeof(string) || type == typeof(V))
            {
                return((builder, o) => builder.Append(o));
            }

            if (type.IsAbstract)
            {
                return((builder, o) =>
                {
                    if (ReferenceEquals(o, null))
                    {
                        return;
                    }

                    var runtimeType = o.GetType();
                    builder.Append('<');
                    builder.Append(runtimeType.Name);
                    builder.Append('>');
                    GetWriter(runtimeType)(builder, o);
                });
            }

            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                var elementType   = type.GetInterfaces().Single(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable <>)).GetGenericArguments()[0];
                var elementWriter = GetWriter(elementType);

                return((builder, o) =>
                {
                    if (ReferenceEquals(o, null))
                    {
                        return;
                    }
                    builder.Append('[');
                    var first = true;
                    foreach (var element in (IEnumerable)o)
                    {
                        if (!first)
                        {
                            builder.Append(", ");
                        }
                        else
                        {
                            first = false;
                        }
                        elementWriter(builder, element);
                    }
                    builder.Append(']');
                });
            }

            var actions = new List <Action <StringBuilder, object> >();

            foreach (var prop in GetProperties(type))
            {
                Action <StringBuilder, object?> propWriter = DoWrite;
                var parameter = Expression.Parameter(typeof(object));
                var getter    = (Func <object, object>)Expression.Lambda(
                    Expression.Convert(
                        Expression.Property(
                            Expression.Convert(parameter, type),
                            prop),
                        typeof(object)),
                    parameter)
                                .Compile();
                actions.Add((builder, o) =>
                {
                    if (builder.Length > 0 && builder[^ 1] != '{')
                    {
                        builder.Append(", ");
                    }
                    builder.Append(prop.Name);
                    builder.Append(':');
                    propWriter(builder, getter(o));
                });
            }

            return((builder, o) =>
            {
                if (ReferenceEquals(o, null))
                {
                    return;
                }
                builder.Append('{');
                foreach (var action in actions)
                {
                    action(builder, o);
                }
                builder.Append('}');
            });
        }