You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2015/04/20 16:28:24 UTC
[04/22] olingo-odata4 git commit: [OLINGO-616] Fix:
BatchReferenceRewriter
[OLINGO-616] Fix: BatchReferenceRewriter
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/97a01784
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/97a01784
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/97a01784
Branch: refs/heads/OLINGO-573
Commit: 97a017843249093d4c71838ea59d5a1d472140c5
Parents: 189de7b
Author: Christian Holzer <c....@sap.com>
Authored: Thu Apr 2 13:41:07 2015 +0200
Committer: Christian Holzer <ch...@t-online.de>
Committed: Fri Apr 3 12:42:03 2015 +0200
----------------------------------------------------------------------
.../fit/tecsvc/client/BatchClientITCase.java | 74 ++++++++++++++++++--
.../BatchReferenceRewriter.java | 3 +-
2 files changed, 69 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/97a01784/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
index ed249fd..a46644c 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
@@ -20,8 +20,8 @@ package org.apache.olingo.fit.tecsvc.client;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.net.URI;
@@ -30,6 +30,7 @@ import java.util.HashMap;
import java.util.Iterator;
import org.apache.olingo.client.api.ODataBatchConstants;
+import org.apache.olingo.client.api.ODataClient;
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;
@@ -48,6 +49,7 @@ import org.apache.olingo.client.core.communication.request.batch.ODataChangesetR
import org.apache.olingo.client.core.uri.URIUtils;
import org.apache.olingo.commons.api.domain.ODataEntity;
import org.apache.olingo.commons.api.domain.ODataEntitySet;
+import org.apache.olingo.commons.api.domain.ODataObjectFactory;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ContentType;
@@ -62,6 +64,11 @@ import org.junit.Test;
public class BatchClientITCase extends AbstractTestITCase {
private final static String ACCEPT = ContentType.APPLICATION_OCTET_STREAM.toContentTypeString();
private static final String SERVICE_URI = TecSvcConst.BASE_URI;
+ private static final String SERVICE_NAMESPACE = "olingo.odata.test1";
+ 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() {
@@ -69,6 +76,59 @@ public class BatchClientITCase extends AbstractTestITCase {
}
@Test
+ public void testBadRequestInChangeSet() {
+ /*
+ * 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.
+ */
+
+ final ODataClient client = getClient();
+ final ODataObjectFactory of = client.getObjectFactory();
+
+ // Try to create entity, with invalid type
+ final ODataEntity entity = of.newEntity(ES_NOT_AVAILABLE);
+ entity.getProperties().add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder()
+ .buildString("1")));
+ final ODataBatchRequest batchRequest = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
+ batchRequest.setAccept(ACCEPT);
+ final BatchManager payloadManager = batchRequest.payloadManager();
+ final ODataChangeset changeset = payloadManager.addChangeset();
+ final URI targetURI = client.newURIBuilder(SERVICE_URI)
+ .appendEntitySetSegment(ES_NOT_AVAILABLE_NAME)
+ .build();
+ final ODataEntityCreateRequest<ODataEntity> createRequest = client.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());
+ assertEquals(ODataFormat.JSON.toString(), updateResponse.getContentType());
+ }
+
+ @Test
public void emptyBatchRequest() {
// create your request
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
@@ -191,7 +251,7 @@ public class BatchClientITCase extends AbstractTestITCase {
// Check if third request is available
assertFalse(iter.hasNext());
}
-
+
@Test
public void testInvalidAbsoluteUri() throws URISyntaxException {
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
@@ -209,14 +269,14 @@ public class BatchClientITCase extends AbstractTestITCase {
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
assertTrue(bodyIterator.hasNext());
-
+
ODataBatchResponseItem item = bodyIterator.next();
assertFalse(item.isChangeset());
-
+
final ODataResponse oDataResponse = item.next();
assertEquals(400, oDataResponse.getStatusCode());
}
-
+
@Test
@Ignore
public void testInvalidHost() throws URISyntaxException {
@@ -233,7 +293,7 @@ public class BatchClientITCase extends AbstractTestITCase {
final ODataBatchResponse response = payload.getResponse();
assertEquals(400, response.getStatusCode());
}
-
+
@Test
@Ignore
public void testInvalidAbsoluteRequest() throws URISyntaxException {
@@ -250,7 +310,7 @@ public class BatchClientITCase extends AbstractTestITCase {
final ODataBatchResponse response = payload.getResponse();
assertEquals(400, response.getStatusCode());
}
-
+
@Test
public void testErrorWithContinueOnErrorPreferHeader() throws URISyntaxException {
client.getConfiguration().setContinueOnError(true);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/97a01784/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/referenceRewriting/BatchReferenceRewriter.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/referenceRewriting/BatchReferenceRewriter.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/referenceRewriting/BatchReferenceRewriter.java
index 772fd9d..9f0429a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/referenceRewriting/BatchReferenceRewriter.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/referenceRewriting/BatchReferenceRewriter.java
@@ -78,7 +78,8 @@ public class BatchReferenceRewriter {
if (request.getMethod() == HttpMethod.POST) {
// Create entity
// The URI of the new resource will be generated by the server and published in the location header
- resourceUri = parseODataPath(response.getHeaders().get(HttpHeader.LOCATION), request.getRawBaseUri());
+ final String locationHeader = response.getHeaders().get(HttpHeader.LOCATION);
+ resourceUri = locationHeader == null ? null : parseODataPath(locationHeader, request.getRawBaseUri());
} else {
// Update, Upsert (PUT, PATCH, Delete)
// These methods still addresses a given resource, so we use the URI given by the request