From 4eb2f1cf1f6699808f2f026093b1e270bd77e648 Mon Sep 17 00:00:00 2001 From: Berlin Cho Date: Wed, 17 Nov 2021 23:36:19 -0600 Subject: [PATCH 1/2] Java Encode comma (with unit tests) --- .../libraries/resttemplate/ApiClient.mustache | 41 ++++++++++++------- .../org/openapitools/client/ApiClient.java | 41 ++++++++++++------- .../openapitools/client/ApiClientTest.java | 31 ++++++++++++++ .../org/openapitools/client/ApiClient.java | 41 ++++++++++++------- .../openapitools/client/ApiClientTest.java | 31 ++++++++++++++ 5 files changed, 143 insertions(+), 42 deletions(-) create mode 100644 samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java create mode 100644 samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index e48370f1539d..ca401c8ed1f7 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -34,6 +34,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; {{#threetenbp}} import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; @@ -622,6 +623,12 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); + defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -632,27 +639,33 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java index 093e48971445..2babc4bee662 100644 --- a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java @@ -30,6 +30,7 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; import org.springframework.http.converter.HttpMessageConverter; @@ -578,6 +579,12 @@ protected Object selectBody(Object obj, MultiValueMap formParams * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); + defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -588,27 +595,33 @@ public String expandPath(String pathTemplate, Map variables) { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java b/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java new file mode 100644 index 000000000000..4b3a63c3e266 --- /dev/null +++ b/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java @@ -0,0 +1,31 @@ +package org.openapitools.client; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.*; +import org.junit.*; +import org.springframework.util.MultiValueMap; +import org.springframework.util.LinkedMultiValueMap; + +public class ApiClientTest { + ApiClient apiClient; + + @Before + public void setup() { + apiClient = new ApiClient(); + } + + /** + * Test uri encoding when params contains comma + */ + @Test + public void testUriEncoderWithComma() { + Map uriParams = new HashMap<>(); + MultiValueMap queryParams = new LinkedMultiValueMap(); + queryParams.add("key", "val,comma"); + apiClient.generateQueryUri(queryParams, uriParams); + + assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams)); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java index 89f43f67cc1a..c78df82ed660 100644 --- a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java @@ -25,6 +25,7 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; import org.springframework.http.converter.HttpMessageConverter; @@ -573,6 +574,12 @@ protected Object selectBody(Object obj, MultiValueMap formParams * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); + defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -583,27 +590,33 @@ public String expandPath(String pathTemplate, Map variables) { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java b/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java new file mode 100644 index 000000000000..4b3a63c3e266 --- /dev/null +++ b/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java @@ -0,0 +1,31 @@ +package org.openapitools.client; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.*; +import org.junit.*; +import org.springframework.util.MultiValueMap; +import org.springframework.util.LinkedMultiValueMap; + +public class ApiClientTest { + ApiClient apiClient; + + @Before + public void setup() { + apiClient = new ApiClient(); + } + + /** + * Test uri encoding when params contains comma + */ + @Test + public void testUriEncoderWithComma() { + Map uriParams = new HashMap<>(); + MultiValueMap queryParams = new LinkedMultiValueMap(); + queryParams.add("key", "val,comma"); + apiClient.generateQueryUri(queryParams, uriParams); + + assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams)); + } +} \ No newline at end of file From 13e02293a8ee668162ef39ec350f2b60a53e44d7 Mon Sep 17 00:00:00 2001 From: Berlin Cho Date: Sat, 20 Nov 2021 21:24:35 -0600 Subject: [PATCH 2/2] fix PMD warnings --- .../Java/libraries/resttemplate/ApiClient.mustache | 14 +++++++------- .../java/org/openapitools/client/ApiClient.java | 14 +++++++------- .../java/org/openapitools/client/ApiClient.java | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index ca401c8ed1f7..f868eaa6dbf3 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -624,10 +624,10 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { */ public String expandPath(String pathTemplate, Map variables) { // disable default URL encoding - DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); - defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -643,7 +643,7 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { try { - String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + final String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); @@ -658,14 +658,14 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { queryBuilder.append(encodedName); if (value != null) { String templatizedKey = encodedName + valueItemCounter++; - String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); uriParams.put(templatizedKey, encodedValue); queryBuilder.append('=').append("{").append(templatizedKey).append("}"); } } } } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java index 2babc4bee662..8e5e2933cec3 100644 --- a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java @@ -580,10 +580,10 @@ protected Object selectBody(Object obj, MultiValueMap formParams */ public String expandPath(String pathTemplate, Map variables) { // disable default URL encoding - DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); - defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -599,7 +599,7 @@ public String generateQueryUri(MultiValueMap queryParams, Map { try { - String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + final String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); @@ -614,14 +614,14 @@ public String generateQueryUri(MultiValueMap queryParams, Map queryParams, Map