|
8 | 8 | using System;
|
9 | 9 | using System.Collections;
|
10 | 10 | using System.Diagnostics.Contracts;
|
| 11 | +using System.Reflection; |
11 | 12 | using System.Runtime.Serialization;
|
12 | 13 | using System.Threading.Tasks;
|
13 | 14 | using Microsoft.AspNetCore.OData.Abstracts;
|
@@ -56,10 +57,6 @@ public override async Task WriteObjectAsync(object graph, Type type, ODataMessag
|
56 | 57 | }
|
57 | 58 |
|
58 | 59 | IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase;
|
59 |
| - if (entitySet == null) |
60 |
| - { |
61 |
| - throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); |
62 |
| - } |
63 | 60 |
|
64 | 61 | IEdmTypeReference feedType = writeContext.GetEdmType(graph, type);
|
65 | 62 | Contract.Assert(feedType != null);
|
@@ -162,11 +159,19 @@ private async Task WriteDeltaResourceSetAsync(IEnumerable enumerable, IEdmTypeRe
|
162 | 159 | }
|
163 | 160 |
|
164 | 161 | lastResource = item;
|
165 |
| - DeltaItemKind kind = GetDelteItemKind(item); |
| 162 | + DeltaItemKind kind = GetDeltaItemKind(item); |
166 | 163 | switch (kind)
|
167 | 164 | {
|
168 | 165 | case DeltaItemKind.DeletedResource:
|
169 |
| - await WriteDeltaDeletedResourceAsync(item, writer, writeContext).ConfigureAwait(false); |
| 166 | + // hack. if the WriteDeltaDeletedResourceAsync isn't overridden, call the new version |
| 167 | + if (WriteDeltaDeletedResourceAsyncIsOverridden()) |
| 168 | + { |
| 169 | + await WriteDeltaDeletedResourceAsync(item, writer, writeContext).ConfigureAwait(false); |
| 170 | + } |
| 171 | + else |
| 172 | + { |
| 173 | + await WriteDeletedResourceAsync(item, elementType, writer, writeContext).ConfigureAwait(false); |
| 174 | + } |
170 | 175 | break;
|
171 | 176 | case DeltaItemKind.DeltaDeletedLink:
|
172 | 177 | await WriteDeltaDeletedLinkAsync(item, writer, writeContext).ConfigureAwait(false);
|
@@ -212,7 +217,7 @@ await entrySerializer.WriteDeltaObjectInlineAsync(item, elementType, writer, wri
|
212 | 217 | /// <param name="writeContext">The serializer context.</param>
|
213 | 218 | /// <returns>The function that generates the NextLink from an object.</returns>
|
214 | 219 | /// <returns></returns>
|
215 |
| - internal static Func<object, Uri> GetNextLinkGenerator(ODataDeltaResourceSet deltaResourceSet, IEnumerable enumerable, ODataSerializerContext writeContext) |
| 220 | + internal static Func<object, Uri> GetNextLinkGenerator(ODataResourceSetBase deltaResourceSet, IEnumerable enumerable, ODataSerializerContext writeContext) |
216 | 221 | {
|
217 | 222 | return ODataResourceSetSerializer.GetNextLinkGenerator(deltaResourceSet, enumerable, writeContext);
|
218 | 223 | }
|
@@ -266,6 +271,8 @@ public virtual ODataDeltaResourceSet CreateODataDeltaResourceSet(IEnumerable fee
|
266 | 271 | /// <param name="value">The object to be written.</param>
|
267 | 272 | /// <param name="writer">The <see cref="ODataDeltaWriter" /> to be used for writing.</param>
|
268 | 273 | /// <param name="writeContext">The <see cref="ODataSerializerContext"/>.</param>
|
| 274 | + [Obsolete("WriteDeltaDeletedResourceAsync(object, ODataWriter, ODataSerializerContext) is Deprecated and will be removed in the next version." + |
| 275 | + "Please use WriteDeletedResourceAsync(object, IEdmEntityTypeReference, ODataWriter, ODataSerializerContext)")] |
269 | 276 | public virtual async Task WriteDeltaDeletedResourceAsync(object value, ODataWriter writer, ODataSerializerContext writeContext)
|
270 | 277 | {
|
271 | 278 | if (writer == null)
|
@@ -304,6 +311,27 @@ public virtual async Task WriteDeltaDeletedResourceAsync(object value, ODataWrit
|
304 | 311 | }
|
305 | 312 | }
|
306 | 313 |
|
| 314 | + /// <summary> |
| 315 | + /// Writes the given deltaDeletedEntry specified by the parameter graph as a part of an existing OData message using the given |
| 316 | + /// messageWriter and the writeContext. |
| 317 | + /// </summary> |
| 318 | + /// <param name="value">The object to be written.</param> |
| 319 | + /// <param name="expectedType">The expected type of the deleted resource.</param> |
| 320 | + /// <param name="writer">The <see cref="ODataDeltaWriter" /> to be used for writing.</param> |
| 321 | + /// <param name="writeContext">The <see cref="ODataSerializerContext"/>.</param> |
| 322 | + public virtual async Task WriteDeletedResourceAsync(object value, IEdmStructuredTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext) |
| 323 | + { |
| 324 | + if (writer == null) |
| 325 | + { |
| 326 | + throw Error.ArgumentNull(nameof(writer)); |
| 327 | + } |
| 328 | + |
| 329 | + //todo:use serializer provider |
| 330 | + ODataDeletedResourceSerializer deletedResourceSerializer = new ODataDeletedResourceSerializer(SerializerProvider); |
| 331 | + |
| 332 | + await deletedResourceSerializer.WriteObjectInlineAsync(value, expectedType, writer, writeContext); |
| 333 | + } |
| 334 | + |
307 | 335 | /// <summary>
|
308 | 336 | /// Writes the given deltaDeletedLink specified by the parameter graph as a part of an existing OData message using the given
|
309 | 337 | /// messageWriter and the writeContext.
|
@@ -382,7 +410,7 @@ public virtual async Task WriteDeltaLinkAsync(object value, ODataWriter writer,
|
382 | 410 | }
|
383 | 411 | }
|
384 | 412 |
|
385 |
| - internal DeltaItemKind GetDelteItemKind(object item) |
| 413 | + internal DeltaItemKind GetDeltaItemKind(object item) |
386 | 414 | {
|
387 | 415 | IEdmChangedObject edmChangedObject = item as IEdmChangedObject;
|
388 | 416 | if (edmChangedObject != null)
|
@@ -414,4 +442,11 @@ private static IEdmStructuredTypeReference GetResourceType(IEdmTypeReference fee
|
414 | 442 | string message = Error.Format(SRResources.CannotWriteType, typeof(ODataDeltaResourceSetSerializer).Name, feedType.FullName());
|
415 | 443 | throw new SerializationException(message);
|
416 | 444 | }
|
| 445 | + |
| 446 | + private bool WriteDeltaDeletedResourceAsyncIsOverridden() |
| 447 | + { |
| 448 | + MethodInfo method = GetType().GetMethod("WriteDeltaDeletedResourceAsync", new Type[] { typeof(object), typeof(ODataWriter), typeof(ODataSerializerContext) }); |
| 449 | + Contract.Assert(method != null, "WriteDeltaDeletedResourceAsync is not defined."); |
| 450 | + return method.DeclaringType != typeof(ODataDeltaResourceSetSerializer); |
| 451 | + } |
417 | 452 | }
|
0 commit comments