From 61c92aeac5646ec3c7e458379fc481ac3224b9bc Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Fri, 26 Nov 2021 17:46:12 -0800 Subject: [PATCH 1/6] Adds CodegenMediaType and CodegenEncoding --- .../openapitools/codegen/CodegenEncoding.java | 67 +++++++++++++++++++ .../codegen/CodegenMediaType.java | 45 +++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenEncoding.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenEncoding.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenEncoding.java new file mode 100644 index 00000000000..efd5b0f16ab --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenEncoding.java @@ -0,0 +1,67 @@ +package org.openapitools.codegen; + +import java.util.List; +import java.util.Objects; + +public class CodegenEncoding { + private String contentType; + private List<CodegenParameter> headers; + private String style; + private boolean explode; + private boolean allowReserved; + + public CodegenEncoding(String contentType, List<CodegenParameter> headers, String style, boolean explode, boolean allowReserved) { + this.contentType = contentType; + this.headers = headers; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + } + + public String getContentType() { + return contentType; + } + + public List<CodegenParameter> getHeaders() { + return headers; + } + + public String getStyle() { + return style; + } + + public boolean getExplode() { + return explode; + } + + public boolean getAllowReserved() { + return allowReserved; + } + + public String toString() { + final StringBuilder sb = new StringBuilder("CodegenEncoding{"); + sb.append("contentType=").append(contentType); + sb.append(", headers=").append(headers); + sb.append(", style=").append(style); + sb.append(", explode=").append(explode); + sb.append(", allowReserved=").append(allowReserved); + sb.append('}'); + return sb.toString(); + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CodegenEncoding that = (CodegenEncoding) o; + return contentType == that.getContentType() && + Objects.equals(headers, that.getHeaders()) && + style == that.getStyle() && + explode == that.getExplode() && + allowReserved == that.getAllowReserved(); + } + + @Override + public int hashCode() { + return Objects.hash(contentType, headers, style, explode, allowReserved); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java new file mode 100644 index 00000000000..2d364415149 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java @@ -0,0 +1,45 @@ +package org.openapitools.codegen; + +import java.util.Map; +import java.util.Objects; + +public class CodegenMediaType { + private CodegenProperty schema; + private Map<String, CodegenEncoding> content; + + public CodegenMediaType(CodegenProperty schema, Map<String, CodegenEncoding> content) { + this.schema = schema; + this.content = content; + } + + public CodegenProperty getSchema() { + return schema; + } + + public Map<String, CodegenEncoding> getContent() { + return content; + } + + public String toString() { + final StringBuilder sb = new StringBuilder("CodegenMediaType{"); + sb.append("schema=").append(schema); + sb.append(", content=").append(content); + sb.append('}'); + return sb.toString(); + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CodegenMediaType that = (CodegenMediaType) o; + return Objects.equals(schema,that.getSchema()) && + Objects.equals(content, that.getContent()); + } + + @Override + public int hashCode() { + return Objects.hash(schema, content); + } +} + + -- GitLab From 689d0dd7eb9ec5dadbfa73015ec650ce2898710c Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Sat, 27 Nov 2021 14:19:51 -0800 Subject: [PATCH 2/6] Adds partial new code to set Parameter content data --- .../codegen/CodegenMediaType.java | 18 +++---- .../openapitools/codegen/DefaultCodegen.java | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java index 2d364415149..965e5031942 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenMediaType.java @@ -1,29 +1,29 @@ package org.openapitools.codegen; -import java.util.Map; +import java.util.LinkedHashMap; import java.util.Objects; public class CodegenMediaType { private CodegenProperty schema; - private Map<String, CodegenEncoding> content; + private LinkedHashMap<String, CodegenEncoding> encoding; - public CodegenMediaType(CodegenProperty schema, Map<String, CodegenEncoding> content) { + public CodegenMediaType(CodegenProperty schema, LinkedHashMap<String, CodegenEncoding> encoding) { this.schema = schema; - this.content = content; + this.encoding = encoding; } public CodegenProperty getSchema() { return schema; } - public Map<String, CodegenEncoding> getContent() { - return content; + public LinkedHashMap<String, CodegenEncoding> getEncoding() { + return encoding; } public String toString() { final StringBuilder sb = new StringBuilder("CodegenMediaType{"); sb.append("schema=").append(schema); - sb.append(", content=").append(content); + sb.append(", encoding=").append(encoding); sb.append('}'); return sb.toString(); } @@ -33,12 +33,12 @@ public class CodegenMediaType { if (o == null || getClass() != o.getClass()) return false; CodegenMediaType that = (CodegenMediaType) o; return Objects.equals(schema,that.getSchema()) && - Objects.equals(content, that.getContent()); + Objects.equals(encoding, that.getEncoding()); } @Override public int hashCode() { - return Objects.hash(schema, content); + return Objects.hash(schema, encoding); } } 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 563dc10ebc9..afc552124de 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 @@ -6578,6 +6578,56 @@ public class DefaultCodegen implements CodegenConfig { if (schema == null) { throw new RuntimeException("Request body cannot be null. Possible cause: missing schema in body parameter (OAS v2): " + body); } + Content content = body.getContent(); + if (content != null) { + for (Entry<String, MediaType> contentEntry: content.entrySet()) { + String contentType = contentEntry.getKey(); + MediaType mt = contentEntry.getValue(); + LinkedHashMap<String, CodegenEncoding> ceMap = null; + if (mt.getEncoding() != null ) { + ceMap = new LinkedHashMap<>(); + Map<String, Encoding> encMap = mt.getEncoding(); + for (Entry<String, Encoding> encodingEntry: encMap.entrySet()) { + Encoding enc = encodingEntry.getValue(); + List<CodegenParameter> headers = new ArrayList<>(); + if (enc.getHeaders() != null) { + Map<String, Header> encHeaders = enc.getHeaders(); + for (Entry<String, Header> headerEntry: encHeaders.entrySet()) { + String headerName = headerEntry.getKey(); + Header header = ModelUtils.getReferencedHeader(this.openAPI, headerEntry.getValue()); + Parameter headerParam = new Parameter(); + headerParam.setName(headerName); + headerParam.setIn("header"); + headerParam.setDescription(header.getDescription()); + headerParam.setRequired(header.getRequired()); + headerParam.setDeprecated(header.getDeprecated()); + headerParam.setStyle((Parameter.StyleEnum.valueOf(header.getStyle().name())); + headerParam.setExplode(header.getExplode()); + headerParam.setSchema(header.getSchema()); + headerParam.setExamples(header.getExamples()); + headerParam.setExample(header.getExample()); + headerParam.setContent(header.getContent()); + headerParam.setExtensions(header.getExtensions()); + CodegenParameter param = fromParameter(headerParam, imports); + headers.add(param); + } + } + CodegenEncoding ce = new CodegenEncoding( + enc.getContentType(), + headers, + enc.getStyle().toString(), + enc.getExplode().booleanValue(), + enc.getAllowReserved().booleanValue() + ); + String propName = encodingEntry.getKey(); + ceMap.put(propName, ce); + } + } + CodegenProperty schemaProp = fromProperty("schema", mt.getSchema()); + CodegenMediaType codegenMt = new CodegenMediaType(schemaProp, ceMap); + // TODO add content LinkedHashMap of <String, CodegenMediaType> to codegenParameter + } + } if (StringUtils.isNotBlank(schema.get$ref())) { name = ModelUtils.getSimpleRef(schema.get$ref()); -- GitLab From 39f3e13724c4af1e35fcf1ffa641566e5eb2fa0b Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Sun, 28 Nov 2021 08:56:05 -0800 Subject: [PATCH 3/6] Adds content to CodegenParameter --- .../codegen/CodegenParameter.java | 15 ++- .../openapitools/codegen/DefaultCodegen.java | 106 +++++++++--------- 2 files changed, 70 insertions(+), 51 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java index 5bd8a369f0d..dba1721fbca 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java @@ -110,6 +110,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { private boolean hasDiscriminatorWithNonEmptyMapping; private CodegenComposedSchemas composedSchemas; private boolean hasMultipleTypes = false; + private LinkedHashMap<String, CodegenMediaType> content; public CodegenParameter copy() { CodegenParameter output = new CodegenParameter(); @@ -163,6 +164,9 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { output.setHasDiscriminatorWithNonEmptyMapping(this.hasDiscriminatorWithNonEmptyMapping); output.setHasMultipleTypes(this.hasMultipleTypes); + if (this.content != null) { + output.setContent(this.content); + } if (this.schema != null) { output.setSchema(this.schema); } @@ -226,7 +230,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { @Override public int hashCode() { - return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema); + return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content); } @Override @@ -282,6 +286,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { getExclusiveMaximum() == that.getExclusiveMaximum() && getExclusiveMinimum() == that.getExclusiveMinimum() && getUniqueItems() == that.getUniqueItems() && + Objects.equals(content, that.getContent()) && Objects.equals(schema, that.getSchema()) && Objects.equals(composedSchemas, that.getComposedSchemas()) && Objects.equals(baseName, that.baseName) && @@ -409,6 +414,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { sb.append(", composedSchemas=").append(composedSchemas); sb.append(", hasMultipleTypes=").append(hasMultipleTypes); sb.append(", schema=").append(schema); + sb.append(", content=").append(content); sb.append('}'); return sb.toString(); } @@ -743,5 +749,12 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { public void setSchema(CodegenProperty schema) { this.schema = schema; } + public LinkedHashMap<String, CodegenMediaType> getContent() { + return content; + } + + public void setContent(LinkedHashMap<String, CodegenMediaType> content) { + this.content = content; + } } 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 afc552124de..1ae73e8674a 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 @@ -6557,6 +6557,61 @@ public class DefaultCodegen implements CodegenConfig { codegenParameter.pattern = toRegularExpression(schema.getPattern()); } + protected LinkedHashMap<String, CodegenMediaType> getContent(Content content, Set<String> imports) { + if (content == null) { + return null; + } + LinkedHashMap<String, CodegenMediaType> cmtContent = new LinkedHashMap<>(); + for (Entry<String, MediaType> contentEntry: content.entrySet()) { + MediaType mt = contentEntry.getValue(); + LinkedHashMap<String, CodegenEncoding> ceMap = null; + if (mt.getEncoding() != null ) { + ceMap = new LinkedHashMap<>(); + Map<String, Encoding> encMap = mt.getEncoding(); + for (Entry<String, Encoding> encodingEntry: encMap.entrySet()) { + Encoding enc = encodingEntry.getValue(); + List<CodegenParameter> headers = new ArrayList<>(); + if (enc.getHeaders() != null) { + Map<String, Header> encHeaders = enc.getHeaders(); + for (Entry<String, Header> headerEntry: encHeaders.entrySet()) { + String headerName = headerEntry.getKey(); + Header header = ModelUtils.getReferencedHeader(this.openAPI, headerEntry.getValue()); + Parameter headerParam = new Parameter(); + headerParam.setName(headerName); + headerParam.setIn("header"); + headerParam.setDescription(header.getDescription()); + headerParam.setRequired(header.getRequired()); + headerParam.setDeprecated(header.getDeprecated()); + headerParam.setStyle((Parameter.StyleEnum.valueOf(header.getStyle().name())); + headerParam.setExplode(header.getExplode()); + headerParam.setSchema(header.getSchema()); + headerParam.setExamples(header.getExamples()); + headerParam.setExample(header.getExample()); + headerParam.setContent(header.getContent()); + headerParam.setExtensions(header.getExtensions()); + CodegenParameter param = fromParameter(headerParam, imports); + headers.add(param); + } + } + CodegenEncoding ce = new CodegenEncoding( + enc.getContentType(), + headers, + enc.getStyle().toString(), + enc.getExplode().booleanValue(), + enc.getAllowReserved().booleanValue() + ); + String propName = encodingEntry.getKey(); + ceMap.put(propName, ce); + } + } + CodegenProperty schemaProp = fromProperty("schema", mt.getSchema()); + CodegenMediaType codegenMt = new CodegenMediaType(schemaProp, ceMap); + String contentType = contentEntry.getKey(); + cmtContent.put(contentType, codegenMt); + } + return cmtContent; + } + public CodegenParameter fromRequestBody(RequestBody body, Set<String> imports, String bodyParameterName) { if (body == null) { LOGGER.error("body in fromRequestBody cannot be null!"); @@ -6578,56 +6633,7 @@ public class DefaultCodegen implements CodegenConfig { if (schema == null) { throw new RuntimeException("Request body cannot be null. Possible cause: missing schema in body parameter (OAS v2): " + body); } - Content content = body.getContent(); - if (content != null) { - for (Entry<String, MediaType> contentEntry: content.entrySet()) { - String contentType = contentEntry.getKey(); - MediaType mt = contentEntry.getValue(); - LinkedHashMap<String, CodegenEncoding> ceMap = null; - if (mt.getEncoding() != null ) { - ceMap = new LinkedHashMap<>(); - Map<String, Encoding> encMap = mt.getEncoding(); - for (Entry<String, Encoding> encodingEntry: encMap.entrySet()) { - Encoding enc = encodingEntry.getValue(); - List<CodegenParameter> headers = new ArrayList<>(); - if (enc.getHeaders() != null) { - Map<String, Header> encHeaders = enc.getHeaders(); - for (Entry<String, Header> headerEntry: encHeaders.entrySet()) { - String headerName = headerEntry.getKey(); - Header header = ModelUtils.getReferencedHeader(this.openAPI, headerEntry.getValue()); - Parameter headerParam = new Parameter(); - headerParam.setName(headerName); - headerParam.setIn("header"); - headerParam.setDescription(header.getDescription()); - headerParam.setRequired(header.getRequired()); - headerParam.setDeprecated(header.getDeprecated()); - headerParam.setStyle((Parameter.StyleEnum.valueOf(header.getStyle().name())); - headerParam.setExplode(header.getExplode()); - headerParam.setSchema(header.getSchema()); - headerParam.setExamples(header.getExamples()); - headerParam.setExample(header.getExample()); - headerParam.setContent(header.getContent()); - headerParam.setExtensions(header.getExtensions()); - CodegenParameter param = fromParameter(headerParam, imports); - headers.add(param); - } - } - CodegenEncoding ce = new CodegenEncoding( - enc.getContentType(), - headers, - enc.getStyle().toString(), - enc.getExplode().booleanValue(), - enc.getAllowReserved().booleanValue() - ); - String propName = encodingEntry.getKey(); - ceMap.put(propName, ce); - } - } - CodegenProperty schemaProp = fromProperty("schema", mt.getSchema()); - CodegenMediaType codegenMt = new CodegenMediaType(schemaProp, ceMap); - // TODO add content LinkedHashMap of <String, CodegenMediaType> to codegenParameter - } - } + codegenParameter.setContent(getContent(body.getContent(), imports)); if (StringUtils.isNotBlank(schema.get$ref())) { name = ModelUtils.getSimpleRef(schema.get$ref()); -- GitLab From d1723580c606752b036f8ccd22f941c409669e07 Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Sun, 28 Nov 2021 09:16:45 -0800 Subject: [PATCH 4/6] Sets content for request bodies --- .../org/openapitools/codegen/DefaultCodegen.java | 2 +- .../src/openapi_server/openapi/openapi.yaml | 13 +++++++++++++ .../openapi_server/openapi/openapi.yaml | 13 +++++++++++++ samples/server/petstore/python-fastapi/openapi.yaml | 8 ++++++++ .../openapi_server/openapi/openapi.yaml | 13 +++++++++++++ 5 files changed, 48 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 1ae73e8674a..b13cde60baa 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 @@ -6582,7 +6582,7 @@ public class DefaultCodegen implements CodegenConfig { headerParam.setDescription(header.getDescription()); headerParam.setRequired(header.getRequired()); headerParam.setDeprecated(header.getDeprecated()); - headerParam.setStyle((Parameter.StyleEnum.valueOf(header.getStyle().name())); + headerParam.setStyle(Parameter.StyleEnum.valueOf(header.getStyle().name())); headerParam.setExplode(header.getExplode()); headerParam.setSchema(header.getSchema()); headerParam.setExamples(header.getExamples()); diff --git a/samples/server/petstore/python-aiohttp-srclayout/src/openapi_server/openapi/openapi.yaml b/samples/server/petstore/python-aiohttp-srclayout/src/openapi_server/openapi/openapi.yaml index 8b70dbaa5fb..416d4ab0b6d 100644 --- a/samples/server/petstore/python-aiohttp-srclayout/src/openapi_server/openapi/openapi.yaml +++ b/samples/server/petstore/python-aiohttp-srclayout/src/openapi_server/openapi/openapi.yaml @@ -680,22 +680,30 @@ components: properties: id: format: int64 + title: id type: integer username: + title: username type: string firstName: + title: firstName type: string lastName: + title: lastName type: string email: + title: email type: string password: + title: password type: string phone: + title: phone type: string userStatus: description: User Status format: int32 + title: userStatus type: integer title: a User type: object @@ -738,15 +746,18 @@ components: properties: id: format: int64 + title: id type: integer category: $ref: '#/components/schemas/Category' name: example: doggie + title: name type: string photoUrls: items: type: string + title: photoUrls type: array xml: name: photoUrl @@ -754,6 +765,7 @@ components: tags: items: $ref: '#/components/schemas/Tag' + title: tags type: array xml: name: tag @@ -764,6 +776,7 @@ components: - available - pending - sold + title: status type: string required: - name diff --git a/samples/server/petstore/python-aiohttp/openapi_server/openapi/openapi.yaml b/samples/server/petstore/python-aiohttp/openapi_server/openapi/openapi.yaml index 8b70dbaa5fb..416d4ab0b6d 100644 --- a/samples/server/petstore/python-aiohttp/openapi_server/openapi/openapi.yaml +++ b/samples/server/petstore/python-aiohttp/openapi_server/openapi/openapi.yaml @@ -680,22 +680,30 @@ components: properties: id: format: int64 + title: id type: integer username: + title: username type: string firstName: + title: firstName type: string lastName: + title: lastName type: string email: + title: email type: string password: + title: password type: string phone: + title: phone type: string userStatus: description: User Status format: int32 + title: userStatus type: integer title: a User type: object @@ -738,15 +746,18 @@ components: properties: id: format: int64 + title: id type: integer category: $ref: '#/components/schemas/Category' name: example: doggie + title: name type: string photoUrls: items: type: string + title: photoUrls type: array xml: name: photoUrl @@ -754,6 +765,7 @@ components: tags: items: $ref: '#/components/schemas/Tag' + title: tags type: array xml: name: tag @@ -764,6 +776,7 @@ components: - available - pending - sold + title: status type: string required: - name diff --git a/samples/server/petstore/python-fastapi/openapi.yaml b/samples/server/petstore/python-fastapi/openapi.yaml index 133f2f16cfc..94256ed0a0f 100644 --- a/samples/server/petstore/python-fastapi/openapi.yaml +++ b/samples/server/petstore/python-fastapi/openapi.yaml @@ -691,22 +691,30 @@ components: properties: id: format: int64 + title: id type: integer username: + title: username type: string firstName: + title: firstName type: string lastName: + title: lastName type: string email: + title: email type: string password: + title: password type: string phone: + title: phone type: string userStatus: description: User Status format: int32 + title: userStatus type: integer title: a User type: object diff --git a/samples/server/petstore/python-flask/openapi_server/openapi/openapi.yaml b/samples/server/petstore/python-flask/openapi_server/openapi/openapi.yaml index 8b402c5f7bb..f94133dcf46 100644 --- a/samples/server/petstore/python-flask/openapi_server/openapi/openapi.yaml +++ b/samples/server/petstore/python-flask/openapi_server/openapi/openapi.yaml @@ -669,22 +669,30 @@ components: properties: id: format: int64 + title: id type: integer username: + title: username type: string firstName: + title: firstName type: string lastName: + title: lastName type: string email: + title: email type: string password: + title: password type: string phone: + title: phone type: string userStatus: description: User Status format: int32 + title: userStatus type: integer title: a User type: object @@ -727,15 +735,18 @@ components: properties: id: format: int64 + title: id type: integer category: $ref: '#/components/schemas/Category' name: example: doggie + title: name type: string photoUrls: items: type: string + title: photoUrls type: array xml: name: photoUrl @@ -743,6 +754,7 @@ components: tags: items: $ref: '#/components/schemas/Tag' + title: tags type: array xml: name: tag @@ -753,6 +765,7 @@ components: - available - pending - sold + title: status type: string required: - name -- GitLab From 8e4b27aeec7ad64fef48f26ebc04df07313b541f Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Sun, 28 Nov 2021 10:42:45 -0800 Subject: [PATCH 5/6] Adds testParameterContent --- .../openapitools/codegen/DefaultCodegen.java | 1 + .../codegen/DefaultCodegenTest.java | 29 ++++++++ .../src/test/resources/3_0/content-data.yaml | 66 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/content-data.yaml 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 b13cde60baa..046d8609d3c 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 @@ -4486,6 +4486,7 @@ public class DefaultCodegen implements CodegenConfig { codegenParameter.isDeprecated = parameter.getDeprecated(); } codegenParameter.jsonSchema = Json.pretty(parameter); + codegenParameter.setContent(getContent(parameter.getContent(), imports)); if (GlobalSettings.getProperty("debugParser") != null) { LOGGER.info("working on Parameter {}", parameter.getName()); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index aaede097e3d..70ee3991240 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -3875,4 +3875,33 @@ public class DefaultCodegenTest { assertTrue(pr.isByteArray); assertFalse(pr.getIsString()); } + + @Test + public void testParameterContent() { + DefaultCodegen codegen = new DefaultCodegen(); + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/content-data.yaml"); + codegen.setOpenAPI(openAPI); + String path; + CodegenOperation co; + + path = "/jsonQueryParams"; + co = codegen.fromOperation(path, "GET", openAPI.getPaths().get(path).getGet(), null); + CodegenParameter coordinatesInlineSchema = co.queryParams.get(0); + LinkedHashMap<String, CodegenMediaType> content = coordinatesInlineSchema.getContent(); + assertNotNull(content); + assertEquals(content.keySet(), new HashSet<>(Arrays.asList("application/json"))); + CodegenMediaType mt = content.get("application/json"); + assertNull(mt.getEncoding()); + CodegenProperty cp = mt.getSchema(); + assertTrue(cp.isMap); + assertEquals(cp.complexType, "object"); + + CodegenParameter coordinatesReferencedSchema = co.queryParams.get(1); + content = coordinatesReferencedSchema.getContent(); + mt = content.get("application/json"); + assertNull(mt.getEncoding()); + cp = mt.getSchema(); + assertFalse(cp.isMap); // because it is a referenced schema + assertEquals(cp.complexType, "coordinates"); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/content-data.yaml b/modules/openapi-generator/src/test/resources/3_0/content-data.yaml new file mode 100644 index 00000000000..992f06c1fd0 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/content-data.yaml @@ -0,0 +1,66 @@ +openapi: 3.0.0 +info: + title: Tests content data in an endpoint parameter and a request body + description: blah +paths: + /jsonQueryParams: + get: + parameters: + - name: coordinatesInlineSchema + in: query + content: + application/json: + schema: + type: object + required: + - lat + - long + properties: + lat: + type: number + long: + type: number + - name: coordinatesReferencedSchema + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/coordinates' + responses: + '201': + description: 'OK' + /inlineRequestBodyDifferingByContentType: + post: + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - lat + - long + properties: + lat: + type: number + long: + type: number + text/plain: + schema: + type: string + minLength: 5 + responses: + 200: + description: OK +components: + schemas: + coordinates: + type: object + required: + - lat + - long + properties: + lat: + type: number + long: + type: number -- GitLab From ec80fe8cd0e2f2f828d78f9b7a2a2e047c0cfa3c Mon Sep 17 00:00:00 2001 From: Justin Black <justin.a.black@gmail.com> Date: Sun, 28 Nov 2021 23:23:36 -0800 Subject: [PATCH 6/6] Adds testRequestBodyContent --- .../codegen/DefaultCodegenTest.java | 43 +++++++++++++++++++ .../src/test/resources/3_0/content-data.yaml | 19 +++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 70ee3991240..28748850f1b 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -3904,4 +3904,47 @@ public class DefaultCodegenTest { assertFalse(cp.isMap); // because it is a referenced schema assertEquals(cp.complexType, "coordinates"); } + + @Test + public void testRequestBodyContent() { + DefaultCodegen codegen = new DefaultCodegen(); + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/content-data.yaml"); + codegen.setOpenAPI(openAPI); + String path; + CodegenOperation co; + + path = "/inlineRequestBodySchemasDifferingByContentType"; + co = codegen.fromOperation(path, "POST", openAPI.getPaths().get(path).getPost(), null); + CodegenParameter bodyParameter = co.bodyParam; + LinkedHashMap<String, CodegenMediaType> content = bodyParameter.getContent(); + assertNotNull(content); + assertEquals(content.keySet(), new HashSet<>(Arrays.asList("application/json", "text/plain"))); + CodegenMediaType mt = content.get("application/json"); + assertNull(mt.getEncoding()); + CodegenProperty cp = mt.getSchema(); + assertNotNull(cp); + + mt = content.get("text/plain"); + assertNull(mt.getEncoding()); + cp = mt.getSchema(); + assertNotNull(cp); + // Note: the inline model resolver has a bug for this use case; it extracts an inline request body into a component + // but the schema it references is not string type + + path = "/refRequestBodySchemasDifferingByContentType"; + co = codegen.fromOperation(path, "POST", openAPI.getPaths().get(path).getPost(), null); + bodyParameter = co.bodyParam; + content = bodyParameter.getContent(); + assertNotNull(content); + assertEquals(content.keySet(), new HashSet<>(Arrays.asList("application/json", "text/plain"))); + mt = content.get("application/json"); + assertNull(mt.getEncoding()); + cp = mt.getSchema(); + assertEquals(cp.complexType, "coordinates"); + + mt = content.get("text/plain"); + assertNull(mt.getEncoding()); + cp = mt.getSchema(); + assertTrue(cp.isString); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/content-data.yaml b/modules/openapi-generator/src/test/resources/3_0/content-data.yaml index 992f06c1fd0..56228cd3054 100644 --- a/modules/openapi-generator/src/test/resources/3_0/content-data.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/content-data.yaml @@ -29,7 +29,7 @@ paths: responses: '201': description: 'OK' - /inlineRequestBodyDifferingByContentType: + /inlineRequestBodySchemasDifferingByContentType: post: requestBody: required: true @@ -52,8 +52,25 @@ paths: responses: 200: description: OK + /refRequestBodySchemasDifferingByContentType: + post: + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/coordinates' + text/plain: + schema: + $ref: '#/components/schemas/stringWithMinLength' + responses: + 200: + description: OK components: schemas: + stringWithMinLength: + type: string + minLength: 5 coordinates: type: object required: -- GitLab