@Test public void badRequestInChangeSet() { /* * A bad request (status code >= 400) without "continue on error prefer header" in a changeset * should return a single response with Content-Type: application/http * * See: * OData Version 4.0 Part 1: Protocol Plus Errata 01 * 11.7.4 Responding to a Batch Request * * When a request within a change set fails, the change set response is not represented using * the multipart/mixed media type. Instead, a single response, using the application/http media type * and a Content-Transfer-Encoding header with a value of binary, is returned that applies to all requests * in the change set and MUST be formatted according to the Error Handling defined * for the particular response format. */ // Try to create entity, with invalid type ClientObjectFactory factory = getFactory(); final ClientEntity entity = factory.newEntity(ES_NOT_AVAILABLE); entity .getProperties() .add( factory.newPrimitiveProperty( PROPERTY_STRING, factory.newPrimitiveValueBuilder().buildString("1"))); final ODataBatchRequest batchRequest = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payloadManager = batchRequest.payloadManager(); final ODataChangeset changeset = payloadManager.addChangeset(); final URI targetURI = getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment(ES_NOT_AVAILABLE_NAME) .build(); final ODataEntityCreateRequest<ClientEntity> createRequest = getClient().getCUDRequestFactory().getEntityCreateRequest(targetURI, entity); changeset.addRequest(createRequest); final ODataBatchResponse response = payloadManager.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); // Check response items final Iterator<ODataBatchResponseItem> responseBodyIter = response.getBody(); assertTrue(responseBodyIter.hasNext()); final ODataBatchResponseItem changeSetResponse = responseBodyIter.next(); assertTrue(changeSetResponse.isChangeset()); assertTrue(changeSetResponse.hasNext()); final ODataResponse updateResponse = changeSetResponse.next(); assertTrue(changeSetResponse.isBreaking()); assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), updateResponse.getStatusCode()); assertContentType(updateResponse.getContentType()); }
@Test public void changesetBatchRequest() throws URISyntaxException { final ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payload = request.payloadManager(); // ----------------------------- // - Append get request // ----------------------------- appendGetRequest(payload, "ESAllPrim", 32767, false); // Without error // ----------------------------- // - Append change set // ----------------------------- final ODataChangeset changeset = payload.addChangeset(); // ------------------------ // POST request (Insert) URIBuilder targetURI = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim"); URI editLink = targetURI.build(); ClientObjectFactory factory = getFactory(); ClientEntity postEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); postEntity.addLink( factory.newEntityNavigationLink( "NavPropertyETTwoPrimOne", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(32766) .build())); postEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); final ODataEntityCreateRequest<ClientEntity> createRequest = getClient().getCUDRequestFactory().getEntityCreateRequest(editLink, postEntity); createRequest.setFormat(ContentType.JSON); changeset.addRequest(createRequest); // ------------------------ // Patch request (Update) targetURI = getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESAllPrim") .appendKeySegment(0); editLink = targetURI.build(); ClientEntity patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); patchEntity.setEditLink(editLink); patchEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); ODataEntityUpdateRequest<ClientEntity> changeReq = getClient().getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity); changeReq.setFormat(ContentType.JSON); changeset.addRequest(changeReq); // ------------------------ // Patch request (Upsert) targetURI = getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESAllPrim") .appendKeySegment(15); editLink = targetURI.build(); patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); patchEntity.setEditLink(editLink); patchEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); patchEntity.addLink( factory.newEntityNavigationLink( "NavPropertyETTwoPrimOne", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(32766) .build())); changeReq = getClient().getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity); changeReq.setFormat(ContentType.JSON); changeset.addRequest(changeReq); // ----------------------------- // - Append get request // ----------------------------- appendGetRequest(payload, "ESAllPrim", 0, false); // Without error // ----------------------------- // - Fetch result // ----------------------------- final ODataBatchResponse response = payload.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody(); // Check first get request assertTrue(bodyIterator.hasNext()); ODataBatchResponseItem item = bodyIterator.next(); assertFalse(item.isChangeset()); assertTrue(item.hasNext()); final ODataResponse response0 = item.next(); assertTrue(response0 instanceof ODataRetrieveResponse); @SuppressWarnings("unchecked") ODataRetrieveResponse<ClientEntity> retrieveResponse = (ODataRetrieveResponse<ClientEntity>) response0; assertEquals( 34, retrieveResponse.getBody().getProperty("PropertyDecimal").getPrimitiveValue().toValue()); // Check change set assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertTrue(item.isChangeset()); // Insert assertTrue(item.hasNext()); final ODataResponse response1 = item.next(); assertEquals(HttpStatusCode.CREATED.getStatusCode(), response1.getStatusCode()); assertTrue(response1 instanceof ODataEntityCreateResponse); assertEquals( 3.1415, ((ODataEntityCreateResponse<?>) response1) .getBody() .getProperty("PropertyDouble") .getPrimitiveValue() .toValue()); // Update assertTrue(item.hasNext()); final ODataResponse response2 = item.next(); assertEquals(HttpStatusCode.OK.getStatusCode(), response2.getStatusCode()); assertTrue(response2 instanceof ODataEntityUpdateResponse); // Upsert assertTrue(item.hasNext()); final ODataResponse response3 = item.next(); assertEquals(HttpStatusCode.CREATED.getStatusCode(), response3.getStatusCode()); assertTrue(response3 instanceof ODataEntityUpdateResponse); assertEquals( 3.1415, ((ODataEntityUpdateResponse<?>) response3) .getBody() .getProperty("PropertyDouble") .getPrimitiveValue() .toValue()); // Check second get request assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertFalse(item.isChangeset()); assertTrue(item.hasNext()); final ODataResponse response4 = item.next(); assertTrue(response4 instanceof ODataRetrieveResponse); @SuppressWarnings("unchecked") final ODataRetrieveResponse<ClientEntity> retrieveResponse2 = (ODataRetrieveResponse<ClientEntity>) response4; assertEquals( 3.1415, retrieveResponse2.getBody().getProperty("PropertyDouble").getPrimitiveValue().toValue()); }