/// <summary> /// Visits a collection start. /// </summary> /// <param name="collection">The collection start to visit.</param> protected virtual void VisitCollectionStart(ODataCollectionStart collectionStart) { ODataCollectionItemsObjectModelAnnotation items = collectionStart.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); if (items != null) { foreach (object item in items) { this.Visit(item); } } }
/// <summary> /// Calls the base class method to process the primitive collection. /// </summary> /// <param name="payloadElement">The primitive collection to process.</param> public override void Visit(PrimitiveCollection payloadElement) { ODataCollectionStart collectionStart = new ODataCollectionStart(); var annotation = new ODataCollectionItemsObjectModelAnnotation(); foreach (var primitive in payloadElement) { annotation.Add(primitive.ClrValue); } collectionStart.SetAnnotation <ODataCollectionItemsObjectModelAnnotation>(annotation); }
/// <summary> /// Visits a collection start. /// </summary> /// <param name="collection">The collection start to visit.</param> protected override ODataPayloadElement VisitCollectionStart(ODataCollectionStart collection) { ExceptionUtilities.CheckArgumentNotNull(collection, "collection"); // NOTE the Taupo OM does not currently support heterogenous collections; we determine the // type of the collection by looking at the first non-null item ODataCollectionItemsObjectModelAnnotation itemsAnnotation = collection.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); ExceptionUtilities.Assert(itemsAnnotation != null, "itemsAnnotation != null"); // NOTE we assume that it is a primitive collection; if we find a collection of only null items we treat it as primitive bool isComplexCollection = false; foreach (object item in itemsAnnotation) { if (item != null) { isComplexCollection = item is ODataComplexValue; break; } } if (isComplexCollection) { ComplexInstanceCollection complexCollection = PayloadBuilder.ComplexCollection(collection.Name); foreach (object item in itemsAnnotation) { ComplexInstance complexInstance = item == null ? new ComplexInstance(null, /*isNull*/ true) : (ComplexInstance)this.Visit((ODataComplexValue)item); complexCollection.Add(complexInstance); } return(complexCollection); } else { PrimitiveCollection primitiveCollection = PayloadBuilder.PrimitiveCollection(collection.Name); foreach (object item in itemsAnnotation) { PrimitiveValue primitiveValue = (PrimitiveValue)this.Visit(item); primitiveCollection.Add(primitiveValue); } return(primitiveCollection); } }
/// <summary> /// Visits a collection start. /// </summary> /// <param name="collection">The collection start to visit.</param> protected override ODataPayloadElement VisitCollectionStart(ODataCollectionStart collection) { ExceptionUtilities.CheckArgumentNotNull(collection, "collection"); // NOTE the Taupo OM does not currently support heterogenous collections; we determine the // type of the collection by looking at the first non-null item ODataCollectionItemsObjectModelAnnotation itemsAnnotation = collection.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); ExceptionUtilities.Assert(itemsAnnotation != null, "itemsAnnotation != null"); PrimitiveCollection primitiveCollection = PayloadBuilder.PrimitiveCollection(collection.Name); foreach (object item in itemsAnnotation) { PrimitiveValue primitiveValue = (PrimitiveValue)this.Visit(item); primitiveCollection.Add(primitiveValue); } return(primitiveCollection); }
/// <summary> /// Calls the base class method to process the instance collection. /// </summary> /// <param name="payloadElement">The complex instance collection to process.</param> public override void Visit(ComplexInstanceCollection payloadElement) { ODataCollectionStart collectionStart = new ODataCollectionStart(); this.items.Push(collectionStart); var annotation = new ODataCollectionItemsObjectModelAnnotation(); foreach (var complex in payloadElement) { this.items.Push(new ODataComplexValue() { TypeName = complex.FullTypeName }); this.Recurse(complex); annotation.Add(this.items.Pop()); } collectionStart.SetAnnotation <ODataCollectionItemsObjectModelAnnotation>(annotation); }
/// <summary> /// Visits a collection of parameters. /// </summary> /// <param name="parameters">The parameters to visit.</param> protected override ODataPayloadElement VisitParameters(ODataParameters parameters) { ExceptionUtilities.CheckArgumentNotNull(parameters, "parameters"); ComplexInstance result = new ComplexInstance(); result.IsNull = parameters.Count == 0; foreach (var parameter in parameters) { if (parameter.Value == null) { result.Add(new PrimitiveProperty(parameter.Key, null, null)); continue; } ODataCollectionStart odataCollectionStart = parameter.Value as ODataCollectionStart; if (odataCollectionStart != null) { ODataCollectionItemsObjectModelAnnotation annotation = odataCollectionStart.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); PrimitiveMultiValue primitiveCollection = PayloadBuilder.PrimitiveMultiValue(); foreach (var value in annotation) { primitiveCollection.Item(value); } PrimitiveMultiValueProperty primitiveCollectionProperty = new PrimitiveMultiValueProperty(parameter.Key, primitiveCollection); result.Add(primitiveCollectionProperty); } else { result.Add(new PrimitiveProperty(parameter.Key, null, PayloadBuilder.PrimitiveValue(parameter.Value).ClrValue)); } } return(result); }
/// <summary> /// Read a collection as the message content. /// </summary> /// <param name="collectionReader">The collection reader to use for reading.</param> /// <returns>An <see cref="ODataCollectionStart"/>, possibly with annotations.</returns> public object ReadCollection(ODataCollectionReader collectionReader) { try { // read the start of the collection collectionReader.Read(); this.assert.AreEqual(ODataCollectionReaderState.CollectionStart, collectionReader.State, "Reader states don't match."); // NOTE: collection names are only present in ATOM; for JSON the name will be 'null' ODataCollectionStart collectionStart = (ODataCollectionStart)collectionReader.Item; ODataCollectionItemsObjectModelAnnotation itemsAnnotation = new ODataCollectionItemsObjectModelAnnotation(); while (collectionReader.Read()) { if (collectionReader.State == ODataCollectionReaderState.Value) { object item = collectionReader.Item; itemsAnnotation.Add(item); } else { break; } } this.assert.AreEqual(ODataCollectionReaderState.CollectionEnd, collectionReader.State, "Reader states don't match."); collectionReader.Read(); this.assert.AreEqual(ODataCollectionReaderState.Completed, collectionReader.State, "Reader states don't match."); // attach the items to the collection and return it collectionStart.SetAnnotation(itemsAnnotation); return collectionStart; } catch (Exception e) { if (ExceptionUtilities.IsCatchable(e)) { this.assert.AreEqual(ODataCollectionReaderState.Exception, collectionReader.State, "Expected the reader to be in 'Exception' state."); } throw; } }
/// <summary> /// Calls the base class method to process the primitive collection. /// </summary> /// <param name="payloadElement">The primitive collection to process.</param> public override void Visit(PrimitiveCollection payloadElement) { ODataCollectionStart collectionStart = new ODataCollectionStart(); var annotation = new ODataCollectionItemsObjectModelAnnotation(); foreach (var primitive in payloadElement) { annotation.Add(primitive.ClrValue); } collectionStart.SetAnnotation<ODataCollectionItemsObjectModelAnnotation>(annotation); }
/// <summary> /// Calls the base class method to process the instance collection. /// </summary> /// <param name="payloadElement">The complex instance collection to process.</param> public override void Visit(ComplexInstanceCollection payloadElement) { ODataCollectionStart collectionStart = new ODataCollectionStart(); this.items.Push(collectionStart); var annotation = new ODataCollectionItemsObjectModelAnnotation(); foreach (var complex in payloadElement) { this.items.Push(new ODataComplexValue() { TypeName = complex.FullTypeName }); this.Recurse(complex); annotation.Add(this.items.Pop()); } collectionStart.SetAnnotation<ODataCollectionItemsObjectModelAnnotation>(annotation); }
/// <summary> /// Visits a collection of parameters. /// </summary> /// <param name="parameters">The parameters to visit.</param> protected override ODataPayloadElement VisitParameters(ODataParameters parameters) { ExceptionUtilities.CheckArgumentNotNull(parameters, "parameters"); ComplexInstance result = new ComplexInstance(); result.IsNull = parameters.Count == 0; foreach (var parameter in parameters) { if (parameter.Value == null) { result.Add(new PrimitiveProperty(parameter.Key, null, null)); continue; } ODataComplexValue odataComplexValue = parameter.Value as ODataComplexValue; ODataCollectionStart odataCollectionStart = parameter.Value as ODataCollectionStart; if (odataCollectionStart != null) { ODataCollectionItemsObjectModelAnnotation annotation = odataCollectionStart.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); if (annotation.OfType <ODataComplexValue>().FirstOrDefault() != null) { ComplexMultiValue complexCollection = PayloadBuilder.ComplexMultiValue(); foreach (var value in annotation) { complexCollection.Item(this.VisitComplexValue(value as ODataComplexValue) as ComplexInstance); } ComplexMultiValueProperty complexCollectionProperty = new ComplexMultiValueProperty(parameter.Key, complexCollection); result.Add(complexCollectionProperty); } else { PrimitiveMultiValue primitiveCollection = PayloadBuilder.PrimitiveMultiValue(); foreach (var value in annotation) { primitiveCollection.Item(value); } PrimitiveMultiValueProperty primitiveCollectionProperty = new PrimitiveMultiValueProperty(parameter.Key, primitiveCollection); result.Add(primitiveCollectionProperty); } } else if (odataComplexValue != null) { ComplexInstance complexInstance = PayloadBuilder.ComplexValue(odataComplexValue.TypeName); complexInstance.IsNull = false; foreach (ODataProperty odataProperty in odataComplexValue.Properties) { complexInstance.Property(odataProperty.Name, this.Visit(odataProperty.Value)); } result.Add(new ComplexProperty(parameter.Key, complexInstance)); } else { result.Add(new PrimitiveProperty(parameter.Key, null, PayloadBuilder.PrimitiveValue(parameter.Value).ClrValue)); } } return(result); }