Skip to content

Commit befa7fa

Browse files
committed
Use getReferencedSchema in search for properties
1 parent c1da8d4 commit befa7fa

4 files changed

Lines changed: 38 additions & 24 deletions

File tree

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

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,25 +1603,31 @@ protected Schema processReplaceOneOfByMapping(Schema schema) {
16031603
return schema;
16041604
}
16051605
if (discriminator.getMapping() == null && discriminator.getPropertyName() != null) {
1606+
List<Schema> oneOfs = schema.getOneOf();
1607+
if (oneOfs.stream().anyMatch(oneOf -> oneOf.get$ref() == null)) {
1608+
LOGGER.warn("oneOf should only contain $ref for REPLACE_ONE_OF_BY_DISCRIMINATOR_MAPPING normalization");
1609+
return schema;
1610+
}
16061611
Map<String, String> mappings = new TreeMap<>();
1612+
// is the discriminator qttribute qlready in this schema?
1613+
// if yes, it will be deleted in references oneOf to avoid duplicates
1614+
boolean hasProperty = findProperty(schema, discriminator.getPropertyName(), false, new HashSet<>()) != null;
16071615
discriminator.setMapping(mappings);
1608-
List<Schema> oneOfs = schema.getOneOf();
16091616
for (Schema oneOf : oneOfs) {
16101617
String refSchema = oneOf.get$ref();
1611-
if (refSchema != null) {
1612-
boolean hasProperty = findProperty(schema, discriminator.getPropertyName(), false, new HashSet<>()) != null;
1613-
String name = getDiscriminatorValue(refSchema, discriminator.getPropertyName(), hasProperty);
1614-
mappings.put(name, refSchema);
1615-
}
1618+
String name = getDiscriminatorValue(refSchema, discriminator.getPropertyName(), hasProperty, new HashSet<>(List.of(schema)));
1619+
mappings.put(name, refSchema);
1620+
16161621
}
16171622
// remove oneOf and only keep the new discriminator mapping
16181623
schema.setOneOf(null);
16191624
} else if (discriminator.getPropertyName() == null) {
16201625
LOGGER.warn("Missing property name in discriminator");
16211626
} else if (discriminator.getMapping() != null && discriminator.getMapping().size() != schema.getOneOf().size()) {
1622-
LOGGER.warn("Discriminator Mapping size " + discriminator.getMapping().size() + " mismatch with oneOf size " + schema.getOneOf().size());
1627+
LOGGER.warn("Discriminator mapping size " + discriminator.getMapping().size() + " mismatch with oneOf size " + schema.getOneOf().size());
16231628
} else {
16241629
// remove oneOf and only keep the discriminator mapping
1630+
LOGGER.info("Removing oneOf, discriminator mapping takes precedences on OneOfs");
16251631
schema.setOneOf(null);
16261632
}
16271633
}
@@ -1656,10 +1662,10 @@ private boolean isInlineSchema(Schema schema) {
16561662
*
16571663
* @return the name
16581664
*/
1659-
protected String getDiscriminatorValue(String refSchema, String discriminatorPropertyName, boolean propertyAlreadyPresent) {
1665+
protected String getDiscriminatorValue(String refSchema, String discriminatorPropertyName, boolean propertyAlreadyPresent, Set<Schema> visitedSchemas) {
16601666
String schemaName = ModelUtils.getSimpleRef(refSchema);
16611667
Schema schema = ModelUtils.getSchema(openAPI, schemaName);
1662-
Schema property = findProperty(schema, discriminatorPropertyName, propertyAlreadyPresent, new HashSet<>());
1668+
Schema property = findProperty(schema, discriminatorPropertyName, propertyAlreadyPresent, visitedSchemas);
16631669
if (schema != null && schema.getExtensions() != null) {
16641670
Object discriminatorValue = schema.getExtensions().get("x-discriminator-value");
16651671
if (discriminatorValue != null) {
@@ -1668,6 +1674,7 @@ protected String getDiscriminatorValue(String refSchema, String discriminatorPro
16681674
}
16691675

16701676
// find the discriminator value as a unique enum value
1677+
property = ModelUtils.getReferencedSchema(openAPI, property);
16711678
if (property != null) {
16721679
List enums = property.getEnum();
16731680
if (enums != null && enums.size() == 1) {
@@ -1687,14 +1694,15 @@ protected String getDiscriminatorValue(String refSchema, String discriminatorPro
16871694
* @param visitedSchemas avoid infinite recursion
16881695
* @return found property or null if not found.
16891696
*/
1690-
private Schema findProperty(Schema schema, String propertyName, boolean toDelete, HashSet<Object> visitedSchemas) {
1697+
private Schema findProperty(Schema schema, String propertyName, boolean toDelete, Set<Schema> visitedSchemas) {
1698+
schema = ModelUtils.getReferencedSchema(openAPI, schema);
16911699
if (propertyName == null || schema == null || visitedSchemas.contains(schema)) {
16921700
return null;
16931701
}
16941702
visitedSchemas.add(schema);
16951703
Map<String, Schema> properties = schema.getProperties();
16961704
if (properties != null) {
1697-
Schema property = properties.get(propertyName);
1705+
Schema property = ModelUtils.getReferencedSchema(openAPI, properties.get(propertyName));
16981706
if (property != null) {
16991707
if (toDelete) {
17001708
if (schema.getProperties().remove(propertyName) != null) {
@@ -1784,6 +1792,7 @@ private boolean hasParent(Schema parent, Schema child, String reference, Set<Sch
17841792
if (child.get$ref() != null && child.get$ref().equals(reference)) {
17851793
return true;
17861794
}
1795+
child = ModelUtils.getReferencedSchema(openAPI, child);
17871796
List<Schema> allOf = child.getAllOf();
17881797
if (allOf != null) {
17891798
for (Schema schema : allOf) {

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4355,7 +4355,7 @@ void replaceOneOfByDiscriminatorMapping(String file) {
43554355
}
43564356

43574357
@Test
4358-
void issue_912() {
4358+
void oneOf_issue_912() {
43594359
Map<String, File> files = generateFromContract("src/test/resources/3_0/java/issue_912.yaml", APACHE,
43604360
Map.of(),
43614361
codegen -> codegen.addOpenapiNormalizer("REPLACE_ONE_OF_BY_DISCRIMINATOR_MAPPING", "true")

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6684,13 +6684,14 @@ void replaceOneOfByDiscriminatorMapping(String file) throws IOException {
66846684

66856685
JavaFileAssert.assertThat(files.get("Polygon.java"))
66866686
.extendsClass("GeoJsonObject")
6687+
.fileDoesNotContain(" type;")
66876688
.doesNotImplementInterfaces("GeoJsonObject")
66886689
.fileContains("List<Double> coordinates")
66896690
.fileDoesNotContain("@JsonSubTypes");
66906691
}
66916692

66926693
@Test
6693-
void issue_19261() throws IOException {
6694+
void oneOf_issue_19261() throws IOException {
66946695
Map<String, File> files = generateFromContract("src/test/resources/3_0/oneOf_issue_19261.yaml", SPRING_BOOT,
66956696
Map.of(GENERATE_MODEL_DOCS, false, GENERATE_APIS, false, INTERFACE_ONLY, true),
66966697
codegen -> codegen.addOpenapiNormalizer("REPLACE_ONE_OF_BY_DISCRIMINATOR_MAPPING", "true"));
@@ -6708,7 +6709,7 @@ void issue_19261() throws IOException {
67086709
}
67096710

67106711
@Test
6711-
void issue_22013() throws IOException {
6712+
void oneOf_issue_22013() throws IOException {
67126713
Map<String, File> files = generateFromContract("src/test/resources/3_0/oneOf_issue_22013.yaml", SPRING_BOOT,
67136714
Map.of(GENERATE_MODEL_DOCS, false, GENERATE_APIS, false, INTERFACE_ONLY, true),
67146715
codegen -> codegen.addOpenapiNormalizer("REPLACE_ONE_OF_BY_DISCRIMINATOR_MAPPING", "true"));
@@ -6727,7 +6728,7 @@ void issue_22013() throws IOException {
67276728
}
67286729

67296730
@Test
6730-
void issue_23577() throws IOException {
6731+
void oneOf_issue_23577() throws IOException {
67316732
Map<String, File> files = generateFromContract("src/test/resources/3_0/oneOf_issue_23577.yaml", SPRING_BOOT,
67326733
Map.of(GENERATE_MODEL_DOCS, false, GENERATE_APIS, false, INTERFACE_ONLY, true),
67336734
codegen -> codegen.addOpenapiNormalizer("REPLACE_ONE_OF_BY_DISCRIMINATOR_MAPPING", "true"));
@@ -6764,7 +6765,7 @@ void oneof_polymorphism_and_inheritance() throws IOException {
67646765
}
67656766

67666767
@Test
6767-
public void issue_14769() throws IOException {
6768+
void oneOf_issue_14769() throws IOException {
67686769
Map<String, File> files = generateFromContract("src/test/resources/3_0/oneOf_issue_14769.yaml", SPRING_BOOT,
67696770
Map.of(MODEL_NAME_SUFFIX, "Dto",
67706771
GENERATE_MODEL_DOCS, false, GENERATE_APIS, false, INTERFACE_ONLY, true),

modules/openapi-generator/src/test/resources/3_0/oneOf_issue_14769.yaml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ components:
3535

3636
Plane:
3737
type: object
38-
properties:
39-
type:
40-
enum:
41-
- plane
42-
has_reactor:
43-
type: boolean
44-
nb_passengers:
45-
type: integer
38+
allOf:
39+
- properties:
40+
type:
41+
$ref: '#/components/schemas/PlaneEnum'
42+
has_reactor:
43+
type: boolean
44+
nb_passengers:
45+
type: integer
46+
PlaneEnum:
47+
type: string
48+
enum:
49+
- plane

0 commit comments

Comments
 (0)