blob: d92d7b3acf94b6984b233de4eb03db20304c3625 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.fit.tecsvc.client;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Iterator;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.ODataClientErrorException;
import org.apache.olingo.client.api.communication.request.batch.BatchManager;
import org.apache.olingo.client.api.communication.request.batch.ODataBatchRequest;
import org.apache.olingo.client.api.communication.request.batch.ODataBatchResponseItem;
import org.apache.olingo.client.api.communication.request.batch.ODataChangeset;
import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
import org.apache.olingo.client.api.communication.request.cud.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityCreateRequest;
import org.apache.olingo.client.api.communication.response.ODataBatchResponse;
import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.domain.ClientEntity;
import org.apache.olingo.client.api.domain.ClientEntitySet;
import org.apache.olingo.client.api.domain.ClientObjectFactory;
import org.apache.olingo.client.api.domain.ClientProperty;
import org.apache.olingo.client.api.http.HttpClientException;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.format.PreferenceName;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.junit.Before;
import org.junit.Test;
public class BatchClientITCase extends AbstractParamTecSvcITCase {
private static final String ES_NOT_AVAILABLE_NAME = "ESNotAvailable";
private static final FullQualifiedName ES_NOT_AVAILABLE =
new FullQualifiedName(SERVICE_NAMESPACE, ES_NOT_AVAILABLE_NAME);
private static final String PROPERTY_STRING = "PropertyString";
@Before
public void setup() {
getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
getClient().getConfiguration().setContinueOnError(false);
}
@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")));
BatchManager payloadManager = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).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.OK.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 emptyBatchRequest() {
// create your request
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
final ODataBatchResponse response = request.payloadManager().getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
assertEquals("OK", response.getStatusMessage());
final Iterator<ODataBatchResponseItem> iter = response.getBody();
assertFalse(iter.hasNext());
}
@Test
public void getBatchRequestWithRelativeUris() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
payload.addRequest(createGetRequest("ESAllPrim", 32767, true));
// Fetch result
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
assertEquals("OK", response.getStatusMessage());
final Iterator<ODataBatchResponseItem> iter = response.getBody();
assertTrue(iter.hasNext());
ODataBatchResponseItem item = iter.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next());
assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
assertEquals(isJson() ? "605" : "2223", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next());
assertContentType(oDataResponse.getContentType());
}
@Test
public void getBatchRequest() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
// create new request
payload.addRequest(createGetRequest("ESAllPrim", 32767, false));
// Fetch result
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
assertEquals("OK", response.getStatusMessage());
final Iterator<ODataBatchResponseItem> iter = response.getBody();
assertTrue(iter.hasNext());
ODataBatchResponseItem item = iter.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next());
assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
assertEquals(isJson() ? "605" : "2223", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next());
assertContentType(oDataResponse.getContentType());
}
@Test
public void binaryContent() throws Exception {
BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
ODataMediaEntityCreateRequest<ClientEntity> request = getClient().getCUDRequestFactory()
.getMediaEntityCreateRequest(
getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESMedia").build(),
new ByteArrayInputStream(new byte[] { -42, 0, 1 }));
request.setContentType(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString());
request.addCustomHeader("Custom-Header-0123456789", "!!!");
payload.addRequest(request);
payload.addRequest(getClient().getRetrieveRequestFactory().getMediaRequest(URI.create(
"ESMedia(5)/$value")));
final ODataBatchResponse response = payload.getResponse();
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
Iterator<ODataBatchResponseItem> iter = response.getBody();
assertTrue(iter.hasNext());
ODataBatchResponseItem item = iter.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.CREATED.getStatusCode(), oDataResponse.getStatusCode());
assertFalse(item.hasNext());
assertTrue(iter.hasNext());
oDataResponse = iter.next().next();
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString(), oDataResponse.getContentType());
// TODO: Correct the client code so that the following content verification can be enabled.
// InputStream rawResponse = oDataResponse.getRawResponse();
// assertEquals(-42, (byte) rawResponse.read());
// assertEquals(0, rawResponse.read());
// assertEquals(1, rawResponse.read());
// assertEquals(-1, rawResponse.read());
assertFalse(iter.hasNext());
}
@Test
public void absolutePath() {
BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
final URI uri = URI.create(
getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESTwoPrim").appendKeySegment(32767).build()
.getRawPath());
ODataPropertyRequest<ClientProperty> request = getClient().getRetrieveRequestFactory()
.getPropertyRequest(uri);
setCookieHeader(request);
request.addCustomHeader("Custom-Header-0123456789", "!!!");
payload.addRequest(request);
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
Iterator<ODataBatchResponseItem> iter = response.getBody();
assertTrue(iter.hasNext());
ODataBatchResponseItem item = iter.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertFalse(item.hasNext());
assertFalse(iter.hasNext());
}
@Test
public void errorWithoutContinueOnErrorPreferHeader() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
payload.addRequest(createGetRequest("ESAllPrim", 32767, false)); // Without error
payload.addRequest(createGetRequest("ESAllPrim", 42, false)); // Error ( Key does not exist )
payload.addRequest(createGetRequest("ESAllPrim", 0, false)); // Without error
// Fetch result
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
final Iterator<ODataBatchResponseItem> iter = response.getBody();
// Check first get request
assertTrue(iter.hasNext());
ODataBatchResponseItem item = iter.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next());
assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
assertEquals(isJson() ? "605" : "2223", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next());
assertContentType(oDataResponse.getContentType());
// Check second get request
assertTrue(iter.hasNext());
item = iter.next();
assertFalse(item.isChangeset());
oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), oDataResponse.getStatusCode());
// Check if third request is available
assertFalse(iter.hasNext());
}
@Test
public void invalidAbsoluteUri() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
ODataEntityRequest<ClientEntity> queryReq = getClient().getRetrieveRequestFactory().getEntityRequest(URI.create(
SERVICE_URI + "../ESAllPrim(32767)"));
queryReq.setFormat(getContentType());
payload.addRequest(queryReq);
// Fetch result
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
assertTrue(bodyIterator.hasNext());
ODataBatchResponseItem item = bodyIterator.next();
assertFalse(item.isChangeset());
final ODataResponse oDataResponse = item.next();
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), oDataResponse.getStatusCode());
}
@Test
public void invalidHost() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
payload.addRequest(getClient().getRetrieveRequestFactory().getEntityRequest(URI.create(
"http://otherhost/odata/ESAllPrim(32767)")));
try {
payload.getResponse();
} catch (final HttpClientException e) {
assertTrue(e.getCause().getCause() instanceof ODataClientErrorException);
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(),
((ODataClientErrorException) e.getCause().getCause()).getStatusLine().getStatusCode());
}
}
@Test
public void invalidAbsoluteRequest() {
ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
payload.addRequest(getClient().getRetrieveRequestFactory().getEntityRequest(URI.create(
"/ESAllPrim(32767)")));
try {
payload.getResponse();
} catch (final HttpClientException e) {
assertTrue(e.getCause().getCause() instanceof ODataClientErrorException);
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(),
((ODataClientErrorException) e.getCause().getCause()).getStatusLine().getStatusCode());
}
}
@Test
public void errorWithContinueOnErrorPreferHeader() {
ODataClient client = getClient();
client.getConfiguration().setContinueOnError(true);
ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
setCookieHeader(request);
BatchManager payload = request.payloadManager();
payload.addRequest(createGetRequest("ESAllPrim", 32767, false)); // Without error
payload.addRequest(createGetRequest("ESAllPrim", 42, false)); // Error ( Key does not exist )
payload.addRequest(createGetRequest("ESAllPrim", 0, false)); // Without error
// Fetch result
final ODataBatchResponse response = payload.getResponse();
saveCookieHeader(response);
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
assertEquals(PreferenceName.CONTINUE_ON_ERROR.getName(),
response.getHeader(HttpHeader.PREFERENCE_APPLIED).iterator().next());
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
// Check first get request
assertTrue(bodyIterator.hasNext());
ODataBatchResponseItem item = bodyIterator.next();
assertFalse(item.isChangeset());
ODataResponse oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next());
assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
assertEquals(isJson() ? "605" : "2223", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next());
assertContentType(oDataResponse.getContentType());
// Check second get request
assertTrue(bodyIterator.hasNext());
item = bodyIterator.next();
assertFalse(item.isChangeset());
oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), oDataResponse.getStatusCode());
// Check if third request is available
assertTrue(bodyIterator.hasNext());
item = bodyIterator.next();
assertFalse(item.isChangeset());
oDataResponse = item.next();
assertNotNull(oDataResponse);
assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode());
assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next());
assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
assertEquals(isJson() ? "517" : "2114", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next());
assertContentType(oDataResponse.getContentType());
}
@Test
public void changesetWithReferences() {
BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
final ODataChangeset changeset = payload.addChangeset();
final ClientEntity entityESAllPrim = getFactory().newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
entityESAllPrim.getProperties().add(getFactory().newPrimitiveProperty("PropertyDouble",
getFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
entityESAllPrim.addLink(
getFactory().newEntityNavigationLink("NavPropertyETTwoPrimOne", getClient().newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(-365)
.build()));
final URI uri = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").build();
// add create request
final ODataEntityCreateRequest<ClientEntity> createReq =
getClient().getCUDRequestFactory().getEntityCreateRequest(uri, entityESAllPrim);
createReq.setFormat(getContentType());
changeset.addRequest(createReq);
// retrieve request reference
int createRequestRef = changeset.getLastContentId();
// add update request
final ClientEntity entityUpdate = getFactory().newEntity(entityESAllPrim.getTypeName());
entityUpdate.addLink(getFactory().newEntitySetNavigationLink("NavPropertyETTwoPrimMany",
getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESTwoPrim").appendKeySegment(32767).build()));
final ODataEntityUpdateRequest<ClientEntity> updateReq = getClient().getCUDRequestFactory().getEntityUpdateRequest(
URI.create("$" + createRequestRef), UpdateType.PATCH, entityUpdate);
updateReq.setFormat(getContentType());
changeset.addRequest(updateReq);
final ODataBatchResponse response = payload.getResponse();
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
final String cookie = response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
// verify response payload ...
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
final ODataBatchResponseItem item = bodyIterator.next();
assertTrue(item.hasNext());
ODataResponse res = item.next();
assertEquals(HttpStatusCode.CREATED.getStatusCode(), res.getStatusCode());
assertTrue(res instanceof ODataEntityCreateResponse);
final ODataEntityCreateResponse<?> createResponse = ((ODataEntityCreateResponse<?>) res);
res = item.next();
assertEquals(HttpStatusCode.OK.getStatusCode(), res.getStatusCode());
assertTrue(res instanceof ODataEntityUpdateResponse);
final ODataEntitySetRequest<ClientEntitySet> req = getClient().getRetrieveRequestFactory().getEntitySetRequest(
URI.create(createResponse.getHeader(HttpHeader.LOCATION).iterator().next() + "/NavPropertyETTwoPrimMany"));
req.setFormat(getContentType());
req.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ClientEntitySet> getResponse = req.execute();
assertShortOrInt(32767, getResponse.getBody()
.getEntities()
.get(0)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
}
/**
* Test for fix of OLINGO-1591
*/
@Test
public void changesetBatchRequestDeadlock() throws IOException {
BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
final ODataChangeset changeset = payload.addChangeset();
URI targetURI = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").build();
ClientObjectFactory factory = getFactory();
ClientEntity postEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
postEntity.addLink(factory.newEntityNavigationLink("NavPropertyETTwoPrimOne", getClient().newURIBuilder
(SERVICE_URI)
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(32766)
.build()));
byte[] contentBytes;
try (InputStream content =
Thread.currentThread().getContextClassLoader().getResourceAsStream("payload.txt")) {
if (content == null) {
throw new IOException("Failed to load test data.");
}
contentBytes = new byte[content.available()];
content.read(contentBytes);
String testPayload = new String(contentBytes);
postEntity.getProperties().add(factory.newPrimitiveProperty("PropertyDouble",
factory.newPrimitiveValueBuilder().buildString(testPayload)));
final ODataEntityCreateRequest<ClientEntity> createRequest =
getClient().getCUDRequestFactory().getEntityCreateRequest(targetURI, postEntity);
createRequest.setFormat(getContentType());
changeset.addRequest(createRequest);
payload.getResponse();
}
}
@Test
public void changesetBatchRequest() {
BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
// -----------------------------
// - Append get request
// -----------------------------
payload.addRequest(createGetRequest("ESAllPrim", 32767, false));
// -----------------------------
// - Append change set
// -----------------------------
final ODataChangeset changeset = payload.addChangeset();
// -----------------------------
// POST request (Insert)
// -----------------------------
URI targetURI = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").build();
ClientObjectFactory factory = getFactory();
ClientEntity postEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
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(targetURI, postEntity);
createRequest.setFormat(getContentType());
changeset.addRequest(createRequest);
// -----------------------------
// Patch request (Update)
// -----------------------------
ClientEntity patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
patchEntity.setEditLink(
getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").appendKeySegment(0).build());
patchEntity.getProperties().add(factory.newPrimitiveProperty("PropertyDouble",
factory.newPrimitiveValueBuilder().buildDouble(3.1415)));
ODataEntityUpdateRequest<ClientEntity> changeReq =
getClient().getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity);
changeReq.setFormat(getContentType());
changeset.addRequest(changeReq);
// -----------------------------
// Patch request (Upsert)
// -----------------------------
patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
patchEntity.setEditLink(
getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").appendKeySegment(15).build());
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(getContentType());
changeset.addRequest(changeReq);
// -----------------------------
// - Append get request
// -----------------------------
payload.addRequest(createGetRequest("ESAllPrim", 0, false));
// -----------------------------
// - Fetch result
// -----------------------------
final ODataBatchResponse response = payload.getResponse();
assertEquals(HttpStatusCode.OK.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;
assertShortOrInt(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());
}
private ODataEntityRequest<ClientEntity> createGetRequest(final String segment, final Object key,
final boolean isRelative) {
final URI targetURI = getClient().newURIBuilder(SERVICE_URI)
.appendEntitySetSegment(segment).appendKeySegment(key)
.build();
final URI uri = isRelative ? URI.create(SERVICE_URI).relativize(targetURI) : targetURI;
ODataEntityRequest<ClientEntity> queryReq = getClient().getRetrieveRequestFactory().getEntityRequest(uri);
queryReq.setAccept(getContentType().toContentTypeString());
return queryReq;
}
}