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