/// <summary> /// Generates extra request operations /// </summary> /// <param name="requestManager">RequestManager to build the operations.</param> /// <param name="baseUri">Base uri for the operations</param> /// <returns>An array of request operations.</returns> public static IMimePart[] ExtraRequestOperations(IODataRequestManager requestManager, ODataUri baseUri) { ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager"); ExceptionUtilities.CheckArgumentNotNull(baseUri, "baseUri"); var headers = new Dictionary <string, string> { { "RequestHeader", "RequestHeaderValue" } }; string mergeContentType = HttpUtilities.BuildContentType(MimeTypes.ApplicationXml, Encoding.UTF8.WebName, null); List <IHttpRequest> requests = new List <IHttpRequest>(); requests.Add(requestManager.BuildRequest(baseUri, HttpVerb.Get, headers)); var segments = baseUri.Segments; ODataUriSegment[] segmentstoadd = { ODataUriBuilder.EntitySet(new EntitySet("Set1")), ODataUriBuilder.EntityType(new EntityType("EntityType")), ODataUriBuilder.EntitySet(new EntitySet("Set2")), ODataUriBuilder.EntityType(new EntityType("EntityType2")), }; foreach (var segment in segmentstoadd) { requests.Add(requestManager.BuildRequest(new ODataUri(segments.ConcatSingle(segment)), HttpVerb.Get, headers)); } return(requests.ToArray()); }
private ODataUri BuildODataUri(ODataPayloadElement payload) { var entityInstance = payload as EntityInstance; if (entityInstance != null) { EntityModelTypeAnnotation type = entityInstance.GetAnnotation <EntityModelTypeAnnotation>(); ExceptionUtilities.CheckObjectNotNull(type, "Type annotation was expected"); var entityType = ((EntityDataType)type.EntityModelType).Definition; // First is OK because MEST doesnt matter var entitySet = entityType.Model.EntityContainers.SelectMany(c => c.EntitySets).First(s => s.EntityType == entityType); return(new ODataUri(ODataUriBuilder.EntitySet(entitySet))); } var complexProperty = payload as ComplexProperty; if (complexProperty != null) { EntityModelTypeAnnotation type = entityInstance.GetAnnotation <EntityModelTypeAnnotation>(); ExceptionUtilities.CheckObjectNotNull(type, "Type annotation was expected"); var entityType = ((EntityDataType)type.EntityModelType).Definition; // First is OK because MEST doesnt matter var entitySet = entityType.Model.EntityContainers.SelectMany(c => c.EntitySets).First(s => s.EntityType == entityType); return(new ODataUri(ODataUriBuilder.EntitySet(entitySet))); } // TODO: Add support for other types return(null); }
private ODataUri GenerateEntityIdUri(EntitySet entitySet, EntityType entityType, IEnumerable <NamedValue> keyValues) { ExceptionUtilities.CheckAllRequiredDependencies(this); // null checks performed by ODataUriBuilder var conventionalId = new ODataUri(); conventionalId.Segments.Add(new ServiceRootSegment(this.Service.ServiceUri)); conventionalId.Segments.Add(ODataUriBuilder.EntitySet(entitySet)); conventionalId.Segments.Add(ODataUriBuilder.Key(entityType, keyValues)); return(conventionalId); }
private static ODataUri GetTopLevelUri(QueryStructuralValue entity) { ExceptionUtilities.CheckArgumentNotNull(entity, "entity"); QueryEntityType entityType = entity.Type as QueryEntityType; ExceptionUtilities.CheckObjectNotNull(entityType, "Given structural value was not an entity type"); var setSegment = ODataUriBuilder.EntitySet(entityType.EntitySet); var keyValues = entityType.EntityType.AllKeyProperties.Select(k => new NamedValue(k.Name, entity.GetScalarValue(k.Name).Value)); var keySegment = ODataUriBuilder.Key(entityType.EntityType, keyValues); return(new ODataUri(setSegment, keySegment)); }
public void BatchReaderMixedEncodingTest() { EdmModel model = new EdmModel(); EdmEntityType personType = model.EntityType("Person") .KeyProperty("Id", EdmCoreModel.Instance.GetInt32(false) as EdmTypeReference) .Property("Name", EdmPrimitiveTypeKind.String, isNullable: true); model.Fixup(); EdmEntitySet personSet = model.EntitySet("Person", personType); EntityInstance personInstance = PayloadBuilder.Entity("TestModel.Person") .Property("Id", PayloadBuilder.PrimitiveValue(1)) .Property("Name", PayloadBuilder.PrimitiveValue("Mr Foo Baz")); ODataUriSegment root = ODataUriBuilder.Root(new Uri("http://www.odata.org")); ODataUri testUri = new ODataUri(root, ODataUriBuilder.EntitySet(personSet)); Encoding[] encodings = new Encoding[] { Encoding.UTF8, Encoding.BigEndianUnicode, Encoding.Unicode }; IEnumerable <BatchReaderMixedEncodingTestCase> testCases = encodings.SelectMany(batchEncoding => encodings.Select(changesetEncoding => new BatchReaderMixedEncodingTestCase { BatchEncoding = batchEncoding, Changesets = new[] { new BatchReaderMixedEncodingChangeset { ChangesetEncoding = changesetEncoding, Operations = new[] { new BatchReaderMixedEncodingOperation { OperationEncoding = Encoding.Unicode, PayloadFormat = ODataFormat.Atom, }, new BatchReaderMixedEncodingOperation { // Uses changeset's encoding PayloadFormat = ODataFormat.Atom, }, }, }, new BatchReaderMixedEncodingChangeset { Operations = new[] { new BatchReaderMixedEncodingOperation { // Uses batch's encoding OperationEncoding = batchEncoding, PayloadFormat = ODataFormat.Atom, }, }, }, }, } )); this.CombinatorialEngineProvider.RunCombinations( testCases, this.ReaderTestConfigurationProvider.DefaultFormatConfigurations, (testCase, testConfiguration) => { var testPayload = personInstance.DeepCopy(); if (!testConfiguration.IsRequest) { testPayload.AddAnnotation(new PayloadFormatVersionAnnotation() { Response = true, ResponseWrapper = true }); } var testDescriptor = this.CreateTestDescriptor(testCase, testPayload, testUri, testConfiguration.IsRequest); testDescriptor.PayloadEdmModel = model; testDescriptor.RunTest(testConfiguration); }); }
/// <summary> /// Creates several PayloadTestDescriptors containing Batch Requests /// </summary> /// <param name="requestManager">Used for building the requests</param> /// <param name="model">The model to use for adding additional types.</param> /// <param name="withTypeNames">Whether or not to use full type names.</param> /// <returns>PayloadTestDescriptors</returns> public static IEnumerable <PayloadTestDescriptor> CreateBatchRequestTestDescriptors( IODataRequestManager requestManager, EdmModel model, bool withTypeNames = false) { ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager"); EdmEntityType personType = null; EdmComplexType carType = null; EdmEntitySet personsEntitySet = null; EdmEntityContainer container = model.EntityContainer as EdmEntityContainer; if (model != null) { //TODO: Clone EdmModel //model = model.Clone(); if (container == null) { container = new EdmEntityContainer("TestModel", "DefaultContainer"); model.AddElement(container); } personType = model.FindDeclaredType("TestModel.TFPerson") as EdmEntityType; carType = model.FindDeclaredType("TestModel.TFCar") as EdmComplexType; // Create the metadata types for the entity instance used in the entity set if (carType == null) { carType = new EdmComplexType("TestModel", "TFCar"); model.AddElement(carType); carType.AddStructuralProperty("Make", EdmPrimitiveTypeKind.String, true); carType.AddStructuralProperty("Color", EdmPrimitiveTypeKind.String, true); } if (personType == null) { personType = new EdmEntityType("TestModel", "TFPerson"); model.AddElement(personType); personType.AddKeys(personType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32)); personType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String, true); personType.AddStructuralProperty("Car", carType.ToTypeReference()); container.AddEntitySet("Customers", personType); } personsEntitySet = container.AddEntitySet("People", personType); } ComplexInstance carInstance = PayloadBuilder.ComplexValue(withTypeNames ? "TestModel.TFCar" : null) .Property("Make", PayloadBuilder.PrimitiveValue("Ford")) .Property("Color", PayloadBuilder.PrimitiveValue("Blue")); ComplexProperty carProperty = (ComplexProperty)PayloadBuilder.Property("Car", carInstance) .WithTypeAnnotation(personType); EntityInstance personInstance = PayloadBuilder.Entity(withTypeNames ? "TestModel.TFPerson" : null) .Property("Id", PayloadBuilder.PrimitiveValue(1)) .Property("Name", PayloadBuilder.PrimitiveValue("John Doe")) .Property("Car", carInstance) .WithTypeAnnotation(personType); var carPropertyPayload = new PayloadTestDescriptor() { PayloadElement = carProperty, PayloadEdmModel = model }; var emptyPayload = new PayloadTestDescriptor() { PayloadEdmModel = CreateEmptyEdmModel() }; var personPayload = new PayloadTestDescriptor() { PayloadElement = personInstance, PayloadEdmModel = model }; var root = ODataUriBuilder.Root(new Uri("http://www.odata.org/service.svc")); var entityset = ODataUriBuilder.EntitySet(personsEntitySet); // Get operations var queryOperation1 = emptyPayload.InRequestOperation(HttpVerb.Get, new ODataUri(new ODataUriSegment[] { root }), requestManager); var queryOperation2 = emptyPayload.InRequestOperation(HttpVerb.Get, new ODataUri(new ODataUriSegment[] { root }), requestManager); // Post operation containing a complex property var postOperation = carPropertyPayload.InRequestOperation(HttpVerb.Post, new ODataUri(new ODataUriSegment[] { root, entityset }), requestManager, MimeTypes.ApplicationJsonLight); // Delete operation with no payload var deleteOperation = emptyPayload.InRequestOperation(HttpVerb.Delete, new ODataUri(new ODataUriSegment[] { root, entityset }), requestManager); // Put operation where the payload is an EntityInstance var putOperation = personPayload.InRequestOperation(HttpVerb.Put, new ODataUri(new ODataUriSegment[] { root, entityset }), requestManager); // A changeset containing a delete with no payload and a put var twoOperationsChangeset = BatchUtils.GetRequestChangeset(new IMimePart[] { postOperation, deleteOperation }, requestManager); // A changeset containing a delete with no payload var oneOperationChangeset = BatchUtils.GetRequestChangeset(new IMimePart[] { deleteOperation }, requestManager); // A changeset containing a put, post and delete var threeOperationsChangeset = BatchUtils.GetRequestChangeset(new IMimePart[] { putOperation, postOperation, deleteOperation }, requestManager); // A changeset containing no operations var emptyChangeset = BatchUtils.GetRequestChangeset(new IMimePart[] { }, requestManager); // Empty Batch yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload() .AddAnnotation(new BatchBoundaryAnnotation("bb_emptybatch")), PayloadEdmModel = emptyPayload.PayloadEdmModel, SkipTestConfiguration = (tc) => !tc.IsRequest, }); // Single Operation yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1) .AddAnnotation(new BatchBoundaryAnnotation("bb_singleoperation")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); // Multiple Operations yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1, queryOperation2) .AddAnnotation(new BatchBoundaryAnnotation("bb_multipleoperations")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); // Single Changeset yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(twoOperationsChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_singlechangeset")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); // Multiple Changesets (different content types) yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(twoOperationsChangeset, oneOperationChangeset, emptyChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_multiplechangesets")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); // Operations and changesets yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(twoOperationsChangeset, queryOperation1, oneOperationChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_operationsandchangesets_1")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1, oneOperationChangeset, queryOperation2) .AddAnnotation(new BatchBoundaryAnnotation("bb_operationsandchangesets_2")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1, queryOperation2, twoOperationsChangeset, oneOperationChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_operationsandchangesets_3")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1, threeOperationsChangeset, queryOperation2, twoOperationsChangeset, queryOperation1, oneOperationChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_operationsandchangesets_4")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); yield return(new PayloadTestDescriptor() { PayloadElement = PayloadBuilder.BatchRequestPayload(queryOperation1, emptyChangeset, queryOperation1, threeOperationsChangeset, queryOperation2, oneOperationChangeset) .AddAnnotation(new BatchBoundaryAnnotation("bb_operationsandchangesets_5")), PayloadEdmModel = model, SkipTestConfiguration = (tc) => !tc.IsRequest, }); }
private IHttpRequest GenerateRequestOperation(ODataResponse batchResponseOperation, EntityModelSchema model) { ExceptionUtilities.CheckArgumentNotNull(batchResponseOperation, "batchResponseOperation"); ExceptionUtilities.CheckArgumentNotNull(model, "model"); var headers = new Dictionary <string, string> { { "GivenPayloadRequestHeader", "PayloadHeaderValue" } }; string mergeContentType = HttpUtilities.BuildContentType(MimeTypes.ApplicationXml, Encoding.UTF8.WebName, null); ODataUri uri = null; HttpVerb verb = HttpVerb.Get; if (batchResponseOperation.RootElement != null) { var complexInstanceCollection = batchResponseOperation.RootElement as ComplexInstanceCollection; if (complexInstanceCollection != null) { var function = batchResponseOperation.RootElement.GetAnnotation <FunctionAnnotation>(); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.ServiceOperation(function.Function)); } var complexMultivalue = batchResponseOperation.RootElement as ComplexMultiValueProperty; if (complexMultivalue != null) { var entityType = complexMultivalue.GetAnnotation <EntityModelTypeAnnotation>().EntityModelType as EntityDataType; var entitySet = model.GetEntitySet(entityType.Definition.Name); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.EntitySet(entitySet), ODataUriBuilder.Property(entityType.Definition, complexMultivalue.Name)); } var complexProperty = batchResponseOperation.RootElement as ComplexProperty; if (complexProperty != null) { var type = complexProperty.GetAnnotation <EntityModelTypeAnnotation>(); var complexDataType = type.EntityModelType as ComplexDataType; // Using first because we don't need a specific entity just one that contains this type. If there is more than one the first works fine. var entityType = model.EntityTypes.Where(et => et.Properties.Where(p => p.Name == complexProperty.Name).Count() == 1).First(); var complexType = model.ComplexTypes.Where(ct => complexDataType.Definition.Name == ct.Name).Single(); var complexPropertyName = entityType.AllProperties.Where(p => { var complex = p.PropertyType as ComplexDataType; if (complex == null) { return(false); } return(complex.Definition.Name == complexDataType.Definition.Name); }).Single(); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.Property(entityType, complexPropertyName.Name)); } var deferredLink = batchResponseOperation.RootElement as DeferredLink; if (deferredLink != null) { var navigationProperty = deferredLink.GetAnnotation <NavigationPropertyAnnotation>(); var entityType = model.EntityTypes.Where(et => et.Properties.Where(p => p.Name == navigationProperty.Property.Name).Count() == 1).First(); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.Property(entityType, navigationProperty.Property.Name)); } var linkCollection = batchResponseOperation.RootElement as LinkCollection; if (linkCollection != null) { uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), SystemSegment.EntityReferenceLinks); } var entityInstance = batchResponseOperation.RootElement as EntityInstance; if (entityInstance != null) { var type = entityInstance.GetAnnotation <EntityModelTypeAnnotation>().EntityModelType as EntityDataType; var entitySetType = model.GetEntitySet(type.Definition.Name); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.EntitySet(entitySetType)); } var entitySetInstance = batchResponseOperation.RootElement as EntitySetInstance; if (entitySetInstance != null) { var entitySetType = model.GetEntitySet(entityInstance.FullTypeName); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.EntitySet(entitySetType)); } var primitiveCollection = batchResponseOperation.RootElement as PrimitiveCollection; if (primitiveCollection != null) { var function = batchResponseOperation.RootElement.GetAnnotation <FunctionAnnotation>(); uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.ServiceOperation(function.Function)); } var primitiveMultiValueProperty = batchResponseOperation.RootElement as PrimitiveMultiValueProperty; if (primitiveMultiValueProperty != null) { var type = primitiveMultiValueProperty.GetAnnotation <EntityModelTypeAnnotation>(); var entityType = type.EntityModelType as EntityDataType; uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.EntitySet(model.GetEntitySet(entityType.Definition.Name)), ODataUriBuilder.Property(entityType.Definition, primitiveMultiValueProperty.Name)); } var primitiveProperty = batchResponseOperation.RootElement as PrimitiveProperty; if (primitiveProperty != null) { var type = complexProperty.GetAnnotation <EntityModelTypeAnnotation>(); var entityType = type.EntityModelType as EntityDataType; uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.Property(entityType.Definition, primitiveProperty.Name)); } var primitiveValue = batchResponseOperation.RootElement as PrimitiveValue; if (primitiveValue != null) { var primitiveType = primitiveValue.GetAnnotation <DataTypeAnnotation>(); var entityType = primitiveValue.GetAnnotation <EntityModelTypeAnnotation>().EntityModelType as EntityDataType; var propertyName = entityType.Definition.Properties.Where(p => p.PropertyType == primitiveType.DataType).First().Name; uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org")), ODataUriBuilder.Property(entityType.Definition, propertyName), SystemSegment.Value); } var odataError = batchResponseOperation.RootElement as ODataErrorPayload; if (odataError != null) { uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org"))); } } else { verb = HttpVerb.Put; uri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org"))); } ExceptionUtilities.Assert(uri != null, "The request URI has not been defined."); var request = this.RequestManager.BuildRequest(uri, verb, headers); return(request); }