Skip to content

Commit dd26e40

Browse files
authored
Fix duplicated mappedModels (#7924)
* fix duplicated mapped models * replace discriminatorExplicitMappingVerbose with legacyDiscriminatorBehavior in comments * use mappingName for comparison * improve template * fix tests * update comments * update ts samples
1 parent cf8ea91 commit dd26e40

File tree

43 files changed

+75
-83
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+75
-83
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.apache.commons.lang3.builder.ToStringBuilder;
44

5-
import java.util.LinkedHashSet;
5+
import java.util.TreeSet;
66
import java.util.Map;
77
import java.util.Objects;
88
import java.util.Set;
@@ -25,22 +25,22 @@ public class CodegenDiscriminator {
2525
private String propertyType;
2626
private Map<String, String> mapping;
2727

28-
// mappedModels is populated differently if discriminatorExplicitMappingVerbose is
28+
// mappedModels is populated differently if legacyDiscriminatorBehavior is
2929
// True or False. When:
3030
//
31-
// discriminatorExplicitMappingVerbose == False, this contains:
31+
// legacyDiscriminatorBehavior == False, this contains:
3232
// - the name to schema map info in the discriminator mapping entry in your openapi spec OR
3333
// - child schemas that allOf inherit self schema
3434
//
35-
// discriminatorExplicitMappingVerbose == True, this contains:
35+
// legacyDiscriminatorBehavior == True, this contains:
3636
// - the name to schema map info in the discriminMappedModelator mapping entry in your openapi spec AND
3737
// - x-discriminator-value mappings in child oneOf + anyOf schemas + descendant schemas that allOf inherit self schema AND
3838
// - descendant schemas that allOf inherit self schema AND
3939
// - child oneOf + anyOf schemas
4040
//
4141
// see the method createDiscriminator in DefaultCodegen.java
4242

43-
private Set<MappedModel> mappedModels = new LinkedHashSet<>();
43+
private Set<MappedModel> mappedModels = new TreeSet<>();
4444

4545
public String getPropertyName() {
4646
return propertyName;

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2936,7 +2936,16 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch
29362936
// for schemas that allOf inherit from this schema, add those descendants to this discriminator map
29372937
List<MappedModel> otherDescendants = getAllOfDescendants(schemaName, openAPI);
29382938
for (MappedModel otherDescendant : otherDescendants) {
2939-
if (!uniqueDescendants.contains(otherDescendant)) {
2939+
// add only if the mapping names are not the same
2940+
boolean matched = false;
2941+
for (MappedModel uniqueDescendant: uniqueDescendants) {
2942+
if (uniqueDescendant.getMappingName().equals(otherDescendant.getMappingName())) {
2943+
matched = true;
2944+
break;
2945+
}
2946+
}
2947+
2948+
if (matched == false) {
29402949
uniqueDescendants.add(otherDescendant);
29412950
}
29422951
}
@@ -2954,6 +2963,7 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch
29542963
Collections.sort(uniqueDescendants);
29552964
}
29562965
discriminator.getMappedModels().addAll(uniqueDescendants);
2966+
29572967
return discriminator;
29582968
}
29592969

modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
[DataContract(Name = "{{{name}}}")]
55
{{#discriminator}}
66
[JsonConverter(typeof(JsonSubtypes), "{{{discriminatorName}}}")]
7-
{{#children}}
8-
[JsonSubtypes.KnownSubType(typeof({{classname}}), "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}")]
9-
{{/children}}
107
{{#mappedModels}}
11-
[JsonSubtypes.KnownSubType(typeof({{{modelName}}}), "{{{mappingName}}}")]
8+
[JsonSubtypes.KnownSubType(typeof({{{modelName}}}), "{{^vendorExtensions.x-discriminator-value}}{{{mappingName}}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{.}}}{{/vendorExtensions.x-discriminator-value}}")]
129
{{/mappedModels}}
1310
{{/discriminator}}
1411
{{>visibility}} partial class {{classname}} : {{#parent}}{{{parent}}}, {{/parent}}IEquatable<{{classname}}>{{#validatable}}, IValidatableObject{{/validatable}}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
922922
public void testComposedSchemaAllOfDiscriminatorMapLegacy() {
923923
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/allOf_composition_discriminator.yaml");
924924
DefaultCodegen codegen = new DefaultCodegen();
925-
// codegen.discriminatorExplicitMappingVerbose remains false in the legacy use case
925+
// codegen.legacyDiscriminatorBehavior remains false in the legacy use case
926926
codegen.setOpenAPI(openAPI);
927927
Schema sc;
928928
String modelName;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public void generateJsonAnnotationForPolymorphism() throws IOException {
4949

5050
String jsonTypeInfo = "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = \"className\", visible = true)";
5151
String jsonSubType = "@JsonSubTypes({\n" +
52-
" @JsonSubTypes.Type(value = Dog.class, name = \"Dog\"),\n" +
53-
" @JsonSubTypes.Type(value = Cat.class, name = \"Cat\"),\n" +
5452
" @JsonSubTypes.Type(value = BigDog.class, name = \"BigDog\"),\n" +
53+
" @JsonSubTypes.Type(value = Cat.class, name = \"Cat\"),\n" +
54+
" @JsonSubTypes.Type(value = Dog.class, name = \"Dog\"),\n" +
5555
"})";
5656
assertFileContains(Paths.get(outputPath + "/src/gen/java/org/openapitools/model/Animal.java"), jsonTypeInfo, jsonSubType);
5757
}
@@ -80,8 +80,8 @@ public void doNotGenerateJsonAnnotationForPolymorphismIfJsonExclude() throws IOE
8080

8181
String jsonTypeInfo = "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = \"className\", visible = true)";
8282
String jsonSubType = "@JsonSubTypes({\n" +
83-
" @JsonSubTypes.Type(value = Dog.class, name = \"Dog\"),\n" +
8483
" @JsonSubTypes.Type(value = Cat.class, name = \"Cat\"),\n" +
84+
" @JsonSubTypes.Type(value = Dog.class, name = \"Dog\"),\n" +
8585
"})";
8686
assertFileNotContains(Paths.get(outputPath + "/src/gen/java/org/openapitools/model/Animal.java"), jsonTypeInfo, jsonSubType);
8787
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ public void allOfTest() {
384384
public void allOfTestLegacy() {
385385
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/allOf.yaml");
386386
final RubyClientCodegen codegen = new RubyClientCodegen();
387-
// codegen.discriminatorExplicitMappingVerbose == false by default
387+
// codegen.setLegacyDiscriminatorBehavior(false) by default
388388
codegen.setModuleName("OnlinePetstore");
389389

390390
final Schema schema = openAPI.getComponents().getSchemas().get("Person");

samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/Animal.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ namespace Org.OpenAPITools.Model
3232
/// </summary>
3333
[DataContract(Name = "Animal")]
3434
[JsonConverter(typeof(JsonSubtypes), "ClassName")]
35-
[JsonSubtypes.KnownSubType(typeof(Dog), "Dog")]
36-
[JsonSubtypes.KnownSubType(typeof(Cat), "Cat")]
3735
[JsonSubtypes.KnownSubType(typeof(Cat), "Cat")]
3836
[JsonSubtypes.KnownSubType(typeof(Dog), "Dog")]
3937
public partial class Animal : IEquatable<Animal>, IValidatableObject

samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/GrandparentAnimal.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ namespace Org.OpenAPITools.Model
3232
/// </summary>
3333
[DataContract(Name = "GrandparentAnimal")]
3434
[JsonConverter(typeof(JsonSubtypes), "PetType")]
35-
[JsonSubtypes.KnownSubType(typeof(ParentPet), "ParentPet")]
36-
[JsonSubtypes.KnownSubType(typeof(ChildCat), "ChildCat")]
3735
[JsonSubtypes.KnownSubType(typeof(ChildCat), "ChildCat")]
3836
[JsonSubtypes.KnownSubType(typeof(ParentPet), "ParentPet")]
3937
public partial class GrandparentAnimal : IEquatable<GrandparentAnimal>, IValidatableObject

samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/ParentPet.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ namespace Org.OpenAPITools.Model
3333
[DataContract(Name = "ParentPet")]
3434
[JsonConverter(typeof(JsonSubtypes), "PetType")]
3535
[JsonSubtypes.KnownSubType(typeof(ChildCat), "ChildCat")]
36-
[JsonSubtypes.KnownSubType(typeof(ChildCat), "ChildCat")]
3736
public partial class ParentPet : GrandparentAnimal, IEquatable<ParentPet>, IValidatableObject
3837
{
3938
/// <summary>

samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Animal.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ namespace Org.OpenAPITools.Model
3232
/// </summary>
3333
[DataContract(Name = "Animal")]
3434
[JsonConverter(typeof(JsonSubtypes), "ClassName")]
35-
[JsonSubtypes.KnownSubType(typeof(Dog), "Dog")]
36-
[JsonSubtypes.KnownSubType(typeof(Cat), "Cat")]
3735
[JsonSubtypes.KnownSubType(typeof(Cat), "Cat")]
3836
[JsonSubtypes.KnownSubType(typeof(Dog), "Dog")]
3937
public partial class Animal : IEquatable<Animal>, IValidatableObject

0 commit comments

Comments
 (0)