From 46d3273c912de4d2f3d732513b8e892e94e96107 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Wed, 3 Mar 2021 13:43:52 +0100 Subject: [PATCH 1/3] allDefinitions contains the schema names not the model names, if they are different no match will happen --- .../codegen/languages/CSharpClientCodegen.java | 9 ++++++--- .../codegen/languages/CSharpNetCoreClientCodegen.java | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index bae1eb7250d5..75aa705003b2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -591,9 +591,11 @@ public CodegenModel fromModel(String name, Schema model) { Map allDefinitions = ModelUtils.getSchemas(this.openAPI); CodegenModel codegenModel = super.fromModel(name, model); if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { - final Schema parentModel = allDefinitions.get(toModelName(codegenModel.parent)); - if (parentModel != null) { - final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + Schema currentParentModel = allDefinitions.get(codegenModel.parentSchema); + while (currentParentModel != null) { + final CodegenModel currentParentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); + if (codegenModel.hasEnums) { codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); } @@ -620,6 +622,7 @@ public CodegenModel fromModel(String name, Schema model) { codegenModel.parentVars.add(parentVar); } } + currentParentModel = allDefinitions.get(currentParentCodegenModel.parentSchema); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java index 8aa4cc08ffbc..bc20a4003552 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java @@ -327,9 +327,12 @@ public CodegenModel fromModel(String name, Schema model) { Map allDefinitions = ModelUtils.getSchemas(this.openAPI); CodegenModel codegenModel = super.fromModel(name, model); if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { - final Schema parentModel = allDefinitions.get(toModelName(codegenModel.parent)); - if (parentModel != null) { - final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + Schema currentParentModel = allDefinitions.get(codegenModel.parentSchema); + while (currentParentModel != null) { + final CodegenModel currentParentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); + + if (codegenModel.hasEnums) { codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); } @@ -356,6 +359,8 @@ public CodegenModel fromModel(String name, Schema model) { codegenModel.parentVars.add(parentVar); } } + + currentParentModel = allDefinitions.get(currentParentCodegenModel.parentSchema); } } From 225436a0d4390030d9b77b1386d4c772c3661597 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Wed, 3 Mar 2021 16:27:00 +0100 Subject: [PATCH 2/3] Fix adding properties in case of a composed schema --- .../main/java/org/openapitools/codegen/DefaultCodegen.java | 5 +++++ 1 file changed, 5 insertions(+) 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 c5641cde3d68..a608ccc8423f 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 @@ -3004,6 +3004,11 @@ protected void addProperties(Map properties, List requir required.addAll(schema.getRequired()); } + // Composed Schemas may have properties defined on themselves as well in case of nested inheritance this is rather important + if (schema.getProperties() != null) { + properties.putAll(schema.getProperties()); + } + if (composedSchema.getOneOf() != null) { for (Schema component : composedSchema.getOneOf()) { addProperties(properties, required, component); From bcc6295cf251ecd5ffc09f69046d4db399666533 Mon Sep 17 00:00:00 2001 From: Felix Winterhalter Date: Fri, 12 Mar 2021 07:44:06 +0100 Subject: [PATCH 3/3] Add comments and get rid of one superfluous variable --- .../codegen/languages/CSharpClientCodegen.java | 8 ++++++-- .../codegen/languages/CSharpNetCoreClientCodegen.java | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index 75aa705003b2..e5cc1922a78f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -592,8 +592,8 @@ public CodegenModel fromModel(String name, Schema model) { CodegenModel codegenModel = super.fromModel(name, model); if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { Schema currentParentModel = allDefinitions.get(codegenModel.parentSchema); + // We need to iterate through the whole inheritance structure and check whether we need to inherit properties while (currentParentModel != null) { - final CodegenModel currentParentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); if (codegenModel.hasEnums) { @@ -612,6 +612,8 @@ public CodegenModel fromModel(String name, Schema model) { } CodegenProperty last = null; + + // Add properties of parent to child if child does not contain the same property (which overrides) for (final CodegenProperty property : parentCodegenModel.vars) { // helper list of parentVars simplifies templating if (!propertyHash.containsKey(property.name)) { @@ -622,7 +624,9 @@ public CodegenModel fromModel(String name, Schema model) { codegenModel.parentVars.add(parentVar); } } - currentParentModel = allDefinitions.get(currentParentCodegenModel.parentSchema); + + // Find parent of current parent if it exists. In inheritance its important to take the whole tree into account + currentParentModel = allDefinitions.get(parentCodegenModel.parentSchema); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java index bc20a4003552..5034e36dc003 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java @@ -328,8 +328,8 @@ public CodegenModel fromModel(String name, Schema model) { CodegenModel codegenModel = super.fromModel(name, model); if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { Schema currentParentModel = allDefinitions.get(codegenModel.parentSchema); + // We need to iterate through the whole inheritance structure and check whether we need to inherit properties while (currentParentModel != null) { - final CodegenModel currentParentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, currentParentModel); @@ -360,7 +360,8 @@ public CodegenModel fromModel(String name, Schema model) { } } - currentParentModel = allDefinitions.get(currentParentCodegenModel.parentSchema); + // Find parent of current parent if it exists. In inheritance its important to take the whole tree into account + currentParentModel = allDefinitions.get(parentCodegenModel.parentSchema); } }