This is an automated email from the ASF dual-hosted git repository.
mibo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
The following commit(s) were added to refs/heads/master by this push:
new 69e0f0a [OLINGO-1554] Fix uniqueness of Content-ID in batch request
69e0f0a is described below
commit 69e0f0af1f45cb868fedbb874ff083d017fa1e18
Author: mibo <[email protected]>
AuthorDate: Sat Feb 26 08:22:11 2022 +0100
[OLINGO-1554] Fix uniqueness of Content-ID in batch request
---
.../request/batch/AbstractBatchManager.java | 5 ++-
.../request/batch/ODataBatchRequestContext.java | 45 ++++++++++++++++++++++
.../request/batch/ODataChangesetImpl.java | 17 ++++++--
.../request/batch/ODataSingleRequestImpl.java | 16 +++++---
.../request/batch/ODataBatchUtilitiesTest.java | 6 +--
5 files changed, 75 insertions(+), 14 deletions(-)
diff --git
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/AbstractBatchManager.java
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/AbstractBatchManager.java
index fb48d2b..da62849 100644
---
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/AbstractBatchManager.java
+++
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/AbstractBatchManager.java
@@ -39,6 +39,7 @@ public abstract class AbstractBatchManager extends
AbstractODataStreamManager<OD
protected final boolean continueOnError;
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+ private final ODataBatchRequestContext batchRequestController = new
ODataBatchRequestContext();
/**
* Batch request current item.
@@ -72,7 +73,7 @@ public abstract class AbstractBatchManager extends
AbstractODataStreamManager<OD
final ODataChangesetResponseItem expectedResItem = new
ODataChangesetResponseItem(continueOnError);
((AbstractODataBatchRequest<?, ?>)
req).addExpectedResItem(expectedResItem);
- currentItem = new ODataChangesetImpl(req, expectedResItem);
+ currentItem = new ODataChangesetImpl(req, expectedResItem,
batchRequestController);
return (ODataChangeset) currentItem;
}
@@ -91,7 +92,7 @@ public abstract class AbstractBatchManager extends
AbstractODataStreamManager<OD
streamDashBoundary();
final ODataSingleResponseItem expectedResItem = new
ODataSingleResponseItem();
- currentItem = new ODataSingleRequestImpl(req, expectedResItem);
+ currentItem = new ODataSingleRequestImpl(req, expectedResItem,
batchRequestController);
((AbstractODataBatchRequest<?, ?>)
req).addExpectedResItem(expectedResItem);
diff --git
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchRequestContext.java
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchRequestContext.java
new file mode 100644
index 0000000..6bccbb7
--- /dev/null
+++
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchRequestContext.java
@@ -0,0 +1,45 @@
+/*
+ * 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.client.core.communication.request.batch;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Contains context information which is passed through the batch request
processing.
+ */
+public class ODataBatchRequestContext {
+
+ /**
+ * Content ID for Multipart batch requests
+ */
+ private final AtomicInteger contentId = new AtomicInteger(1);
+
+ public int getContentId() {
+ return contentId.get();
+ }
+
+ /**
+ * Returns the contentId and then increments it
+ *
+ * @return contentId
+ */
+ public int getAndIncrementContentId() {
+ return contentId.getAndIncrement();
+ }
+}
diff --git
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataChangesetImpl.java
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataChangesetImpl.java
index c730c92..a4cfbf3 100644
---
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataChangesetImpl.java
+++
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataChangesetImpl.java
@@ -40,6 +40,7 @@ public class ODataChangesetImpl extends
AbstractODataBatchRequestItem
*/
private int contentId = 0;
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+ private final ODataBatchRequestContext batchRequestContext;
/**
* Changeset boundary.
@@ -56,16 +57,20 @@ public class ODataChangesetImpl extends
AbstractODataBatchRequestItem
*
* @param req batch request.
* @param expectedResItem expected OData response items.
+ * @param batchRequestContext batch request context
*/
- ODataChangesetImpl(final ODataBatchRequest req, final
ODataChangesetResponseItem expectedResItem) {
+ ODataChangesetImpl(ODataBatchRequest req, ODataChangesetResponseItem
expectedResItem,
+ ODataBatchRequestContext batchRequestContext) {
+
super(req);
this.expectedResItem = expectedResItem;
+ this.batchRequestContext = batchRequestContext;
// create a random UUID value for boundary
- boundary = "changeset_" + UUID.randomUUID().toString();
+ boundary = "changeset_" + UUID.randomUUID();
}
- /**
+/**
* {@inheritDoc}
*/
@Override
@@ -110,7 +115,7 @@ public class ODataChangesetImpl extends
AbstractODataBatchRequestItem
hasStreamedSomething = true;
}
- contentId++;
+ contentId = getContentId();
// preamble
newLine();
@@ -128,4 +133,8 @@ public class ODataChangesetImpl extends
AbstractODataBatchRequestItem
expectedResItem.addResponse(String.valueOf(contentId),
((AbstractODataRequest) request).getResponseTemplate());
return this;
}
+
+ private int getContentId() {
+ return batchRequestContext.getAndIncrementContentId();
+ }
}
diff --git
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataSingleRequestImpl.java
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataSingleRequestImpl.java
index af1c715..090efd6 100644
---
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataSingleRequestImpl.java
+++
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/batch/ODataSingleRequestImpl.java
@@ -30,16 +30,21 @@ import org.apache.olingo.commons.api.http.HttpMethod;
public class ODataSingleRequestImpl extends AbstractODataBatchRequestItem
implements ODataSingleRequest {
private final ODataSingleResponseItem expectedResItem;
+ private final ODataBatchRequestContext batchRequestContext;
/**
* Constructor.
*
* @param req batch request.
- * @param expectedResItem expected batch response item.
+ * @param expectedResItem expected OData response items.
+ * @param batchRequestContext batch request context
*/
- ODataSingleRequestImpl(final ODataBatchRequest req, final
ODataSingleResponseItem expectedResItem) {
+ ODataSingleRequestImpl(ODataBatchRequest req, ODataSingleResponseItem
expectedResItem,
+ ODataBatchRequestContext batchRequestContext) {
super(req);
this.expectedResItem = expectedResItem;
+// this(req,expectedResItem);
+ this.batchRequestContext = batchRequestContext;
}
/**
@@ -61,12 +66,13 @@ public class ODataSingleRequestImpl extends
AbstractODataBatchRequestItem implem
hasStreamedSomething = true;
+ int contentId = batchRequestContext.getAndIncrementContentId();
// stream the request
if (request.getMethod() == HttpMethod.GET) {
streamRequestHeader(request);
} else {
- streamRequestHeader(ODataSingleResponseItem.SINGLE_CONTENT_ID);
- request.batch(req, ODataSingleResponseItem.SINGLE_CONTENT_ID);
+ streamRequestHeader(String.valueOf(contentId));
+ request.batch(req, String.valueOf(contentId));
}
// close before in order to avoid any further setRequest calls.
@@ -74,7 +80,7 @@ public class ODataSingleRequestImpl extends
AbstractODataBatchRequestItem implem
// add request to the list
expectedResItem.addResponse(
- ODataSingleResponseItem.SINGLE_CONTENT_ID, ((AbstractODataRequest)
request).getResponseTemplate());
+ String.valueOf(contentId), ((AbstractODataRequest)
request).getResponseTemplate());
return this;
}
diff --git
a/lib/client-core/src/test/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchUtilitiesTest.java
b/lib/client-core/src/test/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchUtilitiesTest.java
index 1fae3e1..232f778 100644
---
a/lib/client-core/src/test/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchUtilitiesTest.java
+++
b/lib/client-core/src/test/java/org/apache/olingo/client/core/communication/request/batch/ODataBatchUtilitiesTest.java
@@ -75,7 +75,7 @@ public class ODataBatchUtilitiesTest {
ODataBatchLineIterator iterator = new ODataBatchLineIteratorImpl(new
LineIterator(reader ));
ODataBatchRequest req = new ODataBatchRequestImpl(client, uri);;
ODataChangesetResponseItem expectedResItem = new
ODataChangesetResponseItem(true);
- ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem );
+ ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem,
new ODataBatchRequestContext());
assertNotNull(change);
ODataBatchableRequest request = new
ODataInvokeRequestImpl<ClientInvokeResult>(
client, ClientInvokeResult.class, HttpMethod.POST, uri);
@@ -97,7 +97,7 @@ public class ODataBatchUtilitiesTest {
URI uri = new URI("test");
ODataBatchRequest req = new ODataBatchRequestImpl(client, uri);;
ODataChangesetResponseItem expectedResItem = new
ODataChangesetResponseItem(true);
- ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem );
+ ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem,
new ODataBatchRequestContext());
assertNotNull(change);
ODataBatchableRequest request = new
ODataInvokeRequestImpl<ClientInvokeResult>(
client, ClientInvokeResult.class, HttpMethod.GET, uri);
@@ -113,7 +113,7 @@ public class ODataBatchUtilitiesTest {
URI uri = new URI("test");
ODataBatchRequest req = new ODataBatchRequestImpl(client, uri);;
ODataChangesetResponseItem expectedResItem = new
ODataChangesetResponseItem(true);
- ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem );
+ ODataChangesetImpl change = new ODataChangesetImpl(req , expectedResItem,
new ODataBatchRequestContext());
assertNotNull(change);
assertNotNull(change.getBodyStreamWriter());
change.close();