From 9cdcf8086beeb22f8f816171f4b2573a3dc107eb Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:09:45 +0100 Subject: [PATCH 1/7] DeepObject also for required parameters --- .../src/main/resources/csharp-netcore/api.mustache | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache index 0825406d5530..5a172a621053 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache @@ -279,9 +279,18 @@ namespace {{packageName}}.{{apiPackage}} {{/required}} {{/pathParams}} {{#queryParams}} + {{#required}} + {{#isDeepObject}} + {{#items.vars}} + localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}})); + {{/items.vars}} + {{/isDeepObject}} + {{^isDeepObject}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); + {{/isDeepObject}} {{/required}} + {{^required}} if ({{paramName}} != null) { @@ -298,6 +307,7 @@ namespace {{packageName}}.{{apiPackage}} {{/isDeepObject}} } {{/required}} + {{/queryParams}} {{#headerParams}} {{#required}} From 0041597adc79e9c4af0084094a3b019d4b80c3d4 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:13:59 +0100 Subject: [PATCH 2/7] Fix NullPointerException on inline deepObject such as a Dictionary --- .../openapitools/codegen/DefaultCodegen.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index a1da5cffcb88..8d1a5ff14251 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4346,14 +4346,20 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) if (codegenParameter.isQueryParam && codegenParameter.isDeepObject) { Schema schema = ModelUtils.getSchema(openAPI, codegenParameter.dataType); codegenParameter.items = fromProperty(codegenParameter.paramName, schema); - Map> properties = schema.getProperties(); - codegenParameter.items.vars = - properties.entrySet().stream() - .map(entry -> { - CodegenProperty property = fromProperty(entry.getKey(), entry.getValue()); - property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]"; - return property; - }).collect(Collectors.toList()); + // TODO Check why schema is actually null for a schema of type object defined inline + if(schema != null) { + Map> properties = schema.getProperties(); + codegenParameter.items.vars = + properties.entrySet().stream() + .map(entry -> { + CodegenProperty property = fromProperty(entry.getKey(), entry.getValue()); + property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]"; + return property; + }).collect(Collectors.toList()); + } + else { + LOGGER.warn("No object schema found for deepObject parameter" + codegenParameter + " deepObject won't have specific properties"); + } } // set the parameter example value From 0292f1b8a891d43356bfc0399efc6ac592440389 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:17:50 +0100 Subject: [PATCH 3/7] Add deepObject in ParameterToMultiMap for deepObjects without explicit parameters --- .../src/main/resources/csharp-netcore/api.mustache | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache index 5a172a621053..5d5441275064 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache @@ -285,6 +285,9 @@ namespace {{packageName}}.{{apiPackage}} {{#items.vars}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}})); {{/items.vars}} + {{^items}} + localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("deepObject", "{{baseName}}", {{paramName}})); + {{/items}} {{/isDeepObject}} {{^isDeepObject}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); @@ -301,6 +304,10 @@ namespace {{packageName}}.{{apiPackage}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}})); } {{/items.vars}} + + {{^items}} + localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("deepObject", "{{baseName}}", {{paramName}})); + {{/items}} {{/isDeepObject}} {{^isDeepObject}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); From 251b30caccb3c72d27a30ec99f0ad468634f92ee Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:26:28 +0100 Subject: [PATCH 4/7] Add some context to TODOs --- .../main/java/org/openapitools/codegen/DefaultCodegen.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 8d1a5ff14251..efb84f429330 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4190,7 +4190,8 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) // https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#user-content-parameterexplode codegenParameter.isExplode = parameter.getExplode() == null ? false : parameter.getExplode(); - // TODO revise collectionFormat + // TODO revise collectionFormat, default collection format in OAS 3 appears to multi at least for query parameters + // https://swagger.io/docs/specification/serialization/ String collectionFormat = null; if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter final ArraySchema arraySchema = (ArraySchema) parameterSchema; @@ -4347,6 +4348,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) Schema schema = ModelUtils.getSchema(openAPI, codegenParameter.dataType); codegenParameter.items = fromProperty(codegenParameter.paramName, schema); // TODO Check why schema is actually null for a schema of type object defined inline + // https://swagger.io/docs/specification/serialization/ if(schema != null) { Map> properties = schema.getProperties(); codegenParameter.items.vars = From 7848c1f14a1c7786022291feed0d5f4ebaea5cf1 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:34:07 +0100 Subject: [PATCH 5/7] ParameterToMultiMap fixed in CSharp template for OAS 3 Dicts, taking deepObject into account --- .../resources/csharp-netcore/ClientUtils.mustache | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/ClientUtils.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/ClientUtils.mustache index e5fb0565fc9c..dd9a5f90fdcd 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/ClientUtils.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/ClientUtils.mustache @@ -63,6 +63,21 @@ namespace {{packageName}}.Client parameters.Add(name, ParameterToString(item)); } } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } else { parameters.Add(name, ParameterToString(value)); From 8362d6a16fed48cde620cc05e39952bfbd00d6aa Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:44:25 +0100 Subject: [PATCH 6/7] Remove added whitespace --- .../src/main/resources/csharp-netcore/api.mustache | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache index 5d5441275064..40d3bfd6596f 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache @@ -279,7 +279,6 @@ namespace {{packageName}}.{{apiPackage}} {{/required}} {{/pathParams}} {{#queryParams}} - {{#required}} {{#isDeepObject}} {{#items.vars}} @@ -293,7 +292,6 @@ namespace {{packageName}}.{{apiPackage}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); {{/isDeepObject}} {{/required}} - {{^required}} if ({{paramName}} != null) { @@ -304,7 +302,6 @@ namespace {{packageName}}.{{apiPackage}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}})); } {{/items.vars}} - {{^items}} localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("deepObject", "{{baseName}}", {{paramName}})); {{/items}} @@ -314,7 +311,6 @@ namespace {{packageName}}.{{apiPackage}} {{/isDeepObject}} } {{/required}} - {{/queryParams}} {{#headerParams}} {{#required}} From 09083e98b785c5f661df54c7964d90d63e92f86a Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 26 Feb 2021 13:44:35 +0100 Subject: [PATCH 7/7] Update samples --- .../src/Org.OpenAPITools/Client/ClientUtils.cs | 15 +++++++++++++++ .../src/Org.OpenAPITools/Client/ClientUtils.cs | 15 +++++++++++++++ .../src/Org.OpenAPITools/Client/ClientUtils.cs | 15 +++++++++++++++ .../src/Org.OpenAPITools/Client/ClientUtils.cs | 15 +++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/ClientUtils.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/ClientUtils.cs index 844e7e9a8f4b..2b6e52d60654 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/ClientUtils.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/ClientUtils.cs @@ -67,6 +67,21 @@ public static Multimap ParameterToMultiMap(string collectionForm parameters.Add(name, ParameterToString(item)); } } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } else { parameters.Add(name, ParameterToString(value)); diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/ClientUtils.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/ClientUtils.cs index 844e7e9a8f4b..2b6e52d60654 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/ClientUtils.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/ClientUtils.cs @@ -67,6 +67,21 @@ public static Multimap ParameterToMultiMap(string collectionForm parameters.Add(name, ParameterToString(item)); } } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } else { parameters.Add(name, ParameterToString(value)); diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ClientUtils.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ClientUtils.cs index 844e7e9a8f4b..2b6e52d60654 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ClientUtils.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ClientUtils.cs @@ -67,6 +67,21 @@ public static Multimap ParameterToMultiMap(string collectionForm parameters.Add(name, ParameterToString(item)); } } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } else { parameters.Add(name, ParameterToString(value)); diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ClientUtils.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ClientUtils.cs index 844e7e9a8f4b..2b6e52d60654 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ClientUtils.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ClientUtils.cs @@ -67,6 +67,21 @@ public static Multimap ParameterToMultiMap(string collectionForm parameters.Add(name, ParameterToString(item)); } } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } else { parameters.Add(name, ParameterToString(value));