/// <summary> /// Creates the materializer entry. /// </summary> /// <param name="entry">The entry.</param> /// <param name="format">The format the entry was read in.</param> /// <param name="isTracking">True if the contents of the entry will be tracked in the context, otherwise False.</param> /// <param name="model">The client model.</param> /// <returns>A new materializer entry.</returns> public static MaterializerEntry CreateEntry(ODataResource entry, ODataFormat format, bool isTracking, ClientEdmModel model) { Debug.Assert(entry.GetAnnotation <MaterializerEntry>() == null, "MaterializerEntry has already been created."); MaterializerEntry materializerEntry = new MaterializerEntry(entry, format, isTracking, model); entry.SetAnnotation <MaterializerEntry>(materializerEntry); return(materializerEntry); }
private void WriteEntry(ODataWriter writer, ODataResource entry) { writer.WriteStart(entry); var annotation = entry.GetAnnotation <ODataEntryNavigationLinksObjectModelAnnotation>(); ODataNestedResourceInfo navLink = null; if (annotation != null) { for (int i = 0; i < annotation.Count; ++i) { bool found = annotation.TryGetNavigationLinkAt(i, out navLink); ExceptionUtilities.Assert(found, "Navigation links should be ordered sequentially for writing"); this.WriteNavigationLink(writer, navLink); } } writer.WriteEnd(); }
/// <summary> /// Gets all navigation link instances attached to the <paramref name="entry"/> via the /// <see cref="ODataEntryNavigationLinksObjectModelAnnotation"/> annotation. /// </summary> /// <param name="entry">The <see cref="ODataResource"/> to get the navigation links for.</param> /// <returns>The annotation representing the navigation link instances or null if none were found.</returns> public static ODataEntryNavigationLinksObjectModelAnnotation NavigationLinks(this ODataResource entry) { ExceptionUtilities.CheckArgumentNotNull(entry, "entry"); return(entry.GetAnnotation <ODataEntryNavigationLinksObjectModelAnnotation>()); }
/// <summary> /// Gets an entry for a given ODataResource. /// </summary> /// <param name="entry">The ODataResource.</param> /// <returns>The materializer entry</returns> public static MaterializerEntry GetEntry(ODataResource entry) { return(entry.GetAnnotation <MaterializerEntry>()); }
/// <summary> /// Visits an entry item. /// </summary> /// <param name="entry">The entry to visit.</param> protected override ODataPayloadElement VisitEntry(ODataResource entry) { ODataPayloadElement payloadElement = base.VisitEntry(entry); ODataEntryPayloadOrderObjectModelAnnotation payloadOrderEntryAnnotation = entry.GetAnnotation <ODataEntryPayloadOrderObjectModelAnnotation>(); if (payloadOrderEntryAnnotation != null) { PayloadOrderODataPayloadElementAnnotation payloadOrderElementAnnotation = new PayloadOrderODataPayloadElementAnnotation(); payloadOrderElementAnnotation.PayloadItems.AddRange(payloadOrderEntryAnnotation.PayloadItems); payloadElement.Add(payloadOrderElementAnnotation); } return(payloadElement); }
private void Read(Lazy <ODataReader> lazyReader) { foreach (var state in this.expectedStates) { lazyReader.Value.Read(); ExceptionUtilities.Assert(lazyReader.Value.State == state, "Expected %1, Found %2", state, lazyReader.Value.State); switch (state) { case ODataReaderState.ResourceSetStart: if (readItems.Count > 0) { ODataNestedResourceInfo navLink = (ODataNestedResourceInfo)readItems.Peek(); var annotation = navLink.GetAnnotation <ODataNavigationLinkExpandedItemObjectModelAnnotation>(); if (annotation == null) { annotation = new ODataNavigationLinkExpandedItemObjectModelAnnotation(); navLink.SetAnnotation(annotation); } annotation.ExpandedItem = lazyReader.Value.Item; } readItems.Push(lazyReader.Value.Item); break; case ODataReaderState.ResourceStart: var currentEntry = (ODataResource)lazyReader.Value.Item; if (readItems.Count > 0) { ODataResourceSet feed = readItems.Peek() as ODataResourceSet; if (feed != null) { var annotation = feed.GetAnnotation <ODataFeedEntriesObjectModelAnnotation>(); if (annotation == null) { annotation = new ODataFeedEntriesObjectModelAnnotation(); feed.SetAnnotation(annotation); } annotation.Add((ODataResource)lazyReader.Value.Item); } else { ODataNestedResourceInfo navLink = (ODataNestedResourceInfo)readItems.Peek(); var annotation = navLink.GetAnnotation <ODataNavigationLinkExpandedItemObjectModelAnnotation>(); if (annotation == null) { annotation = new ODataNavigationLinkExpandedItemObjectModelAnnotation(); navLink.SetAnnotation(annotation); } annotation.ExpandedItem = currentEntry; } } readItems.Push(currentEntry); break; case ODataReaderState.NestedResourceInfoStart: ODataResource entry = (ODataResource)readItems.Peek(); var navLinksAnnotation = entry.GetAnnotation <ODataEntryNavigationLinksObjectModelAnnotation>(); if (navLinksAnnotation == null) { navLinksAnnotation = new ODataEntryNavigationLinksObjectModelAnnotation(); entry.SetAnnotation(navLinksAnnotation); } navLinksAnnotation.Add((ODataNestedResourceInfo)lazyReader.Value.Item, entry.Properties.Count() + navLinksAnnotation.Count); readItems.Push(lazyReader.Value.Item); break; case ODataReaderState.ResourceEnd: case ODataReaderState.ResourceSetEnd: case ODataReaderState.NestedResourceInfoEnd: if (readItems.Count() > 1) { readItems.Pop(); } break; } } this.expectedStates.Clear(); }