Esempio n. 1
0
        public void QueryWithFilterTime()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Orders?$filter=ShipTime eq 12:40:5.05", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                // Verify Date Property
                                Assert.AreEqual(new Date(2014, 8, 31), entry.Properties.Single(p => p.Name == "ShipDate").Value);
                                Assert.AreEqual(new TimeOfDay(12, 40, 5, 50), entry.Properties.Single(p => p.Name == "ShipTime").Value);
                            }
                        }
                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
Esempio n. 2
0
        public static IEnumerable <ODataEntry> ReadODataFeed(IEdmModel model, Stream stream)
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceRootUri
            };
            var responseMessage = new ODataResponseMessage(stream);

            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model))
            {
                List <ODataEntry> entries = new List <ODataEntry>();
                var reader = messageReader.CreateODataFeedReader();

                while (reader.Read())
                {
                    switch (reader.State)
                    {
                    case ODataReaderState.EntryEnd:
                        ODataEntry entry = reader.Item as ODataEntry;
                        entries.Add(entry);
                        yield return(entry);

                        break;

                    default:
                        break;
                    }
                }
            }
        }
Esempio n. 3
0
        public void QueryEntitySet()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Customers", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);

                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.IsNotNull(entry.Properties.Single(p => p.Name == "TimeBetweenLastTwoOrders").Value);
                            }
                        }
                    }
                }
            }
        }
        public List<ODataEntry> QueryFeed(string requestUri, string mimeType)
        {
            List<ODataEntry> entries = new List<ODataEntry>();

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri };
            var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute));
            requestMessage.SetHeader("Accept", mimeType);
            var responseMessage = requestMessage.GetResponse();
            Assert.AreEqual(200, responseMessage.StatusCode);

            if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
            {
                using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model))
                {
                    var reader = messageReader.CreateODataFeedReader();

                    while (reader.Read())
                    {
                        if (reader.State == ODataReaderState.EntryEnd)
                        {
                            ODataEntry entry = reader.Item as ODataEntry;
                            entries.Add(entry);
                        }
                        else if (reader.State == ODataReaderState.FeedEnd)
                        {
                            Assert.IsNotNull(reader.Item as ODataFeed);
                        }
                    }

                    Assert.AreEqual(ODataReaderState.Completed, reader.State);
                }
            }
            return entries;
        }
Esempio n. 5
0
        /// <summary>
        /// Creates an OData reader to read OData feed download response.
        /// </summary>
        /// <param name="reader">The message reader containing current OData feed download response.</param>
        /// <returns>an OData reader to read OData feed download response</returns>
        private ODataReader CreateReader(ODataMessageReader reader)
        {
            ODataReader resultReader = null;

            resultReader = reader.CreateODataFeedReader();
            return(resultReader);
        }
Esempio n. 6
0
        public void QueryWithFormat()
        {
            Dictionary <string, string> testCases = new Dictionary <string, string>()
            {
                { "People?$format=application/json", "application/json" },
                // ODL Bug: https://github.com/OData/odata.net/issues/313
                ////{"People?$format=application/json;odata.metadata=full", "application/json; odata.metadata=full"},
                { "People?$format=json", "application/json" },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri,
                UndeclaredPropertyBehaviorKinds = ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty
            };

            foreach (var testCase in testCases)
            {
                DataServiceClientRequestMessageArgs args = new DataServiceClientRequestMessageArgs(
                    "GET",
                    new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute),
                    false, false, new Dictionary <string, string>()
                {
                });

                var requestMessage = new HttpWebRequestMessage(args);
                using (var responseMessage = requestMessage.GetResponse() as HttpWebResponseMessage)
                {
                    Assert.Equal(200, responseMessage.StatusCode);

                    string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value;
                    Assert.True(contentType.StartsWith(testCase.Value));

                    using (var messageReader = new ODataMessageReader(
                               responseMessage,
                               readerSettings,
                               this.TestClientContext.Format.LoadServiceModel()))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.NotNull(entry.Properties.Single(p => p.Name == "PersonId").Value);
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                Assert.NotNull(reader.Item as ODataFeed);
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
Esempio n. 7
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));
                }
            }
        }
            private void CreateAndReadUnlimitedResponseMessageWithFeed(string startingString, string cycleString)
            {
                var responseMessage = new ODataUnlimitedResponseMessage(startingString, cycleString);

                responseMessage.SetHeader("Content-Type", "application/atom+xml");
                responseMessage.SetHeader("DataServiceVersion", "3.0");

                var readLimitReached = false;

                try
                {
                    using (var messageReader = new ODataMessageReader(responseMessage))
                    {
                        var feedReader = messageReader.CreateODataFeedReader();
                        while (feedReader.Read())
                        {
                            switch (feedReader.State)
                            {
                            case ODataReaderState.FeedStart:
                                Console.WriteLine("FeedStart: " + (ODataFeed)feedReader.Item);
                                break;

                            case ODataReaderState.FeedEnd:
                                Console.WriteLine("FeedEnd: " + (ODataFeed)feedReader.Item);
                                break;

                            case ODataReaderState.EntryStart:
                                Console.WriteLine("EntryStart: " + (ODataEntry)feedReader.Item);
                                break;

                            case ODataReaderState.EntryEnd:
                                Console.WriteLine("EntryEnd: " + (ODataEntry)feedReader.Item);
                                break;

                            default:
                                Console.WriteLine("ODataItem: " + feedReader.Item);
                                break;
                            }
                        }
                    }
                }
                catch (ODataException ex)
                {
                    if (ex.Message.StartsWith("The maximum number of bytes allowed to be read from the stream has been exceeded."))
                    {
                        readLimitReached = true;
                    }
                    else
                    {
                        throw;
                    }
                }

                if (!readLimitReached)
                {
                    throw new InvalidOperationException("Expecting exception, but it was not thrown.");
                }
            }
        public void QueryAvroFeed()
        {
            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products", UriKind.Absolute));

            requestMessage.SetHeader("Accept", "avro/binary");
            var responseMessage = requestMessage.GetResponse();

            Assert.AreEqual(200, responseMessage.StatusCode);

            IList <ODataEntry> entries = new List <ODataEntry>();

            using (var messageReader = new ODataMessageReader(responseMessage, GetAvroReaderSettings(), Model))
            {
                var reader = messageReader.CreateODataFeedReader();
                while (reader.Read())
                {
                    if (reader.State == ODataReaderState.EntryEnd)
                    {
                        entries.Add((ODataEntry)reader.Item);
                    }
                }
            }

            Assert.AreEqual(3, entries.Count);
            ODataEntry product2 = new ODataEntry
            {
                Properties = new[]
                {
                    new ODataProperty {
                        Name = "Id", Value = 2
                    },
                    new ODataProperty {
                        Name = "Name", Value = "Banana"
                    },
                    new ODataProperty
                    {
                        Name  = "Info",
                        Value = new ODataComplexValue()
                        {
                            Properties = new []
                            {
                                new ODataProperty {
                                    Name = "Site", Value = "G2"
                                },
                                new ODataProperty {
                                    Name = "Serial", Value = 1023L
                                },
                            }
                        }
                    },
                },
            };

            Assert.IsTrue(TestHelper.EntryEqual(product2, entries[1]));
        }
        internal static ResultSegment <TElement> TableQueryPostProcessGeneric <TElement, TQueryType>(Stream responseStream, Func <string, string, DateTimeOffset, IDictionary <string, EntityProperty>, string, TElement> resolver, HttpWebResponse resp, TableRequestOptions options, OperationContext ctx, string accountName)
        {
            ResultSegment <TElement> retSeg = new ResultSegment <TElement>(new List <TElement>());

            retSeg.ContinuationToken = ContinuationFromResponse(resp);

            if (resp.ContentType.Contains(Constants.JsonNoMetadataAcceptHeaderValue))
            {
                ReadQueryResponseUsingJsonParser(retSeg, responseStream, resp.Headers[Constants.HeaderConstants.EtagHeader], resolver, options.PropertyResolver, typeof(TQueryType), null, options);
            }
            else
            {
                ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings();
                readerSettings.MessageQuotas = new ODataMessageQuotas()
                {
                    MaxPartsPerBatch = TableConstants.TableServiceMaxResults, MaxReceivedMessageSize = TableConstants.TableServiceMaxPayload
                };

                using (ODataMessageReader responseReader = new ODataMessageReader(new HttpResponseAdapterMessage(resp, responseStream), readerSettings, new TableStorageModel(accountName)))
                {
                    // create a reader
                    ODataReader reader = responseReader.CreateODataFeedReader();

                    // Start => FeedStart
                    if (reader.State == ODataReaderState.Start)
                    {
                        reader.Read();
                    }

                    // Feedstart
                    if (reader.State == ODataReaderState.FeedStart)
                    {
                        reader.Read();
                    }

                    while (reader.State == ODataReaderState.EntryStart)
                    {
                        // EntryStart => EntryEnd
                        reader.Read();

                        ODataEntry entry = (ODataEntry)reader.Item;

                        retSeg.Results.Add(ReadAndResolve(entry, resolver, options));

                        // Entry End => ?
                        reader.Read();
                    }

                    DrainODataReader(reader);
                }
            }

            Logger.LogInformational(ctx, SR.RetrieveWithContinuationToken, retSeg.Results.Count, retSeg.ContinuationToken);
            return(retSeg);
        }
        internal static Task <TableQuerySegment> TableQueryPostProcess(Stream responseStream, HttpResponseMessage resp, Exception ex, OperationContext ctx)
        {
            return(Task.Run(() =>
            {
                TableQuerySegment retSeg = new TableQuerySegment();
                retSeg.ContinuationToken = ContinuationFromResponse(resp);

                ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
                {
                    DisablePrimitiveTypeConversion = true
                };
                readerSettings.MessageQuotas = new ODataMessageQuotas()
                {
                    MaxPartsPerBatch = TableConstants.TableServiceMaxResults, MaxReceivedMessageSize = TableConstants.TableServiceMaxPayload
                };

                using (ODataMessageReader responseReader = new ODataMessageReader(new HttpResponseAdapterMessage(resp, responseStream), readerSettings))
                {
                    // create a reader
                    ODataReader reader = responseReader.CreateODataFeedReader();

                    // Start => FeedStart
                    if (reader.State == ODataReaderState.Start)
                    {
                        reader.Read();
                    }

                    // Feedstart
                    if (reader.State == ODataReaderState.FeedStart)
                    {
                        reader.Read();
                    }

                    while (reader.State == ODataReaderState.EntryStart)
                    {
                        // EntryStart => EntryEnd
                        reader.Read();

                        ODataEntry entry = (ODataEntry)reader.Item;

                        DynamicTableEntity retEntity = new DynamicTableEntity();
                        ReadAndUpdateTableEntity(retEntity, entry, EntityReadFlags.All, ctx);
                        retSeg.Results.Add(retEntity);

                        // Entry End => ?
                        reader.Read();
                    }

                    DrainODataReader(reader);
                }

                return retSeg;
            }));
        }
Esempio n. 12
0
        /// <summary>
        /// Read the response message and perform given verifications
        /// </summary>
        /// <param name="isFeed">Whether the response has a feed</param>
        /// <param name="responseMessage">The response message</param>
        /// <param name="expectedSet">Expected IEdmEntitySet</param>
        /// <param name="expectedType">Expected IEdmEntityType</param>
        /// <param name="verifyFeed">Action to verify the feed</param>
        /// <param name="verifyEntry">Action to verify the entry</param>
        /// <param name="verifyNavigation">Action to verify the navigation</param>
        public static void ReadAndVerifyFeedEntryMessage(bool isFeed, StreamResponseMessage responseMessage,
                                                         IEdmEntitySet expectedSet, IEdmEntityType expectedType,
                                                         Action <ODataFeed> verifyFeed, Action <ODataEntry> verifyEntry,
                                                         Action <ODataNavigationLink> verifyNavigation)
        {
            var settings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceUri
            };

            settings.ShouldIncludeAnnotation = s => true;
            ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, Model);
            ODataReader        reader        = isFeed
                                     ? messageReader.CreateODataFeedReader(expectedSet, expectedType)
                                     : messageReader.CreateODataEntryReader(expectedSet, expectedType);

            while (reader.Read())
            {
                switch (reader.State)
                {
                case ODataReaderState.FeedEnd:
                {
                    if (verifyFeed != null)
                    {
                        verifyFeed((ODataFeed)reader.Item);
                    }

                    break;
                }

                case ODataReaderState.EntryEnd:
                {
                    if (verifyEntry != null)
                    {
                        verifyEntry((ODataEntry)reader.Item);
                    }

                    break;
                }

                case ODataReaderState.NavigationLinkEnd:
                {
                    if (verifyNavigation != null)
                    {
                        verifyNavigation((ODataNavigationLink)reader.Item);
                    }

                    break;
                }
                }
            }

            Assert.AreEqual(ODataReaderState.Completed, reader.State);
        }
Esempio n. 13
0
        /// <summary>
        /// Creates and Wraps an ODataReader for feeds or entries.
        /// </summary>
        /// <param name="messageReader">The message reader.</param>
        /// <param name="messageType">The message type.</param>
        /// <param name="expectedType">The expected EDM type.</param>
        /// <param name="responsePipeline">The data service response pipeling configuration object.</param>
        /// <returns>A reader.</returns>
        internal static ODataReaderWrapper Create(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceClientResponsePipelineConfiguration responsePipeline)
        {
            IEdmEntityType entityType = expectedType as IEdmEntityType;

            if (messageType == ODataPayloadKind.Entry)
            {
                return(new ODataReaderWrapper(messageReader.CreateODataEntryReader(entityType), responsePipeline));
            }

            return(new ODataReaderWrapper(messageReader.CreateODataFeedReader(entityType), responsePipeline));
        }
 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);
         }
     }
 }
        public void TestCreateODataFeedReader_InJsonLight_WithoutEntitySetOrType_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.CreateODataFeedReader());
            }
        }
        public void QueryWithSelect()
        {
            Dictionary <string, int> testCases = new Dictionary <string, int>()
            {
                { "Customers?$select=PersonID,FirstName", 2 },
                { "Customers?$select=*", 12 },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var testCase in testCases)
            {
                foreach (var mimeType in mimeTypes)
                {
                    var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                    requestMessage.SetHeader("Accept", mimeType);
                    var responseMessage = requestMessage.GetResponse();
                    Assert.AreEqual(200, responseMessage.StatusCode);

                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                        {
                            var reader = messageReader.CreateODataFeedReader();
                            int count  = 0;
                            while (reader.Read())
                            {
                                if (reader.State == ODataReaderState.EntryEnd)
                                {
                                    ODataEntry entry = reader.Item as ODataEntry;
                                    Assert.IsNotNull(entry.Properties.Single(p => p.Name == "PersonID").Value);
                                    Assert.IsNotNull(entry.Properties.Single(p => p.Name == "FirstName").Value);
                                    Assert.AreEqual(testCase.Value, entry.Properties.Count());
                                    count++;
                                }
                                else if (reader.State == ODataReaderState.FeedEnd)
                                {
                                    Assert.IsNotNull(reader.Item as ODataFeed);
                                }
                            }

                            Assert.AreEqual(ODataReaderState.Completed, reader.State);
                            Assert.IsTrue(count > 0, "No entry is returned.");
                        }
                    }
                }
            }
        }
        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.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.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()));
                }
            }
        }
Esempio n. 18
0
        protected static ODataReader CreateODataReader(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceProtocolVersion protocolVersion)
        {
            if (expectedType != null)
            {
                ClientEdmModel.GetModel(protocolVersion).GetClientTypeAnnotation(expectedType).EnsureEPMLoaded();
            }
            IEdmEntityType expectedEntityType = expectedType as IEdmEntityType;

            if (messageType == ODataPayloadKind.Entry)
            {
                return(messageReader.CreateODataEntryReader(expectedEntityType));
            }
            return(messageReader.CreateODataFeedReader(expectedEntityType));
        }
        public void TestCreateODataFeedReader_InJsonLight_WithEntityTypeButWithoutSet_Throws()
        {
            // Arrange
            IODataRequestMessage       request  = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel      model      = CreateModel();
            IEdmEntityType entityType = model.EntityContainer.EntitySets().First().EntityType();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.Throws <ODataException>(() => reader.CreateODataFeedReader(entityType));
            }
        }
        public void TestCreateODataFeedReader_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request  = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel     model     = CreateModel();
            IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.DoesNotThrow(() => reader.CreateODataFeedReader(entitySet, null));
            }
        }
        private void PrimitiveValueInFilterInURL(string filterQuery)
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = this.ServiceUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new Microsoft.Test.OData.Tests.Client.Common.HttpWebRequestMessage(new Uri(this.ServiceUri.AbsoluteUri + filterQuery, UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, RetrieveServiceEdmModel()))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                string pattern = filterQuery.Substring(0, filterQuery.IndexOf("?")) + @"\(" + dataPattern + @"\)$";
                                Regex  rgx     = new Regex(pattern, RegexOptions.IgnoreCase);

                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.IsTrue(rgx.Match(entry.Id.ToString()).Success, "Expected : Entry's Id doesn't contain trailing when Key is Int64/float/double/decimal");
                                if (mimeType.Equals(MimeTypes.ApplicationJson + MimeTypes.ODataParameterFullMetadata))
                                {
                                    Assert.IsTrue(rgx.Match(entry.EditLink.ToString()).Success, "Expected : Entry's EditLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                    Assert.IsTrue(rgx.Match(entry.ReadLink.ToString()).Success, "Expected : Entry's ReadLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                }
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                //TODO: Nextlink is appened by data service. So whether L|F|D|M could be returned in nextLink
                                var       pattern = filterQuery.Substring(0, filterQuery.IndexOf("?")) + @"\?\$filter=Id\sge\s" + dataPattern + @"(L|F|D|M)?&\$skiptoken=\d+$";
                                Regex     rgx     = new Regex(pattern, RegexOptions.IgnoreCase);
                                ODataFeed feed    = reader.Item as ODataFeed;
                                Assert.IsTrue(rgx.Match(feed.NextPageLink.ToString()).Success, "Expected : Feed's NextLink doesn't contain trailing when Key is Int64/float/double/decimal");
                            }
                        }
                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        internal static Task <ResultSegment <TElement> > TableQueryPostProcessGeneric <TElement>(Stream responseStream, Func <string, string, DateTimeOffset, IDictionary <string, EntityProperty>, string, TElement> resolver, HttpResponseMessage resp, OperationContext ctx)
        {
            return(Task.Run(() =>
            {
                ResultSegment <TElement> retSeg = new ResultSegment <TElement>(new List <TElement>());
                retSeg.ContinuationToken = ContinuationFromResponse(resp);

                ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings();
                readerSettings.MessageQuotas = new ODataMessageQuotas()
                {
                    MaxPartsPerBatch = TableConstants.TableServiceMaxResults, MaxReceivedMessageSize = TableConstants.TableServiceMaxPayload
                };

                using (ODataMessageReader responseReader = new ODataMessageReader(new HttpResponseAdapterMessage(resp, responseStream), readerSettings))
                {
                    // create a reader
                    ODataReader reader = responseReader.CreateODataFeedReader();

                    // Start => FeedStart
                    if (reader.State == ODataReaderState.Start)
                    {
                        reader.Read();
                    }

                    // Feedstart
                    if (reader.State == ODataReaderState.FeedStart)
                    {
                        reader.Read();
                    }

                    while (reader.State == ODataReaderState.EntryStart)
                    {
                        // EntryStart => EntryEnd
                        reader.Read();

                        ODataEntry entry = (ODataEntry)reader.Item;

                        retSeg.Results.Add(ReadAndResolve(entry, resolver));

                        // Entry End => ?
                        reader.Read();
                    }

                    DrainODataReader(reader);
                }

                return retSeg;
            }));
        }
Esempio n. 23
0
        /// <summary>
        /// Read the response message and perform given verifications
        /// </summary>
        /// <param name="isFeed">Whether the response has a feed</param>
        /// <param name="responseMessage">The response message</param>
        /// <param name="expectedSet">Expected IEdmEntitySet</param>
        /// <param name="expectedType">Expected IEdmEntityType</param>
        /// <param name="verifyFeed">Action to verify the feed</param>
        /// <param name="verifyEntry">Action to verify the entry</param>
        /// <param name="verifyNavigation">Action to verify the navigation</param>
        public static void ReadAndVerifyFeedEntryMessage(bool isFeed, StreamResponseMessage responseMessage,
                                   IEdmEntitySet expectedSet, IEdmEntityType expectedType,
                                   Action<ODataFeed> verifyFeed, Action<ODataEntry> verifyEntry,
                                   Action<ODataNavigationLink> verifyNavigation)
        {
            var settings = new ODataMessageReaderSettings() { BaseUri = ServiceUri };
            settings.ShouldIncludeAnnotation = s => true;
            ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, Model);
            ODataReader reader = isFeed
                                     ? messageReader.CreateODataFeedReader(expectedSet, expectedType)
                                     : messageReader.CreateODataEntryReader(expectedSet, expectedType);
            while (reader.Read())
            {
                switch (reader.State)
                {
                    case ODataReaderState.FeedEnd:
                        {
                            if (verifyFeed != null)
                            {
                                verifyFeed((ODataFeed)reader.Item);
                            }

                            break;
                        }
                    case ODataReaderState.EntryEnd:
                        {
                            if (verifyEntry != null)
                            {
                                verifyEntry((ODataEntry)reader.Item);
                            }

                            break;
                        }
                    case ODataReaderState.NavigationLinkEnd:
                        {
                            if (verifyNavigation != null)
                            {
                                verifyNavigation((ODataNavigationLink)reader.Item);
                            }

                            break;
                        }
                }
            }

            Assert.AreEqual(ODataReaderState.Completed, reader.State);
        }
Esempio n. 24
0
            internal static object ConvertFeed(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext)
            {
                IEdmCollectionTypeReference collectionType = edmTypeReference.AsCollection();

                EdmEntitySet tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp",
                                                              collectionType.ElementType().AsEntity().EntityDefinition());

                ODataReader odataReader = oDataMessageReader.CreateODataFeedReader(tempEntitySet,
                                                                                   collectionType.ElementType().AsEntity().EntityDefinition());
                ODataFeedWithEntries feed =
                    ODataEntityDeserializer.ReadEntryOrFeed(odataReader) as ODataFeedWithEntries;

                ODataFeedDeserializer feedDeserializer =
                    (ODataFeedDeserializer)DeserializerProvider.GetEdmTypeDeserializer(collectionType);

                object      result     = feedDeserializer.ReadInline(feed, collectionType, readContext);
                IEnumerable enumerable = result as IEnumerable;

                if (enumerable != null)
                {
                    IEnumerable newEnumerable = CovertFeedIds(enumerable, feed, collectionType, readContext);
                    if (readContext.IsUntyped)
                    {
                        EdmEntityObjectCollection entityCollection =
                            new EdmEntityObjectCollection(collectionType);
                        foreach (EdmEntityObject entity in newEnumerable)
                        {
                            entityCollection.Add(entity);
                        }

                        return(entityCollection);
                    }
                    else
                    {
                        IEdmTypeReference elementTypeReference = collectionType.ElementType();

                        Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference,
                                                                       readContext.Model);
                        IEnumerable castedResult =
                            CastMethodInfo.MakeGenericMethod(elementClrType)
                            .Invoke(null, new object[] { newEnumerable }) as IEnumerable;
                        return(castedResult);
                    }
                }

                return(null);
            }
        public void QueryEntitySet()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataEntry> entries = new List <ODataEntry>();
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.IsNotNull(entry);
                                entries.Add(entry);
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                Assert.IsNotNull(reader.Item as ODataFeed);
                            }
                        }

                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                        Assert.AreEqual(5, entries.Count);

                        ODataEnumValue skinColor  = (ODataEnumValue)entries[1].Properties.Single(p => p.Name == "SkinColor").Value;
                        ODataEnumValue userAccess = (ODataEnumValue)entries[1].Properties.Single(p => p.Name == "UserAccess").Value;
                        Assert.AreEqual("Blue", skinColor.Value);
                        Assert.AreEqual("ReadWrite", userAccess.Value);
                    }
                }
            }
        }
Esempio n. 26
0
        public override object Read(ODataMessageReader messageReader, ODataDeserializerContext readContext)
        {
            if (messageReader == null)
            {
                throw Error.ArgumentNull("messageReader");
            }

            if (readContext == null)
            {
                throw Error.ArgumentNull("readContext");
            }

            ODataReader reader = messageReader.CreateODataFeedReader(_edmEntityType.EntityDefinition());
            ODataFeed   feed   = ODataEntityDeserializer.ReadEntryOrFeed(reader, readContext) as ODataFeed;

            return(ReadInline(feed, readContext));
        }
Esempio n. 27
0
        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 void QueryWithFormat()
        {
            Dictionary <string, string> testCases = new Dictionary <string, string>()
            {
                //{"Customers?$format=application/atom%2Bxml", "application/atom+xml"},
                { "Customers?$format=application/json", "application/json" },
                { "Customers?$format=application/json;odata.metadata=full", "application/json;odata.metadata=full" },
                { "Customers?$format=json", "application/json" },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var testCase in testCases)
            {
                var requestMessage  = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value;
                Assert.IsTrue(contentType.StartsWith(testCase.Value));

                using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                {
                    var reader = messageReader.CreateODataFeedReader();

                    while (reader.Read())
                    {
                        if (reader.State == ODataReaderState.EntryEnd)
                        {
                            ODataEntry entry = reader.Item as ODataEntry;
                            Assert.IsNotNull(entry.Properties.Single(p => p.Name == "PersonID").Value);
                        }
                        else if (reader.State == ODataReaderState.FeedEnd)
                        {
                            Assert.IsNotNull(reader.Item as ODataFeed);
                        }
                    }

                    Assert.AreEqual(ODataReaderState.Completed, reader.State);
                }
            }
        }
Esempio n. 29
0
 private void ReadFeedPayload(string payload, Action <ODataReader> action, bool isResponse = true, ODataVersion maxProtocolVersion = ODataVersion.V4)
 {
     if (isResponse)
     {
         IODataResponseMessage message = new InMemoryMessage()
         {
             Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)), StatusCode = 200
         };
         message.SetHeader("Content-Type", "application/atom+xml;type=feed");
         ODataMessageReaderSettings settings = new ODataMessageReaderSettings()
         {
             MaxProtocolVersion = maxProtocolVersion,
             EnableAtom         = true
         };
         using (var msgReader = new ODataMessageReader(message, settings))
         {
             var reader = msgReader.CreateODataFeedReader();
             while (reader.Read())
             {
                 action(reader);
             }
         }
     }
     else
     {
         IODataRequestMessage message = new InMemoryMessage()
         {
             Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)), Method = "GET"
         };
         message.SetHeader("Content-Type", "application/atom+xml;type=feed");
         ODataMessageReaderSettings settings = new ODataMessageReaderSettings()
         {
             MaxProtocolVersion = maxProtocolVersion,
             EnableAtom         = true
         };
         using (var msgReader = new ODataMessageReader(message, settings))
         {
             var reader = msgReader.CreateODataFeedReader();
             while (reader.Read())
             {
                 action(reader);
             }
         }
     }
 }
Esempio n. 30
0
        private static ODataResult GetODataResult(ODataMessageReader messageReader)
        {
            List <ODataPayloadKindDetectionResult> payloadKinds = messageReader.DetectPayloadKind().ToList();

            if (payloadKinds.Count > 0)
            {
                switch (payloadKinds[0].PayloadKind)
                {
                case ODataPayloadKind.Feed:
                    return(new FeedODataResult(messageReader.CreateODataFeedReader()));

                case ODataPayloadKind.Entry:
                    return(new FeedODataResult(messageReader.CreateODataEntryReader()));
                }
                throw new InvalidOperationException("unsupported payload kind " + payloadKinds[0].PayloadKind);
            }
            throw new InvalidOperationException("unknown payload kind");
        }
        private void ReadFeedPayload(string payload, Action <ODataReader> action)
        {
            var message = new InMemoryMessage()
            {
                Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload))
            };

            message.SetHeader("Content-Type", "application/atom+xml;type=feed");
            message.PreferenceAppliedHeader().AnnotationFilter = "*";
            using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, atomReaderSettings))
            {
                var reader = msgReader.CreateODataFeedReader();
                while (reader.Read())
                {
                    action(reader);
                }
            }
        }
        public void QueryEntitiesOrderByEnumProperty()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products?$orderby=SkinColor", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataEntry> entries = new List <ODataEntry>();
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.IsNotNull(entry);
                                entries.Add(entry);
                            }
                        }

                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                        Assert.AreEqual(5, entries.Count);

                        Assert.AreEqual(5, entries[0].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.AreEqual(7, entries[1].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.AreEqual(8, entries[2].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.AreEqual(9, entries[3].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.AreEqual(6, entries[4].Properties.Single(p => p.Name == "ProductID").Value);
                    }
                }
            }
        }
        public void ModelReferneceWithFilterOption()
        {
            Dictionary <string, int> testCases = new Dictionary <string, int>()
            {
                { "VehicleGPSSet?$filter=VehicleSpeed gt 90", 3 },
                { "DerivedVehicleGPSSet?$filter=DisplayName eq 'DisplayName4'", 1 },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var testCase in testCases)
            {
                foreach (var mimeType in mimeTypes)
                {
                    var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                    requestMessage.SetHeader("Accept", mimeType);
                    var responseMessage = requestMessage.GetResponse();
                    Assert.AreEqual(200, responseMessage.StatusCode);

                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                        {
                            List <ODataEntry> entries = new List <ODataEntry>();

                            var reader = messageReader.CreateODataFeedReader();
                            while (reader.Read())
                            {
                                if (reader.State == ODataReaderState.EntryEnd)
                                {
                                    entries.Add(reader.Item as ODataEntry);
                                }
                            }
                            Assert.AreEqual(ODataReaderState.Completed, reader.State);
                            Assert.AreEqual(testCase.Value, entries.Count);
                        }
                    }
                }
            }
        }
        public static List<CustomInstanceAnnotationsDescriptor> ReadFeedOrEntry(bool isFeed, Uri uri, string contentType, ODataMessageReaderSettings readerSettings, IEdmModel model)
        {
            var annotationsStack = new Stack<CustomInstanceAnnotationsDescriptor>();
            var allAnnotations = new List<CustomInstanceAnnotationsDescriptor>();

            var responseMessage = GetResponseMessge(uri, contentType);
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model))
            {
                var reader = isFeed ? messageReader.CreateODataFeedReader() : messageReader.CreateODataEntryReader();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.FeedStart:
                        case ODataReaderState.EntryStart:
                            {
                                var instanceAnnotations = GetItemInstanceAnnotations(reader);
                                var parent = annotationsStack.Count == 0 ? null : annotationsStack.Peek();
                                var current = new CustomInstanceAnnotationsDescriptor { TypeOfAnnotatedItem = reader.Item.GetType(), Parent = parent, AnnotationsOnStart = instanceAnnotations };
                                annotationsStack.Push(current);
                                allAnnotations.Add(current);
                                break;
                            }

                        case ODataReaderState.FeedEnd:
                        case ODataReaderState.EntryEnd:
                            {
                                var instanceAnnotations = GetItemInstanceAnnotations(reader);
                                var current = annotationsStack.Pop();
                                current.AnnotationsOnEnd = instanceAnnotations;
                                break;
                            }
                    }
                }
            }

            return allAnnotations;
        }
        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)
 {
     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 void ReadFeedWithActionAndFunctionTest()
        {
            string payload = "{\"" +
                                                "@odata.context\":\"http://example.org/odata.svc/$metadata#EntitySet\"," +
                                                "\"#Namespace.Action\":{" +
                                                        "\"title\":\"ActionTitle\"," +
                                                        "\"target\":\"http://example.org/odata.svc/DoAction\"" +
                                                    "}," +
                                                    "\"#Namespace.Function\":{" +
                                                        "\"title\":\"FunctionTitle\"," +
                                                        "\"target\":\"http://example.org/odata.svc/DoFunction\"" +
                                                    "}," +
                                                "\"value\":[" +
                                                    "{" +
                                                         "\"ID\":101,\"Name\":\"Alice\"" +
                                                    "}" +
                                                    "]" +
                                            "}";
            InMemoryMessage message = new InMemoryMessage();
            message.SetHeader("Content-Type", "application/json;odata.metadata=minimal");
            message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));
            List<ODataFeed> feedList = new List<ODataFeed>();

            using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, ModelWithFunction))
            {
                messageReader.DetectPayloadKind().Single().PayloadKind.Should().Be(ODataPayloadKind.Feed);

                var reader = messageReader.CreateODataFeedReader();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.FeedEnd:
                            feedList.Add(reader.Item as ODataFeed);
                            break;
                    }
                }
            }

            ODataFeed feed = feedList[0];
            feed.Actions.Count().Should().Be(1);
            feed.Functions.Count().Should().Be(1);
        }
        public void ReadingNestedInlinecountTest()
        {
            string payload = "{" +
                                "\"@odata.context\":\"http://example.org/odata.svc/$metadata#EntitySet\"," +
                                "\"value\":[" +
                                    "{" +
                                        "\"ID\":101,\"Name\":\"Alice\"," +
                                        "\"[email protected]\":\"http://example.org/odata.svc/$metadata#EntitySet(101)/ContainedCollectionNavProp\"," +
                                        "\"[email protected]\":\"http://example.org/odata.svc/navigation\"," +
                                        "\"[email protected]\":1900," +
                                        "\"ContainedCollectionNavProp\":[]" +
                                    "}" +
                                "]" +
                            "}";
            InMemoryMessage message = new InMemoryMessage();
            message.SetHeader("Content-Type", "application/json;odata.metadata=minimal");
            message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));
            List<ODataFeed> feedList = new List<ODataFeed>();

            using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model))
            {
                var reader = messageReader.CreateODataFeedReader();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.FeedEnd:
                            feedList.Add(reader.Item as ODataFeed);
                            break;
                    }
                }
            }

            ODataFeed innerFeed = feedList[0];
            innerFeed.Count.Should().Be(1900);
            ODataFeed topFeed = feedList[1];
            topFeed.Count.Should().Be(null);
        }
        public void ReadingInMinialMetadataModeWithContainedElementShouldBeAbleToGenerateId()
        {
            const string payload =
                "{" +
                    "\"@odata.context\":\"http://example.com/$metadata#EntitySet(ContainedNavProp2,ExpandedNavLink,ExpandedNavLink(ContainedNavProp2))\"," +
                    "\"value\":[" +
                    "{" +
                        "\"[email protected]\":\"http://example.com/$metadata#EntitySet(123)/ContainedNonCollectionNavProp/$entity\"," +
                        "\"ContainedNonCollectionNavProp\":" +
                        "{" +
                            "\"ID\": 234," +
                            "\"Name\":\"Foo\"" +
                        "}," +
                    "\"ID\" : 123," +
                    "\"Name\" : \"Bob\"" +
                "} ] }";

            InMemoryMessage message = new InMemoryMessage();
            message.SetHeader("Content-Type", "application/json;odata.metadata=mini");
            message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));

            ODataEntry topLevelEntry = null;
            List<ODataEntry> entryList = new List<ODataEntry>();

            using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model))
            {
                var reader = messageReader.CreateODataFeedReader(EntitySet, EntityType);
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.EntryEnd:
                            topLevelEntry = (ODataEntry)reader.Item;
                            entryList.Add(topLevelEntry);
                            break;
                    }
                }
            }

            Uri containedId = new Uri("http://example.com/EntitySet(123)/ContainedNonCollectionNavProp");

            ODataEntry containedEntry = entryList[0];
            containedEntry.Id.Should().Be(containedId);
        }
        public void TestCreateODataFeedReader_InJsonLight_WithoutEntitySetOrType_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.CreateODataFeedReader());
            }
        }
Esempio n. 41
0
        /// <summary>
        /// Creates and Wraps an ODataReader for feeds or entries.
        /// </summary>
        /// <param name="messageReader">The message reader.</param>
        /// <param name="messageType">The message type.</param>
        /// <param name="expectedType">The expected EDM type.</param>
        /// <param name="responsePipeline">The data service response pipeling configuration object.</param>
        /// <returns>A reader.</returns>
        internal static ODataReaderWrapper Create(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceClientResponsePipelineConfiguration responsePipeline)
        {
            IEdmEntityType entityType = expectedType as IEdmEntityType;
            if (messageType == ODataPayloadKind.Entry)
            {
                return new ODataReaderWrapper(messageReader.CreateODataEntryReader(entityType), responsePipeline);
            }

            return new ODataReaderWrapper(messageReader.CreateODataFeedReader(entityType), responsePipeline);
        }
        public void ReadingInMinialMetadataModeWithContainedEntitySetShouldBeAbleToGenerateId()
        {
            const string payload =
                "{" +
                    "\"@odata.context\":\"http://example.com/$metadata#EntitySet(1)/ContainedNavProp(ID)\"," +
                    "\"value\":[" +
                    "{" +
                    "\"ID\" : 123" +
                    "}" +
                "] }";

            InMemoryMessage message = new InMemoryMessage();
            message.SetHeader("Content-Type", "application/json;odata.metadata=minimal");
            message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));

            ODataEntry topLevelEntry = null;
            List<ODataEntry> entryList = new List<ODataEntry>();

            using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model))
            {
                var navProp = EntityType.FindProperty("ContainedNavProp") as IEdmNavigationProperty;
                var containedEntitySet = EntitySet.FindNavigationTarget(navProp) as IEdmEntitySetBase;
                var reader = messageReader.CreateODataFeedReader(containedEntitySet, EntityType);
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.EntryEnd:
                            topLevelEntry = (ODataEntry)reader.Item;
                            entryList.Add(topLevelEntry);
                            break;
                    }
                }
            }

            Uri containedId = new Uri("http://example.com/EntitySet(1)/ContainedNavProp(123)");

            ODataEntry containedEntry = entryList[0];
            containedEntry.Id.Should().Be(containedId);
        }
Esempio n. 43
0
        public static void FeedWriteReadNormal()
        {
            Console.WriteLine("FeedWriteReadNormal");

            ODataFeed Feed = new ODataFeed();

            Feed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo()
            {
                NavigationSourceName = "Mails",
                NavigationSourceEntityTypeName = "NS.Mail",
                NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet
            });

            ODataEntry Entry = new ODataEntry()
            {
                Properties = new[]
                {
                    new ODataProperty() {Name = "Id", Value = 2},
                },
                EditLink = new Uri("http://example/Web/Users(3)"),
            };

            Entry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo()
            {
                NavigationSourceName = "MyLogin",
                NavigationSourceEntityTypeName = "NS.Person",
                NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet
            });

            // Parse the full request Uri
            ODataPath path = new ODataUriParser(
                CraftModel.Model,
                new Uri("http://example.org/svc/"),
                new Uri("http://example.org/svc/MyLogin/Mails")).ParsePath();

            // Alternatively, construct the normal path for the contained entity manually.
            //ODataPath path = new ODataPath(
            //    new ODataPathSegment[]
            //    {
            //        new SingletonSegment(CraftModel.MyLogin), new NavigationPropertySegment(CraftModel.MailBox, CraftModel.MyLogin)
            //    });

            var stream = new MemoryStream();

            var wsetting = new ODataMessageWriterSettings()
            {
                DisableMessageStreamDisposal = true,

                ODataUri = new ODataUri()
                {
                    ServiceRoot = new Uri("http://example.org/svc/"),
                    Path = path
                }
            };
            IODataResponseMessage msg = new Message()
            {
                Stream = stream,
            };

            var omw = new ODataMessageWriter(msg, wsetting);
            var writer = omw.CreateODataFeedWriter();
            writer.WriteStart(Feed);
            writer.WriteStart(Entry);
            writer.WriteEnd();
            writer.WriteEnd();

            stream.Seek(0, SeekOrigin.Begin);
            var payload = new StreamReader(stream).ReadToEnd();

            // {"@odata.context":"http://example.org/svc/$metadata#Web/Items","value":[{"@odata.editLink":"http://example/Web/Users(3)","Id":2}]}
            Console.WriteLine(payload);

            //Read
            ODataEntry entry = null;
            stream.Seek(0, SeekOrigin.Begin);
            var rsetting = new ODataMessageReaderSettings();
            var omr = new ODataMessageReader(msg, rsetting, CraftModel.Model);
            var reader = omr.CreateODataFeedReader();
            while (reader.Read())
            {
                if (reader.State == ODataReaderState.EntryEnd)
                {
                    entry = (ODataEntry)reader.Item;
                    break;
                }
            }

            //Id=2
            foreach (var prop in entry.Properties)
            {
                Console.WriteLine("{0}={1}", prop.Name, prop.Value);
            }
        }
        private void ReadFeedPayload(string payload, Action<ODataReader> action, bool isResponse = true, ODataVersion maxProtocolVersion = ODataVersion.V4)
        {
            if (isResponse)
            {
                IODataResponseMessage message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)), StatusCode = 200 };
                message.SetHeader("Content-Type", "application/atom+xml;type=feed");
                ODataMessageReaderSettings settings = new ODataMessageReaderSettings()
                {
                    MaxProtocolVersion = maxProtocolVersion,
                    EnableAtom = true
                };
                using (var msgReader = new ODataMessageReader(message, settings))
                {
                    var reader = msgReader.CreateODataFeedReader();
                    while (reader.Read())
                    {
                        action(reader);
                    }
                }
            }
            else
            {
                IODataRequestMessage message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)), Method = "GET" };
                message.SetHeader("Content-Type", "application/atom+xml;type=feed");
                ODataMessageReaderSettings settings = new ODataMessageReaderSettings()
                    {
                        MaxProtocolVersion = maxProtocolVersion,
                        EnableAtom = true
                    };
                using (var msgReader = new ODataMessageReader(message, settings))
                {
                    var reader = msgReader.CreateODataFeedReader();
                    while (reader.Read())
                    {
                        action(reader);
                    }
                }
            }

        }
Esempio n. 45
0
        public void ExecuteBaseballStatsRequest(IEdmModel model, string fileName)
        {
            //we are going to create a GET request to the OData Netflix Catalog
            HTTPClientRequestMessage message = new HTTPClientRequestMessage("http://baseball-stats.info/OData/baseballstats.svc/");
            message.SetHeader("Accept", "application/atom+xml");
            message.SetHeader("DataServiceVersion", ODataUtils.ODataVersionToString(ODataVersion.V2));
            message.SetHeader("MaxDataServiceVersion", ODataUtils.ODataVersionToString(ODataVersion.V2));

            //create a simple text file to write the response to and create a text writer
            string filePath = @".\out\" + fileName + ".txt";
            using (StreamWriter outputWriter = new StreamWriter(filePath))
            {
                //use an indented text writer for readability
                this.writer = new IndentedTextWriter(outputWriter, "  ");

                //issue the request and get the response as an ODataMessage. Create an ODataMessageReader over the response 
                //we will use the model when creating the reader as this will tell the library to validate when parsing
                using (ODataMessageReader messageReader = new ODataMessageReader(message.GetResponse(),
                    new ODataMessageReaderSettings(), model))
                {
                    //create a feed reader 
                    ODataReader reader = messageReader.CreateODataFeedReader();
                    while (reader.Read())
                    {
                        switch (reader.State)
                        {
                            case ODataReaderState.FeedStart:
                                {
                                    //this is just the beginning of the feed, data will not be parsed yet
                                    ODataFeed feed = (ODataFeed)reader.Item;
                                    this.writer.WriteLine("ODataFeed:");
                                    this.writer.Indent++;
                                }

                                break;

                            case ODataReaderState.FeedEnd:
                                {
                                    //this is the end of feed state. The entire message has been read at this point
                                    ODataFeed feed = (ODataFeed)reader.Item;
                                    if (feed.Count != null)
                                    {
                                        //if there is an inlinecount value write the value out
                                        this.writer.WriteLine("Count: " + feed.Count.ToString());
                                    }
                                    if (feed.NextPageLink != null)
                                    {
                                        //if there is a next link write that link as well
                                        this.writer.WriteLine("NextPageLink: " + feed.NextPageLink.AbsoluteUri);
                                    }

                                    this.writer.Indent--;
                                }

                                break;

                            case ODataReaderState.EntryStart:
                                {
                                    //this is just the start of the entry. 
                                    //Properties of the entity will not be parsed yet
                                    ODataEntry entry = (ODataEntry)reader.Item;
                                    this.writer.WriteLine("ODataEntry:");
                                    this.writer.Indent++;
                                }

                                break;

                            case ODataReaderState.EntryEnd:
                                {
                                    //at the point the whole entry has been read
                                    //and the properties of the entity are available
                                    ODataEntry entry = (ODataEntry)reader.Item;
                                    this.writer.WriteLine("TypeName: " + (entry.TypeName ?? "<null>"));
                                    this.writer.WriteLine("Id: " + (entry.Id ?? "<null>"));
                                    if (entry.ReadLink != null)
                                    {
                                        this.writer.WriteLine("ReadLink: " + entry.ReadLink.AbsoluteUri);
                                    }

                                    if (entry.EditLink != null)
                                    {
                                        this.writer.WriteLine("EditLink: " + entry.EditLink.AbsoluteUri);
                                    }

                                    if (entry.MediaResource != null)
                                    {
                                        this.writer.Write("MediaResource: ");
                                        this.WriteValue(entry.MediaResource);
                                    }

                                    this.WriteProperties(entry.Properties);

                                    this.writer.Indent--;
                                }

                                break;

                            case ODataReaderState.NavigationLinkStart:
                                {
                                    //navigation links have their own states. 
                                    //This could be an expanded link and include an entire expanded entry or feed.
                                    ODataNavigationLink navigationLink = (ODataNavigationLink)reader.Item;
                                    this.writer.WriteLine(navigationLink.Name + ": ODataNavigationLink: ");
                                    this.writer.Indent++;
                                }

                                break;

                            case ODataReaderState.NavigationLinkEnd:
                                {
                                    ODataNavigationLink navigationLink = (ODataNavigationLink)reader.Item;
                                    this.writer.WriteLine("Url: " +
                                        (navigationLink.Url == null ? "<null>" : navigationLink.Url.AbsoluteUri));
                                    this.writer.Indent--;
                                }

                                break;
                        }
                    }
                }
            }
        }
Esempio n. 46
0
 protected static ODataReader CreateODataReader(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceProtocolVersion protocolVersion)
 {
     if (expectedType != null)
     {
         ClientEdmModel.GetModel(protocolVersion).GetClientTypeAnnotation(expectedType).EnsureEPMLoaded();
     }
     IEdmEntityType expectedEntityType = expectedType as IEdmEntityType;
     if (messageType == ODataPayloadKind.Entry)
     {
         return messageReader.CreateODataEntryReader(expectedEntityType);
     }
     return messageReader.CreateODataFeedReader(expectedEntityType);
 }
        private void PrimitiveValueInSkipTokenInURL(string skipTokenQuery)
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = this.ServiceUri };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new Microsoft.Test.OData.Tests.Client.Common.HttpWebRequestMessage(new Uri(this.ServiceUri.AbsoluteUri + skipTokenQuery, UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, RetrieveServiceEdmModel()))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                string pattern = skipTokenQuery.Substring(0, skipTokenQuery.IndexOf("?")) + @"\(" + dataPattern + @"\)$";
                                Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);

                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.IsTrue(rgx.Match(entry.Id.ToString()).Success, "Expected : Entry's Id doesn't contain trailing when Key is Int64/float/double/decimal");
                                if (mimeType.Equals(MimeTypes.ApplicationJson + MimeTypes.ODataParameterFullMetadata))
                                {
                                    Assert.IsTrue(rgx.Match(entry.EditLink.ToString()).Success, "Expected : Entry's EditLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                    Assert.IsTrue(rgx.Match(entry.ReadLink.ToString()).Success, "Expected : Entry's ReadLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                }
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                var pattern = skipTokenQuery.Substring(0, skipTokenQuery.IndexOf("?")) + @"\?\$skiptoken=" + dataPattern + "$";
                                Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
                                ODataFeed feed = reader.Item as ODataFeed;
                                Assert.IsTrue(rgx.Match(feed.NextPageLink.ToString()).Success, "Expected : Feed's NextLink doesn't contain trailing when Key is Int64/float/double/decimal");
                            }
                        }
                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
            private void CreateAndReadResponseMessageWithFeed(string startingString, string cycleString)
            {
                var model = this.GetModel();
                if (model != null)
                {
                    var responseMessage = new ODataUnlimitedResponseMessage(startingString, cycleString);
                    responseMessage.SetHeader("Content-Type", "application/json");
                    responseMessage.SetHeader("DataServiceVersion", "3.0");

                    var readLimitReached = false;
                    try
                    {

                        using (var messageReader = new ODataMessageReader(responseMessage, new ODataMessageReaderSettings(), model))
                        {
                            var feedReader = messageReader.CreateODataFeedReader();
                            while (feedReader.Read())
                            {
                                switch (feedReader.State)
                                {
                                    case ODataReaderState.FeedStart:
                                        Console.WriteLine("FeedStart: " + (ODataFeed)feedReader.Item);
                                        break;

                                    case ODataReaderState.FeedEnd:
                                        Console.WriteLine("FeedEnd: " + (ODataFeed)feedReader.Item);
                                        break;

                                    case ODataReaderState.EntryStart:
                                        Console.WriteLine("EntryStart: " + (ODataEntry)feedReader.Item);
                                        break;

                                    case ODataReaderState.EntryEnd:
                                        Console.WriteLine("EntryEnd: " + (ODataEntry)feedReader.Item);
                                        break;

                                    default:
                                        Console.WriteLine("ODataItem: " + feedReader.Item);
                                        break;
                                }
                            }
                        }
                    }
                    catch (ODataException ex)
                    {
                        if (ex.Message.StartsWith("The maximum number of bytes allowed to be read from the stream has been exceeded."))
                        {
                            readLimitReached = true;
                        }
                        else
                        {
                            throw;
                        }
                    }

                    if (!readLimitReached)
                    {
                        throw new InvalidOperationException("Expecting exception, but it was not thrown.");
                    }
                }
            }
 /// <summary>
 /// Creates an OData reader to read OData feed download response.
 /// </summary>
 /// <param name="reader">The message reader containing current OData feed download response.</param>
 /// <returns>an OData reader to read OData feed download response</returns>
 private ODataReader CreateReader(ODataMessageReader reader)
 {
     ODataReader resultReader = null;
     resultReader = reader.CreateODataFeedReader();
     return resultReader;
 }
Esempio n. 50
0
        public void QueryWithFormat()
        {
            Dictionary<string, string> testCases = new Dictionary<string, string>()
            {
                {"People?$format=application/json", "application/json"},
                // ODL Bug: https://github.com/OData/odata.net/issues/313
                ////{"People?$format=application/json;odata.metadata=full", "application/json; odata.metadata=full"},
                {"People?$format=json", "application/json"},
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri };
            foreach (var testCase in testCases)
            {
                DataServiceClientRequestMessageArgs args = new DataServiceClientRequestMessageArgs(
                    "GET",
                    new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute),
                    false, false, new Dictionary<string, string>() { });

                var requestMessage = new HttpWebRequestMessage(args);
                using (var responseMessage = requestMessage.GetResponse() as HttpWebResponseMessage)
                {
                    Assert.Equal(200, responseMessage.StatusCode);

                    string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value;
                    Assert.True(contentType.StartsWith(testCase.Value));

                    using (var messageReader = new ODataMessageReader(
                        responseMessage,
                        readerSettings,
                        this.TestClientContext.Format.LoadServiceModel()))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.NotNull(entry.Properties.Single(p => p.Name == "PersonId").Value);
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                Assert.NotNull(reader.Item as ODataFeed);
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        void CheckResponse(ODataMessageReader mreader)
        {
            using (mreader)
            {
                var reader = mreader.CreateODataFeedReader();
                while (reader.Read())
                {
                    Assert.IsNotNull(reader.State);
                    switch (reader.State)
                    {
                        case ODataReaderState.FeedStart:
                            {
                                ODataFeed feed = (ODataFeed)reader.Item;

                            }

                            break;
                        case ODataReaderState.FeedEnd:
                            {
                                ODataFeed feed = (ODataFeed)reader.Item;
                                if (feed.Count != null)
                                {
                                    //this.writer.WriteLine("Count: " + feed.Count.ToString());
                                }
                                if (feed.NextPageLink != null)
                                {
                                    //this.writer.WriteLine("NextPageLink: " + feed.NextPageLink.AbsoluteUri);
                                }

                            }

                            break;

                        case ODataReaderState.EntryStart:
                            {
                                ODataEntry entry = (ODataEntry)reader.Item;

                            }

                            break;

                        case ODataReaderState.EntryEnd:
                            {
                                ODataEntry entry = (ODataEntry)reader.Item;
                                // this.writer.WriteLine("TypeName: " + (entry.TypeName ?? "<null>"));
                                // this.writer.WriteLine("Id: " + (entry.Id ?? "<null>"));
                                if (entry.ReadLink != null)
                                {
                                    // this.writer.WriteLine("ReadLink: " + entry.ReadLink.AbsoluteUri);
                                }

                                if (entry.EditLink != null)
                                {
                                    //this.writer.WriteLine("EditLink: " + entry.EditLink.AbsoluteUri);
                                }

                                if (entry.MediaResource != null)
                                {
                                    //     this.writer.Write("MediaResource: ");
                                    //      this.WriteValue(entry.MediaResource);
                                }

                                //  this.WriteProperties(entry.Properties);
                                foreach (ODataProperty property in entry.Properties)
                                {
                                    //   this.writer.Write(property.Name + ": ");
                                    //  this.WriteValue(property.Value);
                                }

                                foreach (var assoc in entry.AssociationLinks)
                                {
                                    //do something
                                }

                                //  this.writer.Indent--;
                            }

                            break;

                        case ODataReaderState.NavigationLinkStart:
                            {
                                ODataNavigationLink navigationLink = (ODataNavigationLink)reader.Item;
                                //  this.writer.WriteLine(navigationLink.Name + ": ODataNavigationLink: ");
                                //  this.writer.Indent++;
                            }

                            break;

                        case ODataReaderState.NavigationLinkEnd:
                            {
                                ODataNavigationLink navigationLink = (ODataNavigationLink)reader.Item;
                                // this.writer.WriteLine("Url: " + (navigationLink.Url == null ? "<null>" : navigationLink.Url.AbsoluteUri));
                                // this.writer.Indent--;
                            }

                            break;
                    }
                }
            }
        }
        public void ShouldBeAbleToReadCustomInstanceAnnotationFromFeedAndEntry(string payload, string contentType)
        {
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));
            var readerSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = false, EnableAtom = true };

            IODataResponseMessage messageToRead = new InMemoryMessage { StatusCode = 200, Stream = stream };
            messageToRead.SetHeader("Content-Type", contentType);

            // Enable reading custom instance annotations.
            messageToRead.PreferenceAppliedHeader().AnnotationFilter = "Custom.*";

            Stack<ODataItem> odataItems = new Stack<ODataItem>(4);
            using (var messageReader = new ODataMessageReader(messageToRead, readerSettings, Model))
            {
                var odataReader = messageReader.CreateODataFeedReader(EntitySet, EntityType);
                ICollection<ODataInstanceAnnotation> instanceAnnotations = null;
                while (odataReader.Read())
                {
                    switch (odataReader.State)
                    {
                        case ODataReaderState.FeedStart:
                            odataItems.Push(odataReader.Item);
                            instanceAnnotations = odataItems.Peek().As<ODataFeed>().InstanceAnnotations;

                            // TODO: We only support instance annotation at the top level feed at the moment. Will remove the if statement when support on inline feed is added.
                            if (odataItems.Count == 1)
                            {
                                // Note that in streaming mode, the collection should be populated with instance annotations read so far before the beginning of the first entry.
                                // We are currently in non-streaming mode. The reader will buffer the payload and read ahead till the
                                // end of the feed to read all instance annotations.
                                instanceAnnotations.Should().HaveCount(1);
                                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedStartAnnotation").Value);
                            }
                            else
                            {
                                instanceAnnotations.Should().BeEmpty();
                            }

                            break;
                        case ODataReaderState.FeedEnd:
                            instanceAnnotations = odataItems.Peek().As<ODataFeed>().InstanceAnnotations;

                            // TODO: We only support instance annotation at the top level feed at the moment. Will remove the if statement when support on inline feed is added.
                            if (odataItems.Count == 1)
                            {
                                instanceAnnotations.Should().HaveCount(2);
                                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedStartAnnotation").Value);
                                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedEndAnnotation").Value);
                            }
                            else
                            {
                                instanceAnnotations.Should().BeEmpty();
                            }

                            odataItems.Pop();
                            break;
                        case ODataReaderState.NavigationLinkStart:
                            ODataNavigationLink navigationLink = (ODataNavigationLink)odataReader.Item;
                            if (navigationLink.Name == "ResourceSetNavigationProperty")
                            {
                                // The collection should be populated with instance annotations read so far before the "ResourceSetNavigationProperty".
                                instanceAnnotations = odataItems.Peek().As<ODataEntry>().InstanceAnnotations;
                                instanceAnnotations.Should().HaveCount(2);
                                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryMiddleAnnotation").Value);
                            }

                            break;
                        case ODataReaderState.NavigationLinkEnd:
                            break;
                        case ODataReaderState.EntryStart:
                            odataItems.Push(odataReader.Item);

                            // The collection should be populated with instance annotations read so far before the first navigation/association link or before the end of the entry.
                            instanceAnnotations = odataItems.Peek().As<ODataEntry>().InstanceAnnotations;
                            instanceAnnotations.Should().HaveCount(1);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                            break;

                        case ODataReaderState.EntryEnd:
                            instanceAnnotations = odataItems.Peek().As<ODataEntry>().InstanceAnnotations;
                            instanceAnnotations.Should().HaveCount(3);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryMiddleAnnotation").Value);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryEndAnnotation").Value);
                            odataItems.Pop();
                            break;
                    }
                }

                instanceAnnotations.Should().HaveCount(2);
                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedStartAnnotation").Value);
                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedEndAnnotation").Value);
            }
        }
Esempio n. 53
0
 private static ODataResult GetODataResult(ODataMessageReader messageReader)
 {
     List<ODataPayloadKindDetectionResult> payloadKinds = messageReader.DetectPayloadKind().ToList();
     if (payloadKinds.Count > 0)
     {
         switch (payloadKinds[0].PayloadKind)
         {
             case ODataPayloadKind.Feed:
                 return new FeedODataResult(messageReader.CreateODataFeedReader());
             case ODataPayloadKind.Entry:
                 return new FeedODataResult(messageReader.CreateODataEntryReader());
         }
         throw new InvalidOperationException("unsupported payload kind " + payloadKinds[0].PayloadKind);
     }
     throw new InvalidOperationException("unknown payload kind");
 }
        public void CustomInstanceAnnotationFromFeedAndEntryInJsonLightShouldBeSkippedByTheReaderByDefault()
        {
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(JsonLightFeedAndEntryPayloadWithCustomInstanceAnnotations));
            var readerSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = false };
            IODataResponseMessage messageToRead = new InMemoryMessage { StatusCode = 200, Stream = stream };
            messageToRead.SetHeader("Content-Type", "application/json;odata.streaming=true");

            using (var messageReader = new ODataMessageReader(messageToRead, readerSettings, Model))
            {
                var odataReader = messageReader.CreateODataFeedReader(EntitySet, EntityType);
                while (odataReader.Read())
                {
                    switch (odataReader.State)
                    {
                        case ODataReaderState.FeedStart:
                        case ODataReaderState.FeedEnd:
                            odataReader.Item.As<ODataFeed>().InstanceAnnotations.Should().BeEmpty();
                            break;
                        case ODataReaderState.NavigationLinkStart:
                        case ODataReaderState.NavigationLinkEnd:
                            break;
                        case ODataReaderState.EntryStart:
                        case ODataReaderState.EntryEnd:
                            odataReader.Item.As<ODataEntry>().InstanceAnnotations.Should().BeEmpty();
                            break;
                    }
                }
            }
        }
 private void ReadFeedPayload(string payload, Action<ODataReader> action)
 {
     var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) };
     message.SetHeader("Content-Type", "application/atom+xml;type=feed");
     message.PreferenceAppliedHeader().AnnotationFilter = "*";
     using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, atomReaderSettings))
     {
         var reader = msgReader.CreateODataFeedReader();
         while (reader.Read())
         {
             action(reader);
         }
     }
 }
        public void TestCreateODataFeedReader_InJsonLight_WithEntityTypeButWithoutSet_Throws()
        {
            // Arrange
            IODataRequestMessage request = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();
            IEdmEntityType entityType = model.EntityContainer.EntitySets().First().EntityType();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.Throws<ODataException>(() => reader.CreateODataFeedReader(entityType));
            }
        }
        public void TestCreateODataFeedReader_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage request = CreateJsonLightRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();
            IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                Assert.DoesNotThrow(() => reader.CreateODataFeedReader(entitySet, null));
            }
        }
            internal static object ConvertFeed(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext)
            {
                IEdmCollectionTypeReference collectionType = edmTypeReference.AsCollection();

                EdmEntitySet tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp",
                    collectionType.ElementType().AsEntity().EntityDefinition());

                ODataReader odataReader = oDataMessageReader.CreateODataFeedReader(tempEntitySet,
                    collectionType.ElementType().AsEntity().EntityDefinition());
                ODataFeedWithEntries feed =
                    ODataEntityDeserializer.ReadEntryOrFeed(odataReader) as ODataFeedWithEntries;

                ODataFeedDeserializer feedDeserializer =
                    (ODataFeedDeserializer)DeserializerProvider.GetEdmTypeDeserializer(collectionType);

                object result = feedDeserializer.ReadInline(feed, collectionType, readContext);
                IEnumerable enumerable = result as IEnumerable;
                if (enumerable != null)
                {
                    IEnumerable newEnumerable = CovertFeedIds(enumerable, feed, collectionType, readContext);
                    if (readContext.IsUntyped)
                    {
                        EdmEntityObjectCollection entityCollection =
                            new EdmEntityObjectCollection(collectionType);
                        foreach (EdmEntityObject entity in newEnumerable)
                        {
                            entityCollection.Add(entity);
                        }

                        return entityCollection;
                    }
                    else
                    {
                        IEdmTypeReference elementTypeReference = collectionType.ElementType();

                        Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference,
                            readContext.Model);
                        IEnumerable castedResult =
                            CastMethodInfo.MakeGenericMethod(elementClrType)
                                .Invoke(null, new object[] { newEnumerable }) as IEnumerable;
                        return castedResult;
                    }
                }

                return null;
            }
        public void ReadingInMinialMetadataModeUseDefaultCtorWithContainedEntitySetOfAnotherTypeShouldBeAbleToGenerateId()
        {
            const string payload =
                "{" +
                    "\"@odata.context\":\"http://example.com/$metadata#EntitySet(1)/AnotherContainedNavProp\"," +
                    "\"value\":[" +
                    "{" +
                    "\"ID\" : 123," +
                    "\"Name\" : \"Bob\"" +
                    "}" +
                "] }";

            InMemoryMessage message = new InMemoryMessage();
            message.SetHeader("Content-Type", "application/json;odata.metadata=minimal");
            message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload));

            ODataEntry topLevelEntry = null;
            List<ODataEntry> entryList = new List<ODataEntry>();

            using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model))
            {
                var reader = messageReader.CreateODataFeedReader();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                        case ODataReaderState.EntryEnd:
                            topLevelEntry = (ODataEntry)reader.Item;
                            entryList.Add(topLevelEntry);
                            break;
                    }
                }
            }

            Uri containedId = new Uri("http://example.com/EntitySet(1)/AnotherContainedNavProp(123)");

            ODataEntry containedEntry = entryList[0];
            containedEntry.Id.Should().Be(containedId);
        }