From af7ad026b8c7e2345d65f90454933278d442e0fc Mon Sep 17 00:00:00 2001
From: Sashir Estela <sashirestela@yahoo.com>
Date: Sun, 7 Apr 2024 18:54:22 +0000
Subject: [PATCH 1/4] Convert collections to bytearray in Multipart

---
 .../cleverclient/support/HttpMultipart.java   | 24 +++++++-
 .../sashirestela/cleverclient/http/ITest.java | 16 ++++++
 .../support/HttpMultipartTest.java            | 57 +++++++++++++++++++
 src/test/resources/loremipsum.txt             |  1 +
 4 files changed, 95 insertions(+), 3 deletions(-)
 create mode 100644 src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
 create mode 100644 src/test/resources/loremipsum.txt

diff --git a/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java b/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java
index add7c35..0678188 100644
--- a/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java
+++ b/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java
@@ -8,6 +8,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -49,15 +50,32 @@ public static List<byte[]> toByteArrays(Map<String, Object> data) {
                 byteArrays.add(toBytes(NL));
             } else {
                 var fieldValue = entry.getValue();
-                byteArrays.add(toBytes(FIELD_NAME + DQ + fieldName + DQ + NL));
-                byteArrays.add(toBytes(NL));
-                byteArrays.add(toBytes(fieldValue + NL));
+                var isFirst = true;
+                if (fieldValue instanceof Collection) {
+                    for (Object item : (Collection<?>) fieldValue) {
+                        addIndividualField(byteArrays, fieldName + "[]", item, isFirst);
+                        isFirst = false;
+                    }
+                } else {
+                    addIndividualField(byteArrays, fieldName, fieldValue, isFirst);
+                }
             }
         }
         byteArrays.add(toBytes(DASH + Constant.BOUNDARY_VALUE + DASH + NL));
         return byteArrays;
     }
 
+    private static void addIndividualField(List<byte[]> byteArrays, String fieldName, Object fieldValue,
+            boolean isFirst) {
+        if (!isFirst) {
+            byteArrays.add(toBytes(DASH + Constant.BOUNDARY_VALUE + NL));
+            byteArrays.add(toBytes(DISPOSITION));
+        }
+        byteArrays.add(toBytes(FIELD_NAME + DQ + fieldName + DQ + NL));
+        byteArrays.add(toBytes(NL));
+        byteArrays.add(toBytes(fieldValue + NL));
+    }
+
     private static byte[] toBytes(String text) {
         return text.getBytes(StandardCharsets.UTF_8);
     }
diff --git a/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java b/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java
index d054a2c..d234f49 100644
--- a/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java
+++ b/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java
@@ -171,4 +171,20 @@ static class Generic<T> {
 
     }
 
+    @Getter
+    @AllArgsConstructor
+    static class MultipartClass {
+
+        private java.nio.file.Path file;
+
+        private int id;
+
+        private String text;
+
+        private List<String> group;
+
+        private Integer[] numbers;
+
+    }
+
 }
diff --git a/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
new file mode 100644
index 0000000..e9a0158
--- /dev/null
+++ b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
@@ -0,0 +1,57 @@
+package io.github.sashirestela.cleverclient.support;
+
+import io.github.sashirestela.cleverclient.http.ITest;
+import io.github.sashirestela.cleverclient.util.JsonUtil;
+import org.junit.jupiter.api.Test;
+
+import java.nio.file.Paths;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class HttpMultipartTest {
+
+    @Test
+    void testToByteArrays() {
+        String[] expectedData = {
+                "Content-Disposition: form-data",
+                "; name=\"file\"; filename=\"/projects/cleverclient/src/test/resources/loremipsum.txt\"\r\n",
+                "Content-Type: text/plain\r\n",
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+                "Content-Disposition: form-data",
+                "; name=\"id\"\r\n",
+                "101\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"text\"\r\n",
+                "Testing\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"group[]\"\r\n",
+                "one\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"group[]\"\r\n",
+                "two\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"numbers[]\"\r\n",
+                "13\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"numbers[]\"\r\n",
+                "25\r\n",
+                "Content-Disposition: form-data",
+                "; name=\"numbers[]\"\r\n",
+                "37\r\n"
+        };
+        var object = new ITest.MultipartClass(Paths.get("src/test/resources/loremipsum.txt"), 101, "Testing",
+                List.of("one", "two"), new Integer[] { 13, 25, 37 });
+        var objectMap = JsonUtil.objectToMap(object);
+        var bytesList = HttpMultipart.toByteArrays(objectMap);
+        var i = 0;
+        for (byte[] bytes : bytesList) {
+            var currentData = new String(bytes);
+            if (!currentData.startsWith("--") && !currentData.startsWith("\r\n") && !currentData.isEmpty()) {
+                assertEquals(expectedData[i], currentData);
+                i++;
+            }
+        }
+    }
+
+}
diff --git a/src/test/resources/loremipsum.txt b/src/test/resources/loremipsum.txt
new file mode 100644
index 0000000..120ef61
--- /dev/null
+++ b/src/test/resources/loremipsum.txt
@@ -0,0 +1 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
\ No newline at end of file

From 0fa61f584641d807f7c5b2f26dc3090537bbe383 Mon Sep 17 00:00:00 2001
From: Sashir Estela <sashirestela@yahoo.com>
Date: Sun, 7 Apr 2024 18:55:25 +0000
Subject: [PATCH 2/4] Deploy release 1.4.1

---
 pom.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/pom.xml b/pom.xml
index c01f6af..c90fd40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
   <groupId>io.github.sashirestela</groupId>
   <artifactId>cleverclient</artifactId>
-  <version>1.4.0</version>
+  <version>1.4.1</version>
   <packaging>jar</packaging>
 
   <name>cleverclient</name>
@@ -52,19 +52,19 @@
     <maven.compiler.release>11</maven.compiler.release>
     <!-- Dependencies Versions -->
     <slf4j.version>2.0.12</slf4j.version>
-    <lombok.version>1.18.30</lombok.version>
-    <jackson.version>2.16.1</jackson.version>
+    <lombok.version>1.18.32</lombok.version>
+    <jackson.version>2.17.0</jackson.version>
     <junit.version>5.10.2</junit.version>
-    <mockito.version>5.10.0</mockito.version>
+    <mockito.version>5.11.0</mockito.version>
     <!-- Plugins Versions -->
-    <compiler.version>3.12.1</compiler.version>
+    <compiler.version>3.13.0</compiler.version>
     <enforcer.version>3.4.1</enforcer.version>
     <surefire.version>3.2.5</surefire.version>
     <exec.version>3.2.0</exec.version>
-    <jacoco.version>0.8.11</jacoco.version>
+    <jacoco.version>0.8.12</jacoco.version>
     <helper.version>3.5.0</helper.version>
     <versions.version>2.16.2</versions.version>
-    <source.version>3.3.0</source.version>
+    <source.version>3.3.1</source.version>
     <javadoc.version>3.6.3</javadoc.version>
     <gpg.version>3.1.0</gpg.version>
     <sonatype.version>1.6.13</sonatype.version>

From 887f27c37f4003b79c4782d481a417b184ed356e Mon Sep 17 00:00:00 2001
From: Sashir Estela <sashirestela@yahoo.com>
Date: Sun, 7 Apr 2024 18:57:15 +0000
Subject: [PATCH 3/4] Fix link in Readme

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 971c8e0..6fc5813 100644
--- a/README.md
+++ b/README.md
@@ -80,7 +80,7 @@ var newPost = postService.createPost(new Post(
 System.out.println(newPost);
 ```
 
-## 🛠️ Installation
+## ⚙ Installation
 
 You can install CleverClient by adding the following dependency to your Maven project:
 

From 5314ad4316d9847a23c181109efbcacd35f77426 Mon Sep 17 00:00:00 2001
From: Sashir Estela <sashirestela@yahoo.com>
Date: Sun, 7 Apr 2024 19:08:57 +0000
Subject: [PATCH 4/4] Fixing Sonar issues

---
 .../cleverclient/support/HttpMultipartTest.java             | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
index e9a0158..817e7b9 100644
--- a/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
+++ b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java
@@ -9,13 +9,12 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class HttpMultipartTest {
+class HttpMultipartTest {
 
     @Test
     void testToByteArrays() {
         String[] expectedData = {
                 "Content-Disposition: form-data",
-                "; name=\"file\"; filename=\"/projects/cleverclient/src/test/resources/loremipsum.txt\"\r\n",
                 "Content-Type: text/plain\r\n",
                 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                 "Content-Disposition: form-data",
@@ -47,7 +46,8 @@ void testToByteArrays() {
         var i = 0;
         for (byte[] bytes : bytesList) {
             var currentData = new String(bytes);
-            if (!currentData.startsWith("--") && !currentData.startsWith("\r\n") && !currentData.isEmpty()) {
+            if (!currentData.startsWith("--") && !currentData.startsWith("\r\n")
+                    && !currentData.contains("filename=")) {
                 assertEquals(expectedData[i], currentData);
                 i++;
             }