Skip to content

Commit dccb147

Browse files
authored
Fix allOf with a single item in inline model resolver (#17683)
* fix inline model resolver for allof with 1 item * add files * update sha * more checks
1 parent 4840b36 commit dccb147

File tree

11 files changed

+755
-8
lines changed

11 files changed

+755
-8
lines changed

bin/utils/test_file_list.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
- filename: "samples/client/petstore/java/okhttp-gson/src/test/java/org/openapitools/client/ClientTest.java"
1111
sha256: db505f7801fef62c13a08a8e9ca1fc4c5c947ab46b46f12943139d353feacf17
1212
- filename: "samples/client/petstore/java/okhttp-gson/src/test/java/org/openapitools/client/JSONTest.java"
13-
sha256: 6db714e9744c150c8982c3cb18e4f37a9c1ecd8f72f6d58943986e781ab4a344
13+
sha256: 7b9514ac0b3730685590d6ef273b2c2a1fb72d968529c2423a139ee9b0b92a65
1414
- filename: "samples/client/petstore/java/okhttp-gson/src/test/java/org/openapitools/client/api/PetApiTest.java"
1515
sha256: 0d64cdc11809a7b5b952ccdad2bd91bd0045b3894d6fabf3e368fa0be12b8217
1616
- filename: "samples/client/petstore/java/okhttp-gson/src/test/java/org/openapitools/client/model/PetTest.java"

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -851,13 +851,21 @@ private void flattenProperties(OpenAPI openAPI, Map<String, Schema> properties,
851851
} else {
852852
LOGGER.debug("Schema not yet handled in model resolver: {}", inner);
853853
}
854-
} else if (ModelUtils.isComposedSchema(property)) { // oneOf, anyOf, etc
855-
String propertyModelName = resolveModelName(property.getTitle(), path + "_" + key);
856-
gatherInlineModels(property, propertyModelName);
857-
propertyModelName = addSchemas(propertyModelName, property);
858-
Schema schema = new Schema().$ref(propertyModelName);
859-
schema.setRequired(property.getRequired());
860-
propsToUpdate.put(key, schema);
854+
} else if (ModelUtils.isComposedSchema(property)) { // oneOf, anyOf, allOf etc
855+
if (property.getAllOf() != null && property.getAllOf().size() == 1 // allOf with a single item
856+
&& (property.getOneOf() == null || property.getOneOf().isEmpty()) // not oneOf
857+
&& (property.getAnyOf() == null || property.getAnyOf().isEmpty()) // not anyOf
858+
&& (property.getProperties() == null || property.getProperties().isEmpty())) { // no property
859+
// don't do anything if it's allOf with a single item
860+
LOGGER.debug("allOf with a single item (which can be handled by default codegen) skipped by inline model resolver: {}", property);
861+
} else {
862+
String propertyModelName = resolveModelName(property.getTitle(), path + "_" + key);
863+
gatherInlineModels(property, propertyModelName);
864+
propertyModelName = addSchemas(propertyModelName, property);
865+
Schema schema = new Schema().$ref(propertyModelName);
866+
schema.setRequired(property.getRequired());
867+
propsToUpdate.put(key, schema);
868+
}
861869
} else {
862870
LOGGER.debug("Schema not yet handled in model resolver: {}", property);
863871
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,3 +2544,41 @@ components:
25442544
oneOf:
25452545
- $ref: '#/components/schemas/Pet'
25462546
- $ref: '#/components/schemas/Order'
2547+
PetUsingAllOf:
2548+
type: object
2549+
required:
2550+
- name
2551+
- photoUrls
2552+
properties:
2553+
id:
2554+
type: integer
2555+
format: int64
2556+
x-is-unique: true
2557+
category:
2558+
allOf:
2559+
- $ref: '#/components/schemas/Category'
2560+
name:
2561+
type: string
2562+
example: doggie
2563+
photoUrls:
2564+
type: array
2565+
xml:
2566+
name: photoUrl
2567+
wrapped: true
2568+
items:
2569+
type: string
2570+
tags:
2571+
type: array
2572+
xml:
2573+
name: tag
2574+
wrapped: true
2575+
items:
2576+
allOf:
2577+
- $ref: '#/components/schemas/Tag'
2578+
status:
2579+
type: string
2580+
description: pet status in the store
2581+
enum:
2582+
- available
2583+
- pending
2584+
- sold

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ docs/OuterEnumIntegerDefaultValue.md
7878
docs/ParentPet.md
7979
docs/Pet.md
8080
docs/PetApi.md
81+
docs/PetUsingAllOf.md
8182
docs/PetWithRequiredTags.md
8283
docs/Pig.md
8384
docs/PropertyNameCollision.md
@@ -210,6 +211,7 @@ src/main/java/org/openapitools/client/model/OuterEnumInteger.java
210211
src/main/java/org/openapitools/client/model/OuterEnumIntegerDefaultValue.java
211212
src/main/java/org/openapitools/client/model/ParentPet.java
212213
src/main/java/org/openapitools/client/model/Pet.java
214+
src/main/java/org/openapitools/client/model/PetUsingAllOf.java
213215
src/main/java/org/openapitools/client/model/PetWithRequiredTags.java
214216
src/main/java/org/openapitools/client/model/Pig.java
215217
src/main/java/org/openapitools/client/model/PropertyNameCollision.java

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ Class | Method | HTTP request | Description
232232
- [OuterEnumIntegerDefaultValue](docs/OuterEnumIntegerDefaultValue.md)
233233
- [ParentPet](docs/ParentPet.md)
234234
- [Pet](docs/Pet.md)
235+
- [PetUsingAllOf](docs/PetUsingAllOf.md)
235236
- [PetWithRequiredTags](docs/PetWithRequiredTags.md)
236237
- [Pig](docs/Pig.md)
237238
- [PropertyNameCollision](docs/PropertyNameCollision.md)

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2527,6 +2527,44 @@ components:
25272527
attributes:
25282528
$ref: '#/components/schemas/AllOfModelArrayAnyOf_allOf_attributes'
25292529
type: object
2530+
PetUsingAllOf:
2531+
properties:
2532+
id:
2533+
format: int64
2534+
type: integer
2535+
x-is-unique: true
2536+
category:
2537+
allOf:
2538+
- $ref: '#/components/schemas/Category'
2539+
name:
2540+
example: doggie
2541+
type: string
2542+
photoUrls:
2543+
items:
2544+
type: string
2545+
type: array
2546+
xml:
2547+
name: photoUrl
2548+
wrapped: true
2549+
tags:
2550+
items:
2551+
allOf:
2552+
- $ref: '#/components/schemas/Tag'
2553+
type: array
2554+
xml:
2555+
name: tag
2556+
wrapped: true
2557+
status:
2558+
description: pet status in the store
2559+
enum:
2560+
- available
2561+
- pending
2562+
- sold
2563+
type: string
2564+
required:
2565+
- name
2566+
- photoUrls
2567+
type: object
25302568
_foo_get_default_response:
25312569
example:
25322570
string:
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
3+
# PetUsingAllOf
4+
5+
6+
## Properties
7+
8+
| Name | Type | Description | Notes |
9+
|------------ | ------------- | ------------- | -------------|
10+
|**id** | **Long** | | [optional] |
11+
|**category** | [**Category**](Category.md) | | [optional] |
12+
|**name** | **String** | | |
13+
|**photoUrls** | **List&lt;String&gt;** | | |
14+
|**tags** | [**List&lt;Tag&gt;**](Tag.md) | | [optional] |
15+
|**status** | [**StatusEnum**](#StatusEnum) | pet status in the store | [optional] |
16+
17+
18+
19+
## Enum: StatusEnum
20+
21+
| Name | Value |
22+
|---- | -----|
23+
| AVAILABLE | &quot;available&quot; |
24+
| PENDING | &quot;pending&quot; |
25+
| SOLD | &quot;sold&quot; |
26+
27+
28+

samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ private static Class getClassByDiscriminator(Map classByDiscriminatorValue, Stri
297297
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.OuterComposite.CustomTypeAdapterFactory());
298298
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ParentPet.CustomTypeAdapterFactory());
299299
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory());
300+
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.PetUsingAllOf.CustomTypeAdapterFactory());
300301
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.PetWithRequiredTags.CustomTypeAdapterFactory());
301302
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pig.CustomTypeAdapterFactory());
302303
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.PropertyNameCollision.CustomTypeAdapterFactory());

0 commit comments

Comments
 (0)