From 4e6166ed780e16478a525fb2bf153a8abf4efa15 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Thu, 8 Oct 2026 13:46:02 +0530 Subject: [PATCH 1/6] Keep explicit inlineSchemaNameMappings when several inline schemas map to one name --- .../org/openapitools/codegen/InlineModelResolver.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index 94ad2cc38842..d4b5ba2db0fd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -1182,13 +1182,12 @@ private void copyVendorExtensions(Schema source, Schema target) { private String addSchemas(String name, Schema schema) { //check inlineSchemaNameMapping if (inlineSchemaNameMapping.containsKey(name)) { + // use the name chosen by the user as is, even if several inline schemas map to it name = inlineSchemaNameMapping.get(name); - } - - // Recursive flattening can add a nested schema after its parent's name - // was chosen. Re-check here so the parent cannot overwrite that child. - if (openAPI.getComponents().getSchemas().containsKey(name) + } else if (openAPI.getComponents().getSchemas().containsKey(name) || uniqueNames.contains(name)) { + // Recursive flattening can add a nested schema after its parent's name + // was chosen. Re-check here so the parent cannot overwrite that child. name = uniqueName(name); } From 8dc1f514174a8dfaae6116f827ee6539aaeb6975 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Thu, 8 Oct 2026 13:46:51 +0530 Subject: [PATCH 2/6] Add spec for many-to-one inlineSchemaNameMappings test --- ...nline_schema_name_mapping_many_to_one.yaml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/inline_schema_name_mapping_many_to_one.yaml diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_schema_name_mapping_many_to_one.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_schema_name_mapping_many_to_one.yaml new file mode 100644 index 000000000000..4b9dbb2586e3 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/inline_schema_name_mapping_many_to_one.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.3 +info: + title: inlineSchemaNameMappings many-to-one + version: "1" +paths: + /preview: + get: + responses: + "200": + description: ok + content: + application/json: + schema: + $ref: "#/components/schemas/Preview" +components: + schemas: + Preview: + type: object + properties: + balance: + type: object + description: The balance at the end of the range. + properties: + amount: + type: string + currency: + type: string + interest: + type: object + description: The interest accrued over the range. + properties: + amount: + type: string + currency: + type: string From 459dda683e6204209e3cbd44588d54f78b8e9e02 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Thu, 8 Oct 2026 13:47:45 +0530 Subject: [PATCH 3/6] Add test for many-to-one inlineSchemaNameMappings --- .../codegen/InlineModelResolverTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index b6b81d765a03..85391bf06c1c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -1258,6 +1258,26 @@ public void testInlineSchemaNameMapping() { assertTrue(nothingNew.getProperties().get("arbitrary_request_body_array_property") instanceof ObjectSchema); } + @Test + public void testInlineSchemaNameMappingManyToOne() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_schema_name_mapping_many_to_one.yaml"); + InlineModelResolver resolver = new InlineModelResolver(); + Map inlineSchemaNames = new HashMap<>(); + inlineSchemaNames.put("Preview_balance", "Money"); + inlineSchemaNames.put("Preview_interest", "Money"); + resolver.setInlineSchemaNameMapping(inlineSchemaNames); + resolver.flatten(openAPI); + + Map schemas = openAPI.getComponents().getSchemas(); + assertTrue(schemas.containsKey("Money")); + assertFalse(schemas.containsKey("Money1")); + assertFalse(schemas.containsKey("Money_1")); + + Schema preview = schemas.get("Preview"); + assertEquals("#/components/schemas/Money", ((Schema) preview.getProperties().get("balance")).get$ref()); + assertEquals("#/components/schemas/Money", ((Schema) preview.getProperties().get("interest")).get$ref()); + } + @Test public void testInlineSchemaOptions() { OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_model_resolver.yaml"); From 9867efdc061a6c83b953320af5591933c72c66d6 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:29:12 +0530 Subject: [PATCH 4/6] Warn when an inlineSchemaNameMapping replaces a schema defined in the spec Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01H6L1WtRqooHYJHsCTaZE2n --- .../java/org/openapitools/codegen/InlineModelResolver.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index d4b5ba2db0fd..7ed035c351df 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -81,6 +81,8 @@ public class InlineModelResolver { // a set to keep track of names generated for inline schemas private Set uniqueNames = new HashSet<>(); + // names that were added through inlineSchemaNameMapping + private Set mappedSchemaNames = new HashSet<>(); // MixIn that suppresses volatile fields when any Schema instance is serialised for structural // comparison. Registered on Schema.class so it applies recursively to all nested Schema @@ -1184,6 +1186,10 @@ private String addSchemas(String name, Schema schema) { if (inlineSchemaNameMapping.containsKey(name)) { // use the name chosen by the user as is, even if several inline schemas map to it name = inlineSchemaNameMapping.get(name); + if (openAPI.getComponents().getSchemas().containsKey(name) && !mappedSchemaNames.contains(name)) { + LOGGER.warn("inlineSchemaNameMapping maps an inline schema to `{}`, which is already defined in the spec. The existing `{}` schema is replaced by the inline schema.", name, name); + } + mappedSchemaNames.add(name); } else if (openAPI.getComponents().getSchemas().containsKey(name) || uniqueNames.contains(name)) { // Recursive flattening can add a nested schema after its parent's name From ba26463b17a2159263951cdd9c1813ac114093ab Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:31:02 +0530 Subject: [PATCH 5/6] Drop the Money1 assertion that can never fail uniqueName() appends "_N", so Money_1 is the name that guards the regression. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01H6L1WtRqooHYJHsCTaZE2n --- .../java/org/openapitools/codegen/InlineModelResolverTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index 85391bf06c1c..bd696d01e721 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -1270,7 +1270,6 @@ public void testInlineSchemaNameMappingManyToOne() { Map schemas = openAPI.getComponents().getSchemas(); assertTrue(schemas.containsKey("Money")); - assertFalse(schemas.containsKey("Money1")); assertFalse(schemas.containsKey("Money_1")); Schema preview = schemas.get("Preview"); From a3bcbe1d1393670e1da72145e671cb1c42c72dfd Mon Sep 17 00:00:00 2001 From: Mohit Kumar <91405114+mohitduhan19@users.noreply.github.com> Date: Sun, 11 Oct 2026 17:53:51 +0530 Subject: [PATCH 6/6] Only warn for mapped names that were defined in the spec Names already in uniqueNames were generated during flattening, so a mapping onto one of them is not replacing a spec-defined schema. Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- .../java/org/openapitools/codegen/InlineModelResolver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index 7ed035c351df..2887daa8ef29 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -1186,7 +1186,8 @@ private String addSchemas(String name, Schema schema) { if (inlineSchemaNameMapping.containsKey(name)) { // use the name chosen by the user as is, even if several inline schemas map to it name = inlineSchemaNameMapping.get(name); - if (openAPI.getComponents().getSchemas().containsKey(name) && !mappedSchemaNames.contains(name)) { + if (openAPI.getComponents().getSchemas().containsKey(name) + && !uniqueNames.contains(name) && !mappedSchemaNames.contains(name)) { LOGGER.warn("inlineSchemaNameMapping maps an inline schema to `{}`, which is already defined in the spec. The existing `{}` schema is replaced by the inline schema.", name, name); } mappedSchemaNames.add(name);