/// <inheritdoc />
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            if (messageReader == null)
            {
                throw Error.ArgumentNull("messageReader");
            }

            if (readContext == null)
            {
                throw new ArgumentNullException(nameof(readContext));
            }

            IEdmTypeReference edmType = readContext.GetEdmType(type);

            Contract.Assert(edmType != null);

            if (!edmType.IsCollection())
            {
                throw Error.Argument("type", SRResources.ArgumentMustBeOfType, EdmTypeKind.Collection);
            }

            IEdmCollectionTypeReference collectionType = edmType.AsCollection();
            IEdmTypeReference           elementType    = collectionType.ElementType();
            ODataCollectionReader       reader         = messageReader.CreateODataCollectionReader(elementType);

            return(ReadInline(ReadCollection(reader), edmType, readContext));
        }
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            var readerSettings = new ODataMessageReaderSettings();

            // TODO ODataLib7
            if (_session.Settings.IgnoreUnmappedProperties)
            {
                readerSettings.Validations &= ~ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType;
            }
            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            readerSettings.ShouldIncludeAnnotation = x => _session.Settings.IncludeAnnotationsInResults;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync().ConfigureAwait(false), responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.ResourceSet))
                {
                    return(ReadResponse(messageReader.CreateODataResourceSetReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Resource))
                    {
                        return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync().ConfigureAwait(false), responseMessage is ODataBatchOperationResponseMessage));
                    }
                    else
                    {
                        var property = messageReader.ReadProperty();
                        return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)));
                    }
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataResourceReader()));
                }
            }
        }
Esempio n. 3
0
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage, bool includeResourceTypeInEntryProperties = false)
#endif
        {
            var readerSettings = new ODataMessageReaderSettings();

            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
#if SILVERLIGHT
                        var text = Utils.StreamToString(responseMessage.GetStream());
#else
                        var text = Client.Utils.StreamToString(await responseMessage.GetStreamAsync());
#endif
                        return(ODataResponse.FromFeed(new[] { new Dictionary <string, object>()
                                                              {
                                                                  { FluentCommand.ResultLiteral, text }
                                                              } }));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader(), includeResourceTypeInEntryProperties));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
                {
                    return(ReadResponse(messageReader.CreateODataFeedReader(), includeResourceTypeInEntryProperties));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader(), includeResourceTypeInEntryProperties));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    return(ODataResponse.FromFeed(new[] { new Dictionary <string, object>()
                                                          {
                                                              { property.Name ?? FluentCommand.ResultLiteral, GetPropertyValue(property.Value) }
                                                          } }));
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataEntryReader(), includeResourceTypeInEntryProperties));
                }
            }
        }
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            if (responseMessage.StatusCode == (int)HttpStatusCode.NoContent)
            {
                return(ODataResponse.FromStatusCode(TypeCache, responseMessage.StatusCode, responseMessage.Headers));
            }
            var readerSettings = _session.ToReaderSettings();

            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind().ToList();
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(TypeCache, responseMessage.StatusCode, responseMessage.Headers));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        return(ODataResponse.FromValueStream(TypeCache, await responseMessage.GetStreamAsync().ConfigureAwait(false), responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.ResourceSet))
                {
                    return(ReadResponse(messageReader.CreateODataResourceSetReader(), responseMessage));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Resource))
                    {
                        return(ReadResponse(messageReader.CreateODataResourceReader(), responseMessage));
                    }
                    else
                    {
                        var property = messageReader.ReadProperty();
                        return(ODataResponse.FromProperty(TypeCache, property.Name, GetPropertyValue(property.Value)));
                    }
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataResourceReader(), responseMessage));
                }
            }
        }
 public async Task<ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage, bool includeResourceTypeInEntryProperties = false)
 {
     var readerSettings = new ODataMessageReaderSettings();
     readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
     using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
     {
         var payloadKind = messageReader.DetectPayloadKind();
         if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
         {
             return ODataResponse.FromStatusCode(responseMessage.StatusCode);
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
         {
             if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
             {
                 throw new NotImplementedException();
             }
             else
             {
                 var text = Utils.StreamToString(await responseMessage.GetStreamAsync());
                 return ODataResponse.FromFeed(new[] { new Dictionary<string, object>()
                 {
                     { FluentCommand.ResultLiteral, text }
                 } });
             }
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
         {
             return await ReadResponse(messageReader.CreateODataBatchReader(), includeResourceTypeInEntryProperties);
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
         {
             return ReadResponse(messageReader.CreateODataFeedReader(), includeResourceTypeInEntryProperties);
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
         {
             return ReadResponse(messageReader.CreateODataCollectionReader(), includeResourceTypeInEntryProperties);
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
         {
             var property = messageReader.ReadProperty();
             return ODataResponse.FromFeed(new[] { new Dictionary<string, object>()
             {
                 { property.Name ?? FluentCommand.ResultLiteral, GetPropertyValue(property.Value) }
             } });
         }
         else
         {
             return ReadResponse(messageReader.CreateODataEntryReader(), includeResourceTypeInEntryProperties);
         }
     }
 }
        /// <inheritdoc />
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            if (messageReader == null)
            {
                throw Error.ArgumentNull("messageReader");
            }

            IEdmTypeReference     edmType     = GetElementType(type, readContext);
            IEdmTypeReference     elementType = edmType.AsCollection().ElementType();
            ODataCollectionReader reader      = messageReader.CreateODataCollectionReader(elementType);

            return(ReadInline(ReadCollection(reader), edmType, readContext));
        }
        public void TestCreateODataCollectionReader_InJsonLight_WithoutTypeReference_Throws()
        {
            // Arrange
            IODataRequestMessage request = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.Throws<ODataException>(() => reader.CreateODataCollectionReader());
            }
        }
        public void TestCreateODataCollectionReader_InJsonLight_WithoutTypeReference_Throws()
        {
            // Arrange
            IODataRequestMessage       request  = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.Throws <ODataException>(() => reader.CreateODataCollectionReader());
            }
        }
Esempio n. 9
0
        public void TestCreateODataCollectionReader_WithTypeReference_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request          = CreateRequest();
            ODataMessageReaderSettings settings         = CreateSettings();
            IEdmModel         model                     = CreateModel();
            IEdmTypeReference expectedItemTypeReference = new EdmPrimitiveTypeReference(
                EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Int32), false);

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                ExceptionAssert.DoesNotThrow(() => reader.CreateODataCollectionReader(expectedItemTypeReference));
            }
        }
        public void TestCreateODataCollectionReader_InJsonLight_WithTypeReference_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request            = CreateJsonLightRequest();
            ODataMessageReaderSettings settings           = CreateSettings();
            IEdmModel           model                     = CreateModel();
            IEdmOperationImport producingOperationImport  = model.EntityContainer.OperationImports().First();
            IEdmTypeReference   expectedItemTypeReference = new EdmPrimitiveTypeReference(
                EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Int32), false);

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.DoesNotThrow(() => reader.CreateODataCollectionReader(expectedItemTypeReference));
            }
        }
        public void TestCreateODataCollectionReader_InJsonLight_WithTypeReference_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage request = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();
            IEdmOperationImport producingOperationImport = model.EntityContainer.OperationImports().First();
            IEdmTypeReference expectedItemTypeReference = new EdmPrimitiveTypeReference(
                EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Int32), false);

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.DoesNotThrow(() => reader.CreateODataCollectionReader(expectedItemTypeReference));
            }
        }
Esempio n. 12
0
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            var readerSettings = new ODataMessageReaderSettings();

            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            readerSettings.ShouldIncludeAnnotation = x => _session.Settings.IncludeAnnotationsInResults;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync(), responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
                {
                    return(ReadResponse(messageReader.CreateODataFeedReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)));
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataEntryReader()));
                }
            }
        }
        private string WriteAndVerifyCollection(StreamResponseMessage responseMessage, ODataCollectionWriter odataWriter,
                                                bool hasModel, string mimeType)
        {
            var collectionStart = new ODataCollectionStart()
            {
                Name = "BackupContactInfo", Count = 12, NextPageLink = new Uri("http://localhost")
            };

            if (!hasModel)
            {
                collectionStart.SetSerializationInfo(new ODataCollectionStartSerializationInfo()
                {
                    CollectionTypeName = "Collection(" + NameSpace + "ContactDetails)"
                });
            }

            odataWriter.WriteStart(collectionStart);
            odataWriter.WriteItem(WritePayloadHelper.CreatePrimaryContactODataComplexValue());
            odataWriter.WriteEnd();

            Stream stream = responseMessage.GetStream();

            if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
            {
                stream.Seek(0, SeekOrigin.Begin);
                var settings = new ODataMessageReaderSettings()
                {
                    BaseUri = this.ServiceUri
                };

                ODataMessageReader    messageReader = new ODataMessageReader(responseMessage, settings, WritePayloadHelper.Model);
                ODataCollectionReader reader        = messageReader.CreateODataCollectionReader(WritePayloadHelper.ContactDetailType);
                bool collectionRead = false;
                while (reader.Read())
                {
                    if (reader.State == ODataCollectionReaderState.CollectionEnd)
                    {
                        collectionRead = true;
                    }
                }

                Assert.IsTrue(collectionRead, "collectionRead");
                Assert.AreEqual(ODataCollectionReaderState.Completed, reader.State);
            }

            return(WritePayloadHelper.ReadStreamContent(stream));
        }
        /// <inheritdoc />
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            if (messageReader == null)
            {
                throw Error.ArgumentNull("messageReader");
            }

            IEdmTypeReference edmType = readContext.GetEdmType(type);
            Contract.Assert(edmType != null);

            if (!edmType.IsCollection())
            {
                throw Error.Argument("type", SRResources.ArgumentMustBeOfType, EdmTypeKind.Collection);
            }

            IEdmCollectionTypeReference collectionType = edmType.AsCollection();
            IEdmTypeReference elementType = collectionType.ElementType();
            ODataCollectionReader reader = messageReader.CreateODataCollectionReader(elementType);
            return ReadInline(ReadCollection(reader), edmType, readContext);
        }
        private ODataCollectionValue ReadCollection(ODataMessageReader messageReader)
        {
            Contract.Assert(messageReader != null);

            ODataCollectionReader reader = messageReader.CreateODataCollectionReader(_edmCollectionType.ElementType());
            ArrayList             items  = new ArrayList();
            string typeName = null;

            while (reader.Read())
            {
                if (ODataCollectionReaderState.Value == reader.State)
                {
                    items.Add(reader.Item);
                }
                else if (ODataCollectionReaderState.CollectionStart == reader.State)
                {
                    typeName = reader.Item.ToString();
                }
            }

            return(new ODataCollectionValue {
                Items = items, TypeName = typeName
            });
        }
        private string WriteAndVerifyCollection(StreamResponseMessage responseMessage, ODataCollectionWriter odataWriter,
                                                bool hasModel, string mimeType)
        {
            var collectionStart = new ODataCollectionStart() { Name = "BackupContactInfo", Count = 12, NextPageLink = new Uri("http://localhost")};
            if (!hasModel)
            {
                collectionStart.SetSerializationInfo(new ODataCollectionStartSerializationInfo()
                {
                    CollectionTypeName = "Collection(" + NameSpace + "ContactDetails)"
                });
            }

            odataWriter.WriteStart(collectionStart);
            odataWriter.WriteItem(WritePayloadHelper.CreatePrimaryContactODataComplexValue());
            odataWriter.WriteEnd();

            Stream stream = responseMessage.GetStream();
            if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
            {
                stream.Seek(0, SeekOrigin.Begin);
                var settings = new ODataMessageReaderSettings() { BaseUri = this.ServiceUri };

                ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, WritePayloadHelper.Model);
                ODataCollectionReader reader = messageReader.CreateODataCollectionReader(WritePayloadHelper.ContactDetailType);
                bool collectionRead = false;
                while (reader.Read())
                {
                    if (reader.State == ODataCollectionReaderState.CollectionEnd)
                    {
                        collectionRead = true;
                    }
                }

                Assert.IsTrue(collectionRead, "collectionRead");
                Assert.AreEqual(ODataCollectionReaderState.Completed, reader.State);
            }

            return WritePayloadHelper.ReadStreamContent(stream);
        }
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
#endif
        {
            var readerSettings = new ODataMessageReaderSettings();

            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind != ODataPayloadKind.Property))
                {
                    _hasResponse = true;
                }

                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
#if SILVERLIGHT
                        var stream = responseMessage.GetStream();
#else
                        var stream = await responseMessage.GetStreamAsync();
#endif
                        return(ODataResponse.FromValueStream(stream, responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
                {
                    return(ReadResponse(messageReader.CreateODataFeedReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    if (property.Value != null && (property.Value.GetType() != typeof(string) || !string.IsNullOrEmpty(property.Value.ToString())))
                    {
                        _hasResponse = true;
                    }

                    if (_hasResponse)
                    {
                        return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)));
                    }
                    else
                    {
                        return(ODataResponse.EmptyFeed);
                    }
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataEntryReader()));
                }
            }
        }
 public async Task<ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
 {
     var readerSettings = new ODataMessageReaderSettings();
     readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
     using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
     {
         var payloadKind = messageReader.DetectPayloadKind();
         if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
         {
             return ODataResponse.FromStatusCode(responseMessage.StatusCode);
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
         {
             if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
             {
                 throw new NotImplementedException();
             }
             else
             {
                 return ODataResponse.FromValueStream(await responseMessage.GetStreamAsync());
             }
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
         {
             return await ReadResponse(messageReader.CreateODataBatchReader());
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
         {
             return ReadResponse(messageReader.CreateODataFeedReader());
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
         {
             return ReadResponse(messageReader.CreateODataCollectionReader());
         }
         else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
         {
             var property = messageReader.ReadProperty();
             return ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value));
         }
         else
         {
             return ReadResponse(messageReader.CreateODataEntryReader());
         }
     }
 }
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            var readerSettings = new ODataMessageReaderSettings();

            if (_session.Settings.IgnoreUnmappedProperties)
            {
                readerSettings.UndeclaredPropertyBehaviorKinds = ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty;
            }
            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            readerSettings.ShouldIncludeAnnotation = x => _session.Settings.IncludeAnnotationsInResults;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind != ODataPayloadKind.Property))
                {
                    _hasResponse = true;
                }

                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        var stream = await responseMessage.GetStreamAsync().ConfigureAwait(false);

                        return(ODataResponse.FromValueStream(stream, responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
                {
                    return(ReadResponse(messageReader.CreateODataFeedReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    if (property.Value != null && (property.Value.GetType() != typeof(string) || !string.IsNullOrEmpty(property.Value.ToString())))
                    {
                        _hasResponse = true;
                    }

                    if (_hasResponse)
                    {
                        return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)));
                    }
                    else
                    {
                        return(ODataResponse.EmptyFeed);
                    }
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataEntryReader()));
                }
            }
        }
        private static ODataCollectionValue ReadCollection(ODataMessageReader messageReader, IEdmTypeReference elementType)
        {
            Contract.Assert(messageReader != null);

            ODataCollectionReader reader = messageReader.CreateODataCollectionReader(elementType);
            ArrayList items = new ArrayList();
            string typeName = null;

            while (reader.Read())
            {
                if (ODataCollectionReaderState.Value == reader.State)
                {
                    items.Add(reader.Item);
                }
                else if (ODataCollectionReaderState.CollectionStart == reader.State)
                {
                    typeName = reader.Item.ToString();
                }
            }

            return new ODataCollectionValue { Items = items, TypeName = typeName };
        }
        public async Task<ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
#endif
        {
            var readerSettings = new ODataMessageReaderSettings();
            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind != ODataPayloadKind.Property))
                    _hasResponse = true;

                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return ODataResponse.FromStatusCode(responseMessage.StatusCode);
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
#if SILVERLIGHT
                        var stream = responseMessage.GetStream();
#else
                        var stream = await responseMessage.GetStreamAsync();
#endif
                        return ODataResponse.FromValueStream(stream);
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return await ReadResponse(messageReader.CreateODataBatchReader());
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
                {
                    return ReadResponse(messageReader.CreateODataFeedReader());
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return ReadResponse(messageReader.CreateODataCollectionReader());
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    if (property.Value != null && (property.Value.GetType() != typeof(string) || !string.IsNullOrEmpty(property.Value.ToString())))
                        _hasResponse = true;

                    if (_hasResponse)
                    {
                        return ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value));
                    }
                    else
                    {
                        return ODataResponse.EmptyFeed;
                    }
                }
                else
                {
                    return ReadResponse(messageReader.CreateODataEntryReader());
                }
            }
        }
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            if (responseMessage.StatusCode == (int)HttpStatusCode.NoContent)
            {
                return(ODataResponse.FromStatusCode(TypeCache, responseMessage.StatusCode, responseMessage.Headers));
            }

            var readerSettings = _session.ToReaderSettings();

            using var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model);
            var payloadKind = messageReader.DetectPayloadKind();

            if (payloadKind.Any(x => x.PayloadKind != ODataPayloadKind.Property))
            {
                _hasResponse = true;
            }

            if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
            {
                return(ODataResponse.FromStatusCode(TypeCache, responseMessage.StatusCode, responseMessage.Headers));
            }
            else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
            {
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    throw new NotImplementedException();
                }
                else
                {
                    var stream = await responseMessage.GetStreamAsync().ConfigureAwait(false);

                    return(ODataResponse.FromValueStream(TypeCache, stream, responseMessage is ODataBatchOperationResponseMessage));
                }
            }
            else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
            {
                return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false));
            }
            else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed))
            {
                return(ReadResponse(messageReader.CreateODataFeedReader(), responseMessage));
            }
            else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
            {
                return(ReadResponse(messageReader.CreateODataCollectionReader()));
            }
            else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
            {
                var property = messageReader.ReadProperty();
                if (property.Value != null && (property.Value.GetType() != typeof(string) || !string.IsNullOrEmpty(property.Value.ToString())))
                {
                    _hasResponse = true;
                }

                if (_hasResponse)
                {
                    return(ODataResponse.FromProperty(TypeCache, property.Name, GetPropertyValue(property.Value)));
                }
                else
                {
                    return(ODataResponse.EmptyFeeds(TypeCache));
                }
            }
            else
            {
                return(ReadResponse(messageReader.CreateODataEntryReader(), responseMessage));
            }
        }