From 9fbf404e4b6843287f7bef3f186b3d1d3d42d107 Mon Sep 17 00:00:00 2001 From: "Nagabalaji Siddaiah Buddala -X (nsiddaia - XORIANT SOLUTIONS PRIVATE LIMITED at Cisco)" Date: Fri, 22 May 2026 20:33:05 +0530 Subject: [PATCH 1/5] Introducing Annotated Enum with const --- .../openapitools/codegen/OpenAPINormalizer.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index 68750b1bdefc..db342360407e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -1620,10 +1620,15 @@ protected Schema simplifyComposedSchemaWithEnums(Schema schema, List sub Schema subSchema = ModelUtils.getReferencedSchema(openAPI, (Schema) item); - // Check if this sub-schema has an enum (with one or more values) - if (subSchema.getEnum() == null || subSchema.getEnum().isEmpty()) { + // Check if this sub-schema has an enum or const value (OpenAPI 3.1 uses const for single-value enums) + List subSchemaEnumValues = subSchema.getEnum(); + if ((subSchemaEnumValues == null || subSchemaEnumValues.isEmpty()) && subSchema.getConst() == null) { return schema; } + // If const is present but enum is not, treat const as a single enum value + if ((subSchemaEnumValues == null || subSchemaEnumValues.isEmpty()) && subSchema.getConst() != null) { + subSchemaEnumValues = Arrays.asList(subSchema.getConst()); + } // Ensure all sub-schemas have the same type (if type is specified) if(subSchema.getTypes() != null && subSchema.getTypes().size() > 1) { @@ -1639,7 +1644,7 @@ protected Schema simplifyComposedSchemaWithEnums(Schema schema, List sub } } // Add all enum values from this sub-schema to our collection - if(subSchema.getEnum().size() == 1) { + if(subSchemaEnumValues.size() == 1) { String description = subSchema.getTitle() == null ? "" : subSchema.getTitle(); if(subSchema.getDescription() != null) { if(!description.isEmpty()) { @@ -1647,9 +1652,9 @@ protected Schema simplifyComposedSchemaWithEnums(Schema schema, List sub } description += subSchema.getDescription(); } - enumValues.put(subSchema.getEnum().get(0), description); + enumValues.put(subSchemaEnumValues.get(0), description); } else { - for(Object e: subSchema.getEnum()) { + for(Object e: subSchemaEnumValues) { enumValues.put(e, ""); } } From 51e0b0f43bc7e7e0f9e0a0db6f32436ae22f9582 Mon Sep 17 00:00:00 2001 From: "Nagabalaji Siddaiah Buddala -X (nsiddaia - XORIANT SOLUTIONS PRIVATE LIMITED at Cisco)" Date: Mon, 25 May 2026 18:26:20 +0530 Subject: [PATCH 2/5] fix: support OpenAPI 3.1 const in annotated enum normalization --- docs/generators/fsharp-functions.md | 2 +- docs/generators/fsharp-giraffe-server.md | 2 +- docs/generators/java-inflector.md | 2 +- docs/generators/jaxrs-cxf-client.md | 2 +- docs/generators/swift5.md | 4 ++-- docs/generators/swift6.md | 4 ++-- .../org/openapitools/codegen/OpenAPINormalizerTest.java | 7 ++++--- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/generators/fsharp-functions.md b/docs/generators/fsharp-functions.md index 4e589d22802e..47b436d72c55 100644 --- a/docs/generators/fsharp-functions.md +++ b/docs/generators/fsharp-functions.md @@ -34,7 +34,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |OpenAPI/src| +|sourceFolder|source folder for generated code| |OpenAPI\src| ## IMPORT MAPPING diff --git a/docs/generators/fsharp-giraffe-server.md b/docs/generators/fsharp-giraffe-server.md index abe079e504fa..fb3e25b3d776 100644 --- a/docs/generators/fsharp-giraffe-server.md +++ b/docs/generators/fsharp-giraffe-server.md @@ -30,7 +30,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |packageVersion|F# package version.| |1.0.0| |returnICollection|Return ICollection<T> instead of the concrete type.| |false| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |OpenAPI/src| +|sourceFolder|source folder for generated code| |OpenAPI\src| |useCollection|Deserialize array types to Collection<T> instead of List<T>.| |false| |useDateTimeOffset|Use DateTimeOffset to model date-time properties| |false| |useSwashbuckle|Uses the Swashbuckle.AspNetCore NuGet package for documentation.| |false| diff --git a/docs/generators/java-inflector.md b/docs/generators/java-inflector.md index 3cc8851281ed..5600370c4cd1 100644 --- a/docs/generators/java-inflector.md +++ b/docs/generators/java-inflector.md @@ -68,7 +68,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |snapshotVersion|Uses a SNAPSHOT version.|
**true**
Use a SnapShot Version
**false**
Use a Release Version
|null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |src/gen/java| +|sourceFolder|source folder for generated code| |src\gen\java| |testOutput|Set output folder for models and APIs tests| |${project.build.directory}/generated-test-sources/openapi| |useJakartaEe|whether to use Jakarta EE namespace instead of javax| |false| |useOneOfInterfaces|whether to use a java interface to describe a set of oneOf options, where each option is a class that implements the interface| |false| diff --git a/docs/generators/jaxrs-cxf-client.md b/docs/generators/jaxrs-cxf-client.md index a3835496fda8..8acac7c99397 100644 --- a/docs/generators/jaxrs-cxf-client.md +++ b/docs/generators/jaxrs-cxf-client.md @@ -70,7 +70,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |snapshotVersion|Uses a SNAPSHOT version.|
**true**
Use a SnapShot Version
**false**
Use a Release Version
|null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |src/gen/java| +|sourceFolder|source folder for generated code| |src\gen\java| |testOutput|Set output folder for models and APIs tests| |${project.build.directory}/generated-test-sources/openapi| |useAbstractionForFiles|Use alternative types instead of java.io.File to allow passing bytes without a file on disk.| |false| |useBeanValidation|Use BeanValidation API annotations| |false| diff --git a/docs/generators/swift5.md b/docs/generators/swift5.md index 7c3052b6e4c9..88f6d0c4c6aa 100644 --- a/docs/generators/swift5.md +++ b/docs/generators/swift5.md @@ -52,13 +52,13 @@ These options may be applied as additional-properties (cli) or configOptions (pl |responseAs|Optionally use libraries to manage response. Currently PromiseKit, RxSwift, Result, Combine, AsyncAwait are available.| |null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|swiftPackagePath|Set a custom source path instead of OpenAPIClient/Classes/OpenAPIs.| |null| +|swiftPackagePath|Set a custom source path instead of OpenAPIClient\Classes\OpenAPIs.| |null| |swiftUseApiNamespace|Flag to make all the API classes inner-class of {{projectName}}API| |null| |useBacktickEscapes|Escape reserved words using backticks (default: false)| |false| |useClasses|Use final classes for models instead of structs (default: false)| |false| |useCustomDateWithoutTime|Uses a custom type to decode and encode dates without time information to support OpenAPIs date format (default: false)| |false| |useJsonEncodable|Make models conform to JSONEncodable protocol (default: true)| |true| -|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: false).| |null| +|useSPMFileStructure|Use SPM file structure and set the source path to Sources\{{projectName}} (default: false).| |null| |validatable|Make validation rules and validator for model properties (default: true)| |true| ## IMPORT MAPPING diff --git a/docs/generators/swift6.md b/docs/generators/swift6.md index c3d56f6e78d8..b638a37baadf 100644 --- a/docs/generators/swift6.md +++ b/docs/generators/swift6.md @@ -54,13 +54,13 @@ These options may be applied as additional-properties (cli) or configOptions (pl |responseAs|Optionally use libraries to manage response. Currently AsyncAwait, Combine, Result, RxSwift, ObjcBlock, PromiseKit are available.| |null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|swiftPackagePath|Set a custom source path instead of Sources/{{projectName}}.| |null| +|swiftPackagePath|Set a custom source path instead of Sources\{{projectName}}.| |null| |swiftUseApiNamespace|Flag to make all the API classes inner-class of {{projectName}}API| |null| |useBacktickEscapes|Escape reserved words using backticks (default: false)| |false| |useClasses|Use final classes for models instead of structs (default: false)| |false| |useCustomDateWithoutTime|Uses a custom type to decode and encode dates without time information to support OpenAPIs date format (default: false)| |false| |useParameterConvertible|Make models conform to ParameterConvertible protocol (default: true)| |true| -|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: true).| |null| +|useSPMFileStructure|Use SPM file structure and set the source path to Sources\{{projectName}} (default: true).| |null| |validatable|Make validation rules and validator for model properties (default: true)| |true| ## IMPORT MAPPING diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java index 87e96066c0bc..505fd82ccf77 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java @@ -1536,9 +1536,10 @@ public void testOpenAPINormalizerSimplifyOneOfAnyOf31Spec() { assertEquals(schema14.getType(), null); Schema schema16 = openAPI.getComponents().getSchemas().get("TypeIntegerWithOneOf"); - assertEquals(schema16.getOneOf().size(),3); - assertEquals(((Schema) schema16.getOneOf().get(0)).getConst(), 1); - assertEquals(((Schema) schema16.getOneOf().get(0)).getDeprecated(), true); + // After normalization, oneOf with const values should be simplified to enum + assertEquals(schema16.getOneOf(), null); + assertEquals(schema16.getEnum().size(), 3); + assertEquals(schema16.getEnum().get(0), 1); Schema schema18 = openAPI.getComponents().getSchemas().get("OneOfNullAndRef3"); // original oneOf removed and simplified to just $ref (oneOf sub-schema) instead From ba6d6a266344a1782f0e6fd0e4e6009671ef7dfd Mon Sep 17 00:00:00 2001 From: "Nagabalaji Siddaiah Buddala -X (nsiddaia - XORIANT SOLUTIONS PRIVATE LIMITED at Cisco)" Date: Mon, 25 May 2026 19:11:08 +0530 Subject: [PATCH 3/5] fix(docs): use forward slashes in path separators for cross-platform portability --- docs/generators/java-inflector.md | 2 +- docs/generators/swift6.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/generators/java-inflector.md b/docs/generators/java-inflector.md index 5600370c4cd1..3cc8851281ed 100644 --- a/docs/generators/java-inflector.md +++ b/docs/generators/java-inflector.md @@ -68,7 +68,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |snapshotVersion|Uses a SNAPSHOT version.|
**true**
Use a SnapShot Version
**false**
Use a Release Version
|null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |src\gen\java| +|sourceFolder|source folder for generated code| |src/gen/java| |testOutput|Set output folder for models and APIs tests| |${project.build.directory}/generated-test-sources/openapi| |useJakartaEe|whether to use Jakarta EE namespace instead of javax| |false| |useOneOfInterfaces|whether to use a java interface to describe a set of oneOf options, where each option is a class that implements the interface| |false| diff --git a/docs/generators/swift6.md b/docs/generators/swift6.md index b638a37baadf..c3d56f6e78d8 100644 --- a/docs/generators/swift6.md +++ b/docs/generators/swift6.md @@ -54,13 +54,13 @@ These options may be applied as additional-properties (cli) or configOptions (pl |responseAs|Optionally use libraries to manage response. Currently AsyncAwait, Combine, Result, RxSwift, ObjcBlock, PromiseKit are available.| |null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|swiftPackagePath|Set a custom source path instead of Sources\{{projectName}}.| |null| +|swiftPackagePath|Set a custom source path instead of Sources/{{projectName}}.| |null| |swiftUseApiNamespace|Flag to make all the API classes inner-class of {{projectName}}API| |null| |useBacktickEscapes|Escape reserved words using backticks (default: false)| |false| |useClasses|Use final classes for models instead of structs (default: false)| |false| |useCustomDateWithoutTime|Uses a custom type to decode and encode dates without time information to support OpenAPIs date format (default: false)| |false| |useParameterConvertible|Make models conform to ParameterConvertible protocol (default: true)| |true| -|useSPMFileStructure|Use SPM file structure and set the source path to Sources\{{projectName}} (default: true).| |null| +|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: true).| |null| |validatable|Make validation rules and validator for model properties (default: true)| |true| ## IMPORT MAPPING From 553b7217fcd352d1bb5892958ec2330540ae7efb Mon Sep 17 00:00:00 2001 From: "Nagabalaji Siddaiah Buddala -X (nsiddaia - XORIANT SOLUTIONS PRIVATE LIMITED at Cisco)" Date: Tue, 26 May 2026 08:19:14 +0530 Subject: [PATCH 4/5] revert: remove unrelated doc file changes from PR scope --- docs/generators/fsharp-functions.md | 2 +- docs/generators/fsharp-giraffe-server.md | 2 +- docs/generators/jaxrs-cxf-client.md | 2 +- docs/generators/swift5.md | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/generators/fsharp-functions.md b/docs/generators/fsharp-functions.md index 47b436d72c55..4e589d22802e 100644 --- a/docs/generators/fsharp-functions.md +++ b/docs/generators/fsharp-functions.md @@ -34,7 +34,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |OpenAPI\src| +|sourceFolder|source folder for generated code| |OpenAPI/src| ## IMPORT MAPPING diff --git a/docs/generators/fsharp-giraffe-server.md b/docs/generators/fsharp-giraffe-server.md index fb3e25b3d776..abe079e504fa 100644 --- a/docs/generators/fsharp-giraffe-server.md +++ b/docs/generators/fsharp-giraffe-server.md @@ -30,7 +30,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |packageVersion|F# package version.| |1.0.0| |returnICollection|Return ICollection<T> instead of the concrete type.| |false| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |OpenAPI\src| +|sourceFolder|source folder for generated code| |OpenAPI/src| |useCollection|Deserialize array types to Collection<T> instead of List<T>.| |false| |useDateTimeOffset|Use DateTimeOffset to model date-time properties| |false| |useSwashbuckle|Uses the Swashbuckle.AspNetCore NuGet package for documentation.| |false| diff --git a/docs/generators/jaxrs-cxf-client.md b/docs/generators/jaxrs-cxf-client.md index 8acac7c99397..a3835496fda8 100644 --- a/docs/generators/jaxrs-cxf-client.md +++ b/docs/generators/jaxrs-cxf-client.md @@ -70,7 +70,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |snapshotVersion|Uses a SNAPSHOT version.|
**true**
Use a SnapShot Version
**false**
Use a Release Version
|null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|sourceFolder|source folder for generated code| |src\gen\java| +|sourceFolder|source folder for generated code| |src/gen/java| |testOutput|Set output folder for models and APIs tests| |${project.build.directory}/generated-test-sources/openapi| |useAbstractionForFiles|Use alternative types instead of java.io.File to allow passing bytes without a file on disk.| |false| |useBeanValidation|Use BeanValidation API annotations| |false| diff --git a/docs/generators/swift5.md b/docs/generators/swift5.md index 88f6d0c4c6aa..7c3052b6e4c9 100644 --- a/docs/generators/swift5.md +++ b/docs/generators/swift5.md @@ -52,13 +52,13 @@ These options may be applied as additional-properties (cli) or configOptions (pl |responseAs|Optionally use libraries to manage response. Currently PromiseKit, RxSwift, Result, Combine, AsyncAwait are available.| |null| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| |sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| -|swiftPackagePath|Set a custom source path instead of OpenAPIClient\Classes\OpenAPIs.| |null| +|swiftPackagePath|Set a custom source path instead of OpenAPIClient/Classes/OpenAPIs.| |null| |swiftUseApiNamespace|Flag to make all the API classes inner-class of {{projectName}}API| |null| |useBacktickEscapes|Escape reserved words using backticks (default: false)| |false| |useClasses|Use final classes for models instead of structs (default: false)| |false| |useCustomDateWithoutTime|Uses a custom type to decode and encode dates without time information to support OpenAPIs date format (default: false)| |false| |useJsonEncodable|Make models conform to JSONEncodable protocol (default: true)| |true| -|useSPMFileStructure|Use SPM file structure and set the source path to Sources\{{projectName}} (default: false).| |null| +|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: false).| |null| |validatable|Make validation rules and validator for model properties (default: true)| |true| ## IMPORT MAPPING From 3496c3b7cffbc0cdc728cc77bd64708b8ba6ae9a Mon Sep 17 00:00:00 2001 From: "Nagabalaji Siddaiah Buddala -X (nsiddaia - XORIANT SOLUTIONS PRIVATE LIMITED at Cisco)" Date: Tue, 26 May 2026 08:19:54 +0530 Subject: [PATCH 5/5] refactor(normalizer): extract definesEnum variable per reviewer suggestion --- .../org/openapitools/codegen/OpenAPINormalizer.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index db342360407e..478224a92976 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -1620,15 +1620,15 @@ protected Schema simplifyComposedSchemaWithEnums(Schema schema, List sub Schema subSchema = ModelUtils.getReferencedSchema(openAPI, (Schema) item); - // Check if this sub-schema has an enum or const value (OpenAPI 3.1 uses const for single-value enums) - List subSchemaEnumValues = subSchema.getEnum(); - if ((subSchemaEnumValues == null || subSchemaEnumValues.isEmpty()) && subSchema.getConst() == null) { + // Check if this sub-schema has an enum or const value (OAS 3.1 uses const for single-value enums) + boolean definesEnum = ModelUtils.hasEnum(subSchema); + if (!definesEnum && subSchema.getConst() == null) { return schema; } // If const is present but enum is not, treat const as a single enum value - if ((subSchemaEnumValues == null || subSchemaEnumValues.isEmpty()) && subSchema.getConst() != null) { - subSchemaEnumValues = Arrays.asList(subSchema.getConst()); - } + List subSchemaEnumValues = definesEnum + ? subSchema.getEnum() + : Arrays.asList(subSchema.getConst()); // Ensure all sub-schemas have the same type (if type is specified) if(subSchema.getTypes() != null && subSchema.getTypes().size() > 1) {