Skip to content

Commit 9579122

Browse files
authored
Better handling of parameters in inline model resolver (#19460)
* add tests for parameter ref of oneOf * update samples * better handlding of parameters in inline model resolver
1 parent d6780e7 commit 9579122

30 files changed

Lines changed: 3082 additions & 19 deletions

modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,15 @@ private void flattenPaths() {
141141
}
142142
}
143143

144+
// flatten path-level parameters
145+
flattenParameters(pathname, path.getParameters(), null);
146+
147+
// flatten parameters for each operation
144148
for (Map.Entry<HttpMethod, Operation> operationEntry : toFlatten) {
145149
Operation operation = operationEntry.getValue();
146150
String inlineSchemaName = this.getInlineSchemaName(operationEntry.getKey(), pathname);
147151
flattenRequestBody(inlineSchemaName, operation);
148-
flattenParameters(inlineSchemaName, operation);
152+
flattenParameters(inlineSchemaName, operation.getParameters(), operation.getOperationId());
149153
flattenResponses(inlineSchemaName, operation);
150154
}
151155
}
@@ -509,15 +513,20 @@ private void flattenRequestBody(String modelName, Operation operation) {
509513
* Flatten inline models in parameters
510514
*
511515
* @param modelName model name
512-
* @param operation target operation
516+
* @param parameters list of parameters
517+
* @param operationId operation Id (optional)
513518
*/
514-
private void flattenParameters(String modelName, Operation operation) {
515-
List<Parameter> parameters = operation.getParameters();
519+
private void flattenParameters(String modelName, List<Parameter> parameters, String operationId) {
520+
//List<Parameter> parameters = operation.getParameters();
516521
if (parameters == null) {
517522
return;
518523
}
519524

520525
for (Parameter parameter : parameters) {
526+
if (StringUtils.isNotEmpty(parameter.get$ref())) {
527+
parameter = ModelUtils.getReferencedParameter(openAPI, parameter);
528+
}
529+
521530
if (parameter.getSchema() == null) {
522531
continue;
523532
}
@@ -528,7 +537,7 @@ private void flattenParameters(String modelName, Operation operation) {
528537
continue;
529538
}
530539
String schemaName = resolveModelName(parameterSchema.getTitle(),
531-
(operation.getOperationId() == null ? modelName : operation.getOperationId()) + "_" + parameter.getName() + "_parameter");
540+
(operationId == null ? modelName : operationId) + "_" + parameter.getName() + "_parameter");
532541
// Recursively gather/make inline models within this schema if any
533542
gatherInlineModels(parameterSchema, schemaName);
534543
if (isModelNeeded(parameterSchema)) {

modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,7 @@ private void normalizeParameters(List<Parameter> parameters) {
411411
parameter = ModelUtils.getReferencedParameter(openAPI, parameter);
412412
}
413413

414-
if (parameter.getSchema() == null) {
415-
continue;
416-
} else {
414+
if (parameter.getSchema() != null) {
417415
Schema newSchema = normalizeSchema(parameter.getSchema(), new HashSet<>());
418416
parameter.setSchema(newSchema);
419417
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
704704
propertyHash.put(property.name, property);
705705
final CodegenProperty parentVar = property.clone();
706706
parentVar.isInherited = true;
707-
LOGGER.info("adding parent variable {} to {}", property.name, codegenModel.name);
707+
LOGGER.debug("adding parent variable {} to {}", property.name, codegenModel.name);
708708
codegenModel.parentVars.add(parentVar);
709709
Set<String> imports = parentVar.getImports(true, this.importBaseType, generatorMetadata.getFeatureSet()).stream().filter(Objects::nonNull).collect(Collectors.toSet());
710710
for (String imp : imports) {

modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-okhttp-gson.yaml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,7 +1340,7 @@ paths:
13401340
post:
13411341
tags:
13421342
- fake
1343-
summary: fake uploads an image with ref request bodies
1343+
summary: fake reference parameter
13441344
description: ''
13451345
operationId: fake-upload-ref-request-bodies
13461346
parameters:
@@ -1364,7 +1364,18 @@ paths:
13641364
- 'read:pets'
13651365
requestBody:
13661366
$ref: '#/components/requestBodies/upload_body'
1367-
1367+
'/fake/pet/{petId}/reference/parameter':
1368+
post:
1369+
tags:
1370+
- fake
1371+
summary: fake reference parameter
1372+
description: ''
1373+
operationId: fake-ref-parameter
1374+
parameters:
1375+
- $ref: '#/components/parameters/pet_id'
1376+
responses:
1377+
'200':
1378+
description: successful operation
13681379
/values:
13691380
get:
13701381
tags:
@@ -1423,6 +1434,16 @@ servers:
14231434
- url: https://127.0.0.1/no_variable
14241435
description: The local server without variables
14251436
components:
1437+
parameters:
1438+
pet_id:
1439+
name: petId
1440+
in: path
1441+
description: to test oneOf in parameter $ref
1442+
required: true
1443+
schema:
1444+
oneOf:
1445+
- type: string
1446+
- type: integer
14261447
requestBodies:
14271448
upload_body:
14281449
content:

modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,28 @@ paths:
609609
$ref: '#/components/responses/ref'
610610
parameters:
611611
- $ref: '#/components/parameters/ref_to_uuid'
612+
/ref/ref_to_path_level_parameter_oneof:
613+
get:
614+
description: to test $ref to path level parameters
615+
operationId: ref_to_ref_parameter_oneof
616+
tags:
617+
- fake
618+
responses:
619+
'200':
620+
description: Successful Response
621+
parameters:
622+
- $ref: '#/components/parameters/ref_to_oneof'
623+
/ref/ref_to_operation_level_parameter_oneof:
624+
get:
625+
description: to test $ref to operation level parameters
626+
operationId: ref_to_ref_parameter_anyof
627+
tags:
628+
- fake
629+
responses:
630+
'200':
631+
description: Successful Response
632+
parameters:
633+
- $ref: '#/components/parameters/ref_to_anyof'
612634
"/fake/api/changeowner":
613635
post:
614636
summary: op1
@@ -720,6 +742,26 @@ components:
720742
type: string
721743
format: uuid
722744
example: 61864654-6e6b-4152-a62f-795fdd606bc2
745+
ref_to_oneof:
746+
description: to test ref to parameter (oneof)
747+
name: ref_to_oneof
748+
in: header
749+
required: true
750+
schema:
751+
oneOf:
752+
- type: string
753+
- type: integer
754+
ref_to_anyof:
755+
description: to test ref to parameter (anyof)
756+
name: ref_to_anyof
757+
in: header
758+
required: true
759+
schema:
760+
oneOf:
761+
- type: string
762+
- type: array
763+
items:
764+
type: string
723765
requestBodies:
724766
UserArray:
725767
content:
@@ -1023,4 +1065,4 @@ components:
10231065
allOf:
10241066
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
10251067
myObject:
1026-
type: object
1068+
type: object

samples/client/petstore/java/okhttp-gson-3.1/.openapi-generator/FILES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ docs/OneOfStringOrInt.md
2222
docs/Order.md
2323
docs/Pet.md
2424
docs/PetApi.md
25+
docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md
26+
docs/RefToRefParameterAnyofRefToAnyofParameter.md
2527
docs/SimpleModelWithArrayProperty.md
2628
docs/StoreApi.md
2729
docs/StringOrInt.md
@@ -78,6 +80,8 @@ src/main/java/org/openapitools/client/model/ModelApiResponse.java
7880
src/main/java/org/openapitools/client/model/OneOfStringOrInt.java
7981
src/main/java/org/openapitools/client/model/Order.java
8082
src/main/java/org/openapitools/client/model/Pet.java
83+
src/main/java/org/openapitools/client/model/RefRefToPathLevelParameterOneofRefToOneofParameter.java
84+
src/main/java/org/openapitools/client/model/RefToRefParameterAnyofRefToAnyofParameter.java
8185
src/main/java/org/openapitools/client/model/SimpleModelWithArrayProperty.java
8286
src/main/java/org/openapitools/client/model/StringOrInt.java
8387
src/main/java/org/openapitools/client/model/Tag.java

samples/client/petstore/java/okhttp-gson-3.1/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ Class | Method | HTTP request | Description
120120
*FakeApi* | [**op2**](docs/FakeApi.md#op2) | **POST** /fake/api/changename | op2
121121
*FakeApi* | [**op3**](docs/FakeApi.md#op3) | **POST** /fake/api/query/enum | op3
122122
*FakeApi* | [**refToRefParameter**](docs/FakeApi.md#refToRefParameter) | **GET** /ref/ref_to_parameter |
123+
*FakeApi* | [**refToRefParameterAnyof**](docs/FakeApi.md#refToRefParameterAnyof) | **GET** /ref/ref_to_operation_level_parameter_oneof |
124+
*FakeApi* | [**refToRefParameterOneof**](docs/FakeApi.md#refToRefParameterOneof) | **GET** /ref/ref_to_path_level_parameter_oneof |
123125
*FakeApi* | [**responseNoRef**](docs/FakeApi.md#responseNoRef) | **GET** /no_ref |
124126
*FakeApi* | [**responseRefToNoRef**](docs/FakeApi.md#responseRefToNoRef) | **GET** /ref/no_ref |
125127
*FakeApi* | [**responseRefToRef**](docs/FakeApi.md#responseRefToRef) | **GET** /ref/ref |
@@ -162,6 +164,8 @@ Class | Method | HTTP request | Description
162164
- [OneOfStringOrInt](docs/OneOfStringOrInt.md)
163165
- [Order](docs/Order.md)
164166
- [Pet](docs/Pet.md)
167+
- [RefRefToPathLevelParameterOneofRefToOneofParameter](docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md)
168+
- [RefToRefParameterAnyofRefToAnyofParameter](docs/RefToRefParameterAnyofRefToAnyofParameter.md)
165169
- [SimpleModelWithArrayProperty](docs/SimpleModelWithArrayProperty.md)
166170
- [StringOrInt](docs/StringOrInt.md)
167171
- [Tag](docs/Tag.md)

samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,34 @@ paths:
687687
- text/plain
688688
parameters:
689689
- $ref: '#/components/parameters/ref_to_uuid'
690+
/ref/ref_to_path_level_parameter_oneof:
691+
get:
692+
description: to test $ref to path level parameters
693+
operationId: ref_to_ref_parameter_oneof
694+
parameters:
695+
- $ref: '#/components/parameters/ref_to_oneof'
696+
responses:
697+
"200":
698+
description: Successful Response
699+
tags:
700+
- fake
701+
x-accepts:
702+
- application/json
703+
parameters:
704+
- $ref: '#/components/parameters/ref_to_oneof'
705+
/ref/ref_to_operation_level_parameter_oneof:
706+
get:
707+
description: to test $ref to operation level parameters
708+
operationId: ref_to_ref_parameter_anyof
709+
parameters:
710+
- $ref: '#/components/parameters/ref_to_anyof'
711+
responses:
712+
"200":
713+
description: Successful Response
714+
tags:
715+
- fake
716+
x-accepts:
717+
- application/json
690718
/fake/api/changeowner:
691719
post:
692720
operationId: op1
@@ -805,6 +833,24 @@ components:
805833
format: uuid
806834
type: string
807835
style: simple
836+
ref_to_oneof:
837+
description: to test ref to parameter (oneof)
838+
explode: false
839+
in: header
840+
name: ref_to_oneof
841+
required: true
842+
schema:
843+
$ref: '#/components/schemas/_ref_ref_to_path_level_parameter_oneof_ref_to_oneof_parameter'
844+
style: simple
845+
ref_to_anyof:
846+
description: to test ref to parameter (anyof)
847+
explode: false
848+
in: header
849+
name: ref_to_anyof
850+
required: true
851+
schema:
852+
$ref: '#/components/schemas/ref_to_ref_parameter_anyof_ref_to_anyof_parameter'
853+
style: simple
808854
requestBodies:
809855
UserArray:
810856
content:
@@ -1134,6 +1180,15 @@ components:
11341180
description: file to upload
11351181
format: binary
11361182
type: string
1183+
_ref_ref_to_path_level_parameter_oneof_ref_to_oneof_parameter:
1184+
oneOf:
1185+
- type: string
1186+
- type: integer
1187+
ref_to_ref_parameter_anyof_ref_to_anyof_parameter:
1188+
oneOf:
1189+
- type: string
1190+
- items:
1191+
type: string
11371192
securitySchemes:
11381193
petstore_auth:
11391194
flows:

0 commit comments

Comments
 (0)