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();

Reply via email to