From fc44e4118c9fb82c4a1688a63c388bbde88220e7 Mon Sep 17 00:00:00 2001
From: Sorin Florea <sflorea@gradle.com>
Date: Mon, 21 Feb 2022 15:37:58 +0200
Subject: [PATCH] Properly encode exploded query params in url

---
 .../Java/libraries/native/api.mustache        | 12 +++++
 .../codegen/java/JavaClientCodegenTest.java   | 33 ++++++++++++++
 .../src/test/resources/3_0/issue4808.yaml     | 45 +++++++++++++++++++
 3 files changed, 90 insertions(+)
 create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue4808.yaml

diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache
index ede8e5b9566..d4891d1cd6b 100644
--- a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache
+++ b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache
@@ -318,7 +318,19 @@ public class {{classname}} {
     }
         {{/isDeepObject}}
         {{^isDeepObject}}
+            {{#isExplode}}
+                {{#hasVars}}
+                    {{#vars}}
+    localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}.{{getter}}()));
+                    {{/vars}}
+                {{/hasVars}}
+                {{^hasVars}}
     localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}));
+                {{/hasVars}}
+            {{/isExplode}}
+            {{^isExplode}}
+    localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}));
+            {{/isExplode}}
         {{/isDeepObject}}
       {{/collectionFormat}}
     {{/queryParams}}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java
index c62cbdd5616..ce1e6528912 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java
@@ -1276,4 +1276,37 @@ public class JavaClientCodegenTest {
         TestUtils.assertFileContains(Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"),
                 "public static String urlEncode(String s) { return URLEncoder.encode(s, UTF_8).replaceAll(\"\\\\+\", \"%20\"); }");
     }
+
+    /**
+     * See https://github.com/OpenAPITools/openapi-generator/issues/4808
+     */
+    @Test
+    public void testNativeClientExplodedQueryParamObject() throws IOException {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api");
+
+        File output = Files.createTempDirectory("test").toFile();
+        output.deleteOnExit();
+
+        final CodegenConfigurator configurator = new CodegenConfigurator()
+                .setGeneratorName("java")
+                .setLibrary(JavaClientCodegen.NATIVE)
+                .setAdditionalProperties(properties)
+                .setInputSpec("src/test/resources/3_0/issue4808.yaml")
+                .setOutputDir(output.getAbsolutePath().replace("\\", "/"));
+
+        final ClientOptInput clientOptInput = configurator.toClientOptInput();
+        DefaultGenerator generator = new DefaultGenerator();
+        List<File> files = generator.opts(clientOptInput).generate();
+
+        Assert.assertEquals(files.size(), 38);
+        validateJavaSourceFiles(files);
+
+        TestUtils.assertFileContains(Paths.get(output + "/src/main/java/xyz/abcdef/api/DefaultApi.java"),
+                "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"since\", queryObject.getSince()));",
+                "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"sinceBuild\", queryObject.getSinceBuild()));",
+                "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"maxBuilds\", queryObject.getMaxBuilds()));",
+                "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"maxWaitSecs\", queryObject.getMaxWaitSecs()));"
+        );
+    }
 }
diff --git a/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml b/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml
new file mode 100644
index 00000000000..b2d16592f61
--- /dev/null
+++ b/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml
@@ -0,0 +1,45 @@
+openapi: 3.0.3
+info:
+  title: Issue 11242 - exploded query params
+  description: "Exploded query params"
+  version: "1.0.0"
+servers:
+  - url: localhost:8080
+paths:
+  /api:
+    get:
+      operationId: GetSomeValue
+      parameters:
+      - in: query
+        name: QueryObject
+        explode: true
+        style: form
+        schema:
+          type: object
+          properties:
+            since:
+              type: string
+            sinceBuild:
+              type: string
+            maxBuilds:
+              type: integer
+            maxWaitSecs:
+              type: integer
+      responses:
+        '200':
+          description: Some return value
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/SomeReturnValue'
+              example:
+                someValue: value
+components:
+  schemas:
+    SomeReturnValue:
+      type: object
+      required:
+        - someValue
+      properties:
+        someValue:
+          type: string
-- 
GitLab