Ejemplo n.º 1
0
        private static object ConvertResource(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference,
                                              ODataDeserializerContext readContext)
        {
            EdmEntitySet tempEntitySet = null;

            if (edmTypeReference.IsEntity())
            {
                IEdmEntityTypeReference entityType = edmTypeReference.AsEntity();
                tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp",
                                                 entityType.EntityDefinition());
            }

            // TODO: Sam xu, can we use the parameter-less overload
            ODataReader resourceReader = oDataMessageReader.CreateODataUriParameterResourceReader(tempEntitySet,
                                                                                                  edmTypeReference.ToStructuredType());

            object item = resourceReader.ReadResourceOrResourceSet();

            ODataResourceWrapper topLevelResource = item as ODataResourceWrapper;

            Contract.Assert(topLevelResource != null);

            ODataDeserializerProvider deserializerProvider = readContext.Request.GetDeserializerProvider();

            ODataResourceDeserializer entityDeserializer =
                (ODataResourceDeserializer)deserializerProvider.GetEdmTypeDeserializer(edmTypeReference);

            return(entityDeserializer.ReadInline(topLevelResource, edmTypeReference, readContext));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Parse the constant entity node.
        /// </summary>
        /// <param name="nodeIn">The input constant node.</param>
        /// <returns>The parsed object.</returns>
        private object ParseEntity(ConstantNode nodeIn)
        {
            ODataMessageReaderSettings settings = new ODataMessageReaderSettings();
            InMemoryMessage            message  = new InMemoryMessage()
            {
                Stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(nodeIn.LiteralText)),
            };

            var resourceType = (nodeIn.TypeReference as IEdmStructuredTypeReference).Definition as IEdmStructuredType;

            using (
                ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings,
                                                                   this.UriParser.Model))
            {
                if (nodeIn.LiteralText.Contains("@odata.id"))
                {
                    ODataEntityReferenceLink referenceLink = reader.ReadEntityReferenceLink();
                    var queryContext = new QueryContext(this.UriParser.ServiceRoot, referenceLink.Url,
                                                        this.DataSource.Model, this.UriParser.Container);
                    var target = queryContext.ResolveQuery(this.DataSource);
                    return(target);
                }

                var entityType = resourceType as IEdmEntityType;

                var entryReader = reader.CreateODataUriParameterResourceReader(
                    entityType == null ? null : new EdmEntitySet(new EdmEntityContainer("NS", "Test"), "TestType", entityType),
                    resourceType);
                return(ODataObjectModelConverter.ReadEntityOrEntityCollection(entryReader, false));
            }
        }
Ejemplo n.º 3
0
        private void ReadSingletonParameter(string payload, IEdmStructuredType resourceType, out List <ODataResourceSet> resourceSets, out List <ODataResource> resources, out List <ODataNestedResourceInfo> nestedResourceInfos)
        {
            var message = new InMemoryMessage()
            {
                Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload))
            };
            var settings = new ODataMessageReaderSettings();

            using (var msgReader = new ODataMessageReader((IODataRequestMessage)message, settings, model))
            {
                var reader = msgReader.CreateODataUriParameterResourceReader((resourceType == null || resourceType is IEdmComplexType) ? null : peopleSet, resourceType);
                resources           = new List <ODataResource>();
                nestedResourceInfos = new List <ODataNestedResourceInfo>();
                resourceSets        = new List <ODataResourceSet>();
                while (reader.Read())
                {
                    if (reader.State == ODataReaderState.ResourceEnd)
                    {
                        resources.Add(reader.Item as ODataResource);
                    }
                    else if (reader.State == ODataReaderState.NestedResourceInfoEnd)
                    {
                        nestedResourceInfos.Add(reader.Item as ODataNestedResourceInfo);
                    }
                    else if (reader.State == ODataReaderState.ResourceSetEnd)
                    {
                        resourceSets.Add(reader.Item as ODataResourceSet);
                    }
                }
            }
        }