/// <summary>
 /// Initializes a new instance of the <see cref="ODataReaderEntityMaterializer" /> class.
 /// </summary>
 /// <param name="odataMessageReader">The odata message reader.</param>
 /// <param name="reader">The reader.</param>
 /// <param name="materializerContext">The materializer context.</param>
 /// <param name="entityTrackingAdapter">The entity tracking adapter.</param>
 /// <param name="queryComponents">The query components.</param>
 /// <param name="expectedType">The expected type.</param>
 /// <param name="materializeEntryPlan">The materialize entry plan.</param>
 public ODataReaderEntityMaterializer(
     ODataMessageReader odataMessageReader,
     ODataReaderWrapper reader,
     IODataMaterializerContext materializerContext,
     EntityTrackingAdapter entityTrackingAdapter,
     QueryComponents queryComponents,
     Type expectedType,
     ProjectionPlan materializeEntryPlan)
     : base(materializerContext, entityTrackingAdapter, queryComponents, expectedType, materializeEntryPlan)
 {
     this.messageReader    = odataMessageReader;
     this.feedEntryAdapter = new FeedAndEntryMaterializerAdapter(odataMessageReader, reader, materializerContext.Model, entityTrackingAdapter.MergeOption);
 }
        /// <summary>
        /// This method is for parsing CUD operation payloads which should contain
        /// 1 a single entry
        /// 2 An Error
        /// </summary>
        /// <param name="message">the message for the payload</param>
        /// <param name="responseInfo">The current ResponseInfo object</param>
        /// <param name="expectedType">The expected type</param>
        /// <returns>the MaterializerEntry that was read</returns>
        internal static MaterializerEntry ParseSingleEntityPayload(IODataResponseMessage message, ResponseInfo responseInfo, Type expectedType)
        {
            ODataPayloadKind messageType = ODataPayloadKind.Resource;

            using (ODataMessageReader messageReader = CreateODataMessageReader(message, responseInfo, ref messageType))
            {
                IEdmType           edmType = responseInfo.TypeResolver.ResolveExpectedTypeForReading(expectedType);
                ODataReaderWrapper reader  = ODataReaderWrapper.Create(messageReader, messageType, edmType, responseInfo.ResponsePipeline);

                FeedAndEntryMaterializerAdapter parser = new FeedAndEntryMaterializerAdapter(messageReader, reader, responseInfo.Model, responseInfo.MergeOption);

                ODataResource entry    = null;
                bool          readFeed = false;
                while (parser.Read())
                {
                    readFeed |= parser.CurrentFeed != null;
                    if (parser.CurrentEntry != null)
                    {
                        if (entry != null)
                        {
                            throw new InvalidOperationException(DSClient.Strings.AtomParser_SingleEntry_MultipleFound);
                        }

                        entry = parser.CurrentEntry;
                    }
                }

                if (entry == null)
                {
                    if (readFeed)
                    {
                        throw new InvalidOperationException(DSClient.Strings.AtomParser_SingleEntry_NoneFound);
                    }
                    else
                    {
                        throw new InvalidOperationException(DSClient.Strings.AtomParser_SingleEntry_ExpectedFeedOrEntry);
                    }
                }

                return(MaterializerEntry.GetEntry(entry));
            }
        }
Example #3
0
        public void ValidateShortIntegrationFeedReading()
        {
            var initialFeed = new ODataResourceSet()
            {
                Id = new Uri("http://services.odata.org/OData/OData.svc/Products")
            };

            var productItem = new ODataResource()
            {
                Id = new Uri("http://services.odata.org/OData/OData.svc/Products(0)")
            };

            productItem.Properties = new ODataProperty[] { new ODataProperty()
                                                           {
                                                               Name = "Id", Value = 0
                                                           } };

            var categoryNavigationLink = new ODataNestedResourceInfo()
            {
                Name = "Category"
            };

            var categoryItem = new ODataResource()
            {
                Id = new Uri("http://services.odata.org/OData/OData.svc/Categories(0)")
            };

            categoryItem.Properties = new ODataProperty[] { new ODataProperty()
                                                            {
                                                                Name = "Id", Value = 0
                                                            } };

            var productsNavigationLink = new ODataNestedResourceInfo()
            {
                Name = "Products"
            };

            var supplierNavigationLink = new ODataNestedResourceInfo()
            {
                Name = "Supplier"
            };

            var testODataReader = new TestODataReader()
            {
                new TestODataReaderItem(ODataReaderState.ResourceSetStart, initialFeed),
                new TestODataReaderItem(ODataReaderState.ResourceStart, productItem),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoStart, categoryNavigationLink),
                new TestODataReaderItem(ODataReaderState.ResourceStart, categoryItem),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoStart, productsNavigationLink),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoEnd, productsNavigationLink),
                new TestODataReaderItem(ODataReaderState.ResourceEnd, categoryItem),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoEnd, categoryNavigationLink),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoStart, supplierNavigationLink),
                new TestODataReaderItem(ODataReaderState.NestedResourceInfoEnd, supplierNavigationLink),
                new TestODataReaderItem(ODataReaderState.ResourceEnd, productItem),
                new TestODataReaderItem(ODataReaderState.ResourceSetEnd, initialFeed),
            };

            ClientEdmModel clientEdmModel = new ClientEdmModel(ODataProtocolVersion.V4);

            var responsePipeline   = new DataServiceClientResponsePipelineConfiguration(new DataServiceContext());
            var odataReaderWrapper = ODataReaderWrapper.CreateForTest(testODataReader, responsePipeline);
            FeedAndEntryMaterializerAdapter reader = new FeedAndEntryMaterializerAdapter(ODataFormat.Json, odataReaderWrapper, clientEdmModel, MergeOption.OverwriteChanges);

            int readCounter = 0;

            while (reader.Read())
            {
                readCounter++;
            }

            readCounter.Should().Be(1);
        }