getAdditionalProperties( @Nonnull final Gener
}
result.put(k, v);
});
+
+ // Always disable supportUrlQuery as it's not compatible with interface generation
+ result.put(SUPPORT_URL_QUERY, "false");
+
return result;
}
}
diff --git a/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/api.mustache b/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/api.mustache
index e6a5a6b92..1d05d9202 100644
--- a/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/api.mustache
+++ b/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/api.mustache
@@ -99,88 +99,88 @@ public class {{classname}} extends BaseApi {
{{/aiSdkConstructor}}
{{#operation}}
- {{#hasOptionalParams}}
- /**
- * {{summary}}
- *
{{notes}}
- {{#responses}}
- *
{{code}}{{#message}} - {{message}}{{/message}}
- {{/responses}}
- {{#allParams}}
- * @param {{paramName}} {{#required}} (required){{/required}}{{^required}} (optional{{^isContainer}}{{#defaultValue}}, default to {{.}}{{/defaultValue}}{{/isContainer}}){{/required}}
- {{#description}}
- * {{description}}
- {{/description}}
- {{^description}}
- * The value for the parameter {{paramName}}
- {{/description}}
- {{/allParams}}
- {{#returnType}}
- * @return {{returnType}}
- {{/returnType}}
- {{^returnType}}
- * @return An OpenApiResponse containing the status code of the HttpResponse.
- {{/returnType}}
- * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
- {{#externalDocs}}
- * {{description}}
- * @see {{summary}} Documentation
- {{/externalDocs}}
- {{#isDeprecated}}
- * @deprecated
- {{/isDeprecated}}
- */
- {{#isDeprecated}}
- @Deprecated
- {{/isDeprecated}}
- {{#vendorExtensions.x-return-nullable}}@Nullable{{/vendorExtensions.x-return-nullable}}{{^vendorExtensions.x-return-nullable}}@Nonnull{{/vendorExtensions.x-return-nullable}}
- public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}OpenApiResponse {{/returnType}}{{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#allParams}}{{>nullable_var_annotations}} final {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws OpenApiRequestException {
- {{>operationBody}}
- }
- {{/hasOptionalParams}}
-
- /**
- *
{{summary}}
- *
{{notes}}
- {{#responses}}
- *
{{code}}{{#message}} - {{message}}{{/message}}
- {{/responses}}
- {{#requiredParams}}
- * @param {{paramName}}
- {{#description}}
- * {{description}}
- {{/description}}
- {{^description}}
- * The value for the parameter {{paramName}}
- {{/description}}
- {{/requiredParams}}
- {{#returnType}}
- * @return {{returnType}}
- {{/returnType}}
- {{^returnType}}
- * @return An OpenApiResponse containing the status code of the HttpResponse.
- {{/returnType}}
- * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
- {{#externalDocs}}
- * {{description}}
- * @see {{summary}} Documentation
- {{/externalDocs}}
- {{#isDeprecated}}
- * @deprecated
- {{/isDeprecated}}
- */
- {{#isDeprecated}}
- @Deprecated
- {{/isDeprecated}}
- {{#vendorExtensions.x-return-nullable}}@Nullable{{/vendorExtensions.x-return-nullable}}{{^vendorExtensions.x-return-nullable}}@Nonnull{{/vendorExtensions.x-return-nullable}}
- public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}OpenApiResponse {{/returnType}}{{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#requiredParams}}{{>nullable_var_annotations}} final {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/requiredParams}}) throws OpenApiRequestException {
- {{#hasOptionalParams}}
- {{#returnType}}return {{/returnType}}{{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#hasRequiredParams}}{{#requiredParams}}{{paramName}}{{^-last}}, {{/-last}}{{/requiredParams}}, {{/hasRequiredParams}}{{#optionalParams}}null{{^-last}}, {{/-last}}{{/optionalParams}});
- {{/hasOptionalParams}}
- {{^hasOptionalParams}}
- {{>operationBody}}
- {{/hasOptionalParams}}
- }
+ {{#hasOptionalParams}}
+ /**
+ *
{{summary}}
+ *
{{notes}}
+ {{#responses}}
+ *
{{code}}{{#message}} - {{message}}{{/message}}
+ {{/responses}}
+ {{#allParams}}
+ * @param {{paramName}} {{#required}} (required){{/required}}{{^required}} (optional{{^isContainer}}{{#defaultValue}}, default to {{.}}{{/defaultValue}}{{/isContainer}}){{/required}}
+ {{#description}}
+ * {{description}}
+ {{/description}}
+ {{^description}}
+ * The value for the parameter {{paramName}}
+ {{/description}}
+ {{/allParams}}
+ {{#returnType}}
+ * @return {{returnType}}
+ {{/returnType}}
+ {{^returnType}}
+ * @return An OpenApiResponse containing the status code of the HttpResponse.
+ {{/returnType}}
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ {{#externalDocs}}
+ * {{description}}
+ * @see {{summary}} Documentation
+ {{/externalDocs}}
+ {{#isDeprecated}}
+ * @deprecated
+ {{/isDeprecated}}
+ */
+ {{#isDeprecated}}
+ @Deprecated
+ {{/isDeprecated}}
+ {{#vendorExtensions.x-return-nullable}}@Nullable{{/vendorExtensions.x-return-nullable}}{{^vendorExtensions.x-return-nullable}}@Nonnull{{/vendorExtensions.x-return-nullable}}
+ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}OpenApiResponse {{/returnType}}{{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#allParams}}{{>nullable_var_annotations}} final {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws OpenApiRequestException {
+ {{>operationBody}}
+ }
+ {{/hasOptionalParams}}
+
+ /**
+ *
{{summary}}
+ *
{{notes}}
+ {{#responses}}
+ *
{{code}}{{#message}} - {{message}}{{/message}}
+ {{/responses}}
+ {{#requiredParams}}
+ * @param {{paramName}}
+ {{#description}}
+ * {{description}}
+ {{/description}}
+ {{^description}}
+ * The value for the parameter {{paramName}}
+ {{/description}}
+ {{/requiredParams}}
+ {{#returnType}}
+ * @return {{returnType}}
+ {{/returnType}}
+ {{^returnType}}
+ * @return An OpenApiResponse containing the status code of the HttpResponse.
+ {{/returnType}}
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ {{#externalDocs}}
+ * {{description}}
+ * @see {{summary}} Documentation
+ {{/externalDocs}}
+ {{#isDeprecated}}
+ * @deprecated
+ {{/isDeprecated}}
+ */
+ {{#isDeprecated}}
+ @Deprecated
+ {{/isDeprecated}}
+ {{#vendorExtensions.x-return-nullable}}@Nullable{{/vendorExtensions.x-return-nullable}}{{^vendorExtensions.x-return-nullable}}@Nonnull{{/vendorExtensions.x-return-nullable}}
+ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}OpenApiResponse {{/returnType}}{{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#requiredParams}}{{>nullable_var_annotations}} final {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/requiredParams}}) throws OpenApiRequestException {
+ {{#hasOptionalParams}}
+ return {{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}({{#hasRequiredParams}}{{#requiredParams}}{{paramName}}{{^-last}}, {{/-last}}{{/requiredParams}}, {{/hasRequiredParams}}{{#optionalParams}}null{{^-last}}, {{/-last}}{{/optionalParams}});
+ {{/hasOptionalParams}}
+ {{^hasOptionalParams}}
+ {{>operationBody}}
+ {{/hasOptionalParams}}
+ }
{{/operation}}
- }
+}
{{/operations}}
\ No newline at end of file
diff --git a/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/operationBody.mustache b/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/operationBody.mustache
index 7f9138e97..b0150a286 100644
--- a/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/operationBody.mustache
+++ b/datamodel/openapi/openapi-generator/src/main/resources/openapi-generator/mustache-templates/libraries/apache-httpclient/operationBody.mustache
@@ -1,10 +1,10 @@
final Object localVarPostBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}};
{{#allParams}}{{#required}}
- // verify the required parameter '{{paramName}}' is set
- if ({{paramName}} == null) {
- throw new OpenApiRequestException("Missing the required parameter '{{paramName}}' when calling {{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}")
- .statusCode(400);
- }
+// verify the required parameter '{{paramName}}' is set
+if ({{paramName}} == null) {
+throw new OpenApiRequestException("Missing the required parameter '{{paramName}}' when calling {{#vendorExtensions.x-sap-cloud-sdk-operation-name}}{{vendorExtensions.x-sap-cloud-sdk-operation-name}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}{{^vendorExtensions.x-sap-cloud-sdk-operation-name}}{{operationId}}{{/vendorExtensions.x-sap-cloud-sdk-operation-name}}")
+.statusCode(400);
+}
{{/required}}{{/allParams}}
// create path and map variables
final String localVarPath = "{{{path}}}"{{#pathParams}}
@@ -17,78 +17,77 @@ final List localVarCollectionQueryParams = new ArrayList();
final Map localVarHeaderParams = new HashMap();
final Map localVarFormParams = new HashMap();
- {{#queryParams}}
- {{#isDeepObject}}
- localVarQueryParameterBaseName = "{{{baseName}}}";
- {{#isArray}}
- for (int i=0; i < {{paramName}}.size(); i++) {
- localVarQueryStringJoiner.add({{paramName}}.get(i).toUrlQueryString(String.format(Locale.ROOT, "{{baseName}}[%d]", i)));
- }
- {{/isArray}}
- {{^isArray}}
- localVarQueryStringJoiner.add({{paramName}}.toUrlQueryString("{{baseName}}"));
- {{/isArray}}
- {{/isDeepObject}}
- {{^isDeepObject}}
- {{#isExplode}}
- {{#hasVars}}
- {{#vars}}
- {{#isArray}}
- localVarQueryParams.addAll(ApiClient.parameterToPairs("multi", "{{baseName}}", {{paramName}}.{{getter}}()));
- {{/isArray}}
- {{^isArray}}
- localVarQueryParams.addAll(ApiClient.parameterToPair("{{baseName}}", {{paramName}}.{{getter}}()));
- {{/isArray}}
- {{/vars}}
- {{/hasVars}}
- {{^hasVars}}
- {{#isModel}}
- localVarQueryStringJoiner.add({{paramName}}.toUrlQueryString());
- {{/isModel}}
- {{^isModel}}
- {{#collectionFormat}}localVarCollectionQueryParams.addAll(ApiClient.parameterToPairs("{{{collectionFormat}}}", {{/collectionFormat}}{{^collectionFormat}}localVarQueryParams.addAll(ApiClient.parameterToPair({{/collectionFormat}}"{{baseName}}", {{paramName}}));
- {{/isModel}}
- {{/hasVars}}
- {{/isExplode}}
- {{^isExplode}}
+{{#queryParams}}
+ {{#isDeepObject}}
+ localVarQueryParameterBaseName = "{{{baseName}}}";
+ {{#isArray}}
+ for (int i=0; i < {{paramName}}.size(); i++) {
+ localVarQueryStringJoiner.add({{paramName}}.get(i).toUrlQueryString(String.format(Locale.ROOT, "{{baseName}}[%d]", i)));
+ }
+ {{/isArray}}
+ {{^isArray}}
+ localVarQueryStringJoiner.add({{paramName}}.toUrlQueryString("{{baseName}}"));
+ {{/isArray}}
+ {{/isDeepObject}}
+ {{^isDeepObject}}
+ {{#isExplode}}
+ {{#hasVars}}
+ {{#vars}}
+ {{#isArray}}
+ localVarQueryParams.addAll(ApiClient.parameterToPairs("multi", "{{baseName}}", {{paramName}}.{{getter}}()));
+ {{/isArray}}
+ {{^isArray}}
+ localVarQueryParams.addAll(ApiClient.parameterToPair("{{baseName}}", {{paramName}}.{{getter}}()));
+ {{/isArray}}
+ {{/vars}}
+ {{/hasVars}}
+ {{^hasVars}}
+ {{#isModel}}
+ localVarQueryStringJoiner.add({{paramName}}.toUrlQueryString());
+ {{/isModel}}
+ {{^isModel}}
{{#collectionFormat}}localVarCollectionQueryParams.addAll(ApiClient.parameterToPairs("{{{collectionFormat}}}", {{/collectionFormat}}{{^collectionFormat}}localVarQueryParams.addAll(ApiClient.parameterToPair({{/collectionFormat}}"{{baseName}}", {{paramName}}));
- {{/isExplode}}
- {{/isDeepObject}}
- {{/queryParams}}
- {{#headerParams}}if ({{paramName}} != null)
- localVarHeaderParams.put("{{baseName}}", ApiClient.parameterToString({{paramName}}));
- {{/headerParams}}
+ {{/isModel}}
+ {{/hasVars}}
+ {{/isExplode}}
+ {{^isExplode}}
+ {{#collectionFormat}}localVarCollectionQueryParams.addAll(ApiClient.parameterToPairs("{{{collectionFormat}}}", {{/collectionFormat}}{{^collectionFormat}}localVarQueryParams.addAll(ApiClient.parameterToPair({{/collectionFormat}}"{{baseName}}", {{paramName}}));
+ {{/isExplode}}
+ {{/isDeepObject}}
+{{/queryParams}}
+{{#headerParams}}if ({{paramName}} != null)
+ localVarHeaderParams.put("{{baseName}}", ApiClient.parameterToString({{paramName}}));
+{{/headerParams}}
+{{#formParams}}if ({{paramName}} != null)
+ localVarFormParams.put("{{baseName}}", {{paramName}});
+{{/formParams}}
- {{#formParams}}if ({{paramName}} != null)
- localVarFormParams.put("{{baseName}}", {{paramName}});
- {{/formParams}}
+final String[] localVarAccepts = {
+{{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}}
+};
+final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+final String[] localVarContentTypes = {
+{{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}}
+};
+final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
- final String[] localVarAccepts = {
- {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}}
- };
- final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+{{#returnType}}
+final TypeReference<{{{returnType}}}> localVarReturnType = new TypeReference<{{{returnType}}}>() {};
+{{/returnType}}
+{{^returnType}}
+final TypeReference localVarReturnType = new TypeReference() {};
+{{/returnType}}
- final String[] localVarContentTypes = {
- {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}}
- };
- final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
-
- {{#returnType}}
- final TypeReference<{{{returnType}}}> localVarReturnType = new TypeReference<{{{returnType}}}>() {};
- {{/returnType}}
- {{^returnType}}
- final TypeReference localVarReturnType = new TypeReference() {};
- {{/returnType}}
- return apiClient.invokeAPI(
- localVarPath,
- "{{httpMethod}}",
- localVarQueryParams,
- localVarCollectionQueryParams,
- localVarQueryStringJoiner.toString(),
- localVarPostBody,
- localVarHeaderParams,
- localVarFormParams,
- localVarAccept,
- localVarContentType,
- localVarReturnType
- );
+return apiClient.invokeAPI(
+ localVarPath,
+ "{{httpMethod}}",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+);
diff --git a/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorApacheIntegrationTest.java b/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorApacheIntegrationTest.java
new file mode 100644
index 000000000..cbd349e99
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorApacheIntegrationTest.java
@@ -0,0 +1,112 @@
+package com.sap.cloud.sdk.datamodel.openapi.generator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+
+import com.sap.cloud.sdk.datamodel.openapi.generator.model.GenerationConfiguration;
+import com.sap.cloud.sdk.datamodel.openapi.generator.model.GenerationResult;
+
+import io.vavr.control.Try;
+
+// DataModelGeneratorApacheIntegrationTest.java
+class DataModelGeneratorApacheIntegrationTest extends DataModelGeneratorIntegrationTest
+{
+
+ static final String LIBRARY = "apache-httpclient";
+
+ @Override
+ @ParameterizedTest
+ @EnumSource(
+ value = TestCase.class,
+ mode = EnumSource.Mode.EXCLUDE,
+ names = {
+ "INPUT_SPEC_WITH_UPPERCASE_FILE_EXTENSION",
+ "ONE_OF_INTERFACES_DISABLED",
+ "ONE_OF_INTERFACES_ENABLED",
+ "INPUT_SPEC_WITH_BUILDER",
+ "GENERATE_APIS" } )
+ void integrationTests( final TestCase testCase, @TempDir final Path path )
+ throws Throwable
+ {
+ final Path inputDirectory = getInputDirectory(testCase);
+ final Path tempOutputDirectory = path.resolve("outputDirectory");
+ final Path comparisonDirectory = getComparisonDirectory(testCase);
+
+ Files.createDirectories(tempOutputDirectory);
+
+ assertThat(inputDirectory).exists().isReadable().isDirectory();
+ assertThat(tempOutputDirectory).exists().isReadable().isDirectory();
+ assertThat(comparisonDirectory).exists().isReadable().isDirectory();
+
+ final var generationConfiguration =
+ GenerationConfiguration
+ .builder()
+ // .debugModels(true) enable this for better mustache file debugging
+ .apiPackage(testCase.apiPackageName)
+ .generateApis(testCase.generateApis)
+ .modelPackage(testCase.modelPackageName)
+ .inputSpec(inputDirectory.resolve(testCase.inputSpecFileName).toAbsolutePath().toString())
+ .apiMaturity(testCase.apiMaturity)
+ .outputDirectory(tempOutputDirectory.toAbsolutePath().toString())
+ .withSapCopyrightHeader(true)
+ .oneOfAnyOfGenerationEnabled(testCase.anyOfOneOfGenerationEnabled)
+ .additionalProperty("useAbstractionForFiles", "true")
+ .additionalProperty("library", LIBRARY);
+
+ testCase.additionalProperties.forEach(generationConfiguration::additionalProperty);
+
+ final Try maybeGenerationResult =
+ new DataModelGenerator().generateDataModel(generationConfiguration.build());
+
+ assertThat(maybeGenerationResult.get().getGeneratedFiles()).hasSize(testCase.expectedNumberOfGeneratedFiles);
+
+ assertThatDirectoriesHaveSameContent(tempOutputDirectory, comparisonDirectory);
+ }
+
+ // Add these annotations to regenerate all sources
+ // @ParameterizedTest
+ // use this to regenerate all relevant...
+ // @EnumSource( value=TestCase.class , mode = EnumSource.Mode.EXCLUDE,
+ // names = {
+ // "INPUT_SPEC_WITH_UPPERCASE_FILE_EXTENSION",
+ // "ONE_OF_INTERFACES_DISABLED",
+ // "ONE_OF_INTERFACES_ENABLED",
+ // "INPUT_SPEC_WITH_BUILDER",
+ // "GENERATE_APIS"
+ // })
+ // @EnumSource( value = TestCase.class, names = { "API_CLASS_VENDOR_EXTENSION_YAML" } ) // ...and this one to only generate specific ones
+ @Override
+ void generateDataModelForComparison( final TestCase testCase )
+ {
+ final Path inputDirectory = getInputDirectory(testCase);
+ final Path outputDirectory = getComparisonDirectory(testCase);
+
+ assertThat(inputDirectory).exists().isReadable().isDirectory();
+ assertThat(outputDirectory).exists().isReadable().isDirectory();
+
+ final var generationConfiguration =
+ GenerationConfiguration
+ .builder()
+ .apiPackage(testCase.apiPackageName)
+ .generateApis(testCase.generateApis)
+ .modelPackage(testCase.modelPackageName)
+ .inputSpec(inputDirectory.resolve(testCase.inputSpecFileName).toAbsolutePath().toString())
+ .apiMaturity(testCase.apiMaturity)
+ .outputDirectory(outputDirectory.toAbsolutePath().toString())
+ .deleteOutputDirectory(true)
+ .withSapCopyrightHeader(true)
+ .oneOfAnyOfGenerationEnabled(testCase.anyOfOneOfGenerationEnabled)
+ .additionalProperty("useAbstractionForFiles", "true")
+ .additionalProperty("library", LIBRARY);
+ testCase.additionalProperties.forEach(generationConfiguration::additionalProperty);
+
+ GenerationConfiguration build = generationConfiguration.build();
+ new DataModelGenerator().generateDataModel(build).onFailure(Throwable::printStackTrace);
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorIntegrationTest.java b/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorIntegrationTest.java
index 6d4084e57..3059cfee4 100644
--- a/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorIntegrationTest.java
+++ b/datamodel/openapi/openapi-generator/src/test/java/com/sap/cloud/sdk/datamodel/openapi/generator/DataModelGeneratorIntegrationTest.java
@@ -25,7 +25,7 @@
class DataModelGeneratorIntegrationTest
{
@RequiredArgsConstructor
- private enum TestCase
+ enum TestCase
{
API_CLASS_FOR_AI_SDK(
"api-class-for-ai-sdk",
@@ -236,7 +236,7 @@ void generateDataModelForComparison( final TestCase testCase )
new DataModelGenerator().generateDataModel(build).onFailure(Throwable::printStackTrace);
}
- private static Path getInputDirectory( final TestCase testCase )
+ Path getInputDirectory( final TestCase testCase )
{
final Path testCaseDirectory = getTestCaseDirectory(testCase);
final Path inputDirectory = testCaseDirectory.resolve("input");
@@ -246,20 +246,17 @@ private static Path getInputDirectory( final TestCase testCase )
return inputDirectory;
}
- private static Path getTestCaseDirectory( final TestCase testCase )
+ private Path getTestCaseDirectory( final TestCase testCase )
{
final Path testCaseDirectory =
- Paths
- .get(
- "src/test/resources/" + DataModelGeneratorIntegrationTest.class.getSimpleName(),
- testCase.testCaseName);
+ Paths.get("src/test/resources/" + this.getClass().getSimpleName(), testCase.testCaseName);
assertThat(testCaseDirectory).exists().isDirectory().isReadable();
return testCaseDirectory;
}
- private static Path getComparisonDirectory( final TestCase testCase )
+ Path getComparisonDirectory( final TestCase testCase )
{
final Path testCaseDirectory = getTestCaseDirectory(testCase);
final Path comparisonDirectory = testCaseDirectory.resolve("output");
@@ -271,7 +268,7 @@ private static Path getComparisonDirectory( final TestCase testCase )
@SuppressWarnings( "resource" )
@SneakyThrows
- private static void assertThatDirectoriesHaveSameContent( final Path a, final Path b )
+ static void assertThatDirectoriesHaveSameContent( final Path a, final Path b )
{
final Predicate isFile = p -> p.toFile().isFile();
Files.walk(a).filter(isFile).forEach(p -> assertThat(p).hasSameTextualContentAs(b.resolve(a.relativize(p))));
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/input/sodastore.json b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/input/sodastore.json
new file mode 100644
index 000000000..fdacd7c85
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/input/sodastore.json
@@ -0,0 +1,249 @@
+{
+ "openapi": "3.0.0",
+ "info": {
+ "title": "Soda Store API",
+ "version": "1.0.0",
+ "description": "API for managing sodas in a soda store"
+ },
+ "paths": {
+ "/sodas": {
+ "get": {
+ "summary": "Get a list of all sodas",
+ "x-sap-cloud-sdk-api-name": "AwesomeSodas",
+ "operationId": "getSodas",
+ "responses": {
+ "200": {
+ "description": "A list of sodas",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "summary": "Add a new soda to the store",
+ "x-sap-cloud-sdk-api-name": "AwesomeSoda",
+ "operationId": "addSoda",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NewSoda"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "The newly added soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/sodas/{sodaId}": {
+ "get": {
+ "summary": "Get details of a specific soda",
+ "operationId": "getSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to retrieve",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ },
+ "put": {
+ "summary": "Update details of a specific soda",
+ "operationId": "updateSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to update",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateSoda"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ },
+ "delete": {
+ "summary": "Delete a specific soda from the store",
+ "operationId": "deleteSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to delete",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Soda successfully deleted"
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Soda": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "isAvailable": {
+ "type": "boolean"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ },
+ "diet": {
+ "type": "string",
+ "enum": ["sugar", "zero", "light"],
+ "nullable": true
+ },
+ "embedding":{
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ }
+ },
+ "required": ["name", "brand", "flavor", "price", "embedding"]
+ },
+ "NewSoda": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "zero": {
+ "type": "boolean"
+ },
+ "since": {
+ "type": "string",
+ "format": "date"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ }
+ },
+ "required": ["name", "brand", "flavor", "price"]
+ },
+ "UpdateSoda": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "zero": {
+ "type": "boolean"
+ },
+ "since": {
+ "type": "string",
+ "format": "date"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodaApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodaApi.java
new file mode 100644
index 000000000..d9cb8d6a1
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodaApi.java
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.builder.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.builder.model.NewSoda;
+import com.sap.cloud.sdk.services.builder.model.Soda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.ai.sdk.core.AiCoreService;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class AwesomeSodaApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public AwesomeSodaApi()
+ {
+ super(new AiCoreService().getApiClient());
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ *
+ * @param aiCoreService The configured connectivity instance to AI Core
+ */
+ public AwesomeSodaApi( @Nonnull final AiCoreService aiCoreService )
+ {
+ super(aiCoreService.getApiClient());
+ }
+
+
+ /**
+ * Add a new soda to the store
+ *
+ *
201 - The newly added soda
+ * @param newSoda
+ * The value for the parameter newSoda
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda addSoda(@Nonnull final NewSoda newSoda) throws OpenApiRequestException {
+ final Object localVarPostBody = newSoda;
+
+ // verify the required parameter 'newSoda' is set
+ if (newSoda == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'newSoda' when calling addSoda")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "POST",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodasApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodasApi.java
new file mode 100644
index 000000000..c8b2721cb
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/AwesomeSodasApi.java
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.builder.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.builder.model.Soda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.ai.sdk.core.AiCoreService;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class AwesomeSodasApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public AwesomeSodasApi()
+ {
+ super(new AiCoreService().getApiClient());
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ *
+ * @param aiCoreService The configured connectivity instance to AI Core
+ */
+ public AwesomeSodasApi( @Nonnull final AiCoreService aiCoreService )
+ {
+ super(aiCoreService.getApiClient());
+ }
+
+
+ /**
+ * Get a list of all sodas
+ *
+ *
200 - A list of sodas
+ * @return List<Soda>
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public List getSodas() throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // create path and map variables
+ final String localVarPath = "/sodas";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference> localVarReturnType = new TypeReference>() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/DefaultApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/DefaultApi.java
new file mode 100644
index 000000000..d23090170
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/api/DefaultApi.java
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.builder.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.builder.model.Soda;
+import com.sap.cloud.sdk.services.builder.model.UpdateSoda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.ai.sdk.core.AiCoreService;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class DefaultApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public DefaultApi()
+ {
+ super(new AiCoreService().getApiClient());
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ *
+ * @param aiCoreService The configured connectivity instance to AI Core
+ */
+ public DefaultApi( @Nonnull final AiCoreService aiCoreService )
+ {
+ super(aiCoreService.getApiClient());
+ }
+
+
+ /**
+ * Delete a specific soda from the store
+ *
+ *
204 - Soda successfully deleted
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to delete
+ * @return An OpenApiResponse containing the status code of the HttpResponse.
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public OpenApiResponse deleteSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling deleteSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "DELETE",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Get details of a specific soda
+ *
+ *
200 - The requested soda
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to retrieve
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda getSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling getSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Update details of a specific soda
+ *
+ *
200 - The updated soda
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to update
+ * @param updateSoda
+ * The value for the parameter updateSoda
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda updateSodaById(@Nonnull final Long sodaId, @Nonnull final UpdateSoda updateSoda) throws OpenApiRequestException {
+ final Object localVarPostBody = updateSoda;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling updateSodaById")
+ .statusCode(400);
+ }
+
+ // verify the required parameter 'updateSoda' is set
+ if (updateSoda == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'updateSoda' when calling updateSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "PUT",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/NewSoda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/NewSoda.java
new file mode 100644
index 000000000..20ce285d8
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/NewSoda.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.builder.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.time.LocalDate;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * NewSoda
+ */
+// CHECKSTYLE:OFF
+public class NewSoda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("zero")
+ private Boolean zero;
+
+ @JsonProperty("since")
+ private LocalDate since;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the name of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param name The name of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda name( @Nonnull final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link NewSoda} instance.
+ *
+ * @param name The name of this {@link NewSoda}
+ */
+ public void setName( @Nonnull final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the brand of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda brand( @Nonnull final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link NewSoda} instance.
+ *
+ * @param brand The brand of this {@link NewSoda}
+ */
+ public void setBrand( @Nonnull final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the zero of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param zero The zero of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda zero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ return this;
+ }
+
+ /**
+ * Get zero
+ * @return zero The zero of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public Boolean isZero() {
+ return zero;
+ }
+
+ /**
+ * Set the zero of this {@link NewSoda} instance.
+ *
+ * @param zero The zero of this {@link NewSoda}
+ */
+ public void setZero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ }
+
+ /**
+ * Set the since of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param since The since of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda since( @Nullable final LocalDate since) {
+ this.since = since;
+ return this;
+ }
+
+ /**
+ * Get since
+ * @return since The since of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public LocalDate getSince() {
+ return since;
+ }
+
+ /**
+ * Set the since of this {@link NewSoda} instance.
+ *
+ * @param since The since of this {@link NewSoda}
+ */
+ public void setSince( @Nullable final LocalDate since) {
+ this.since = since;
+ }
+
+ /**
+ * Set the flavor of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda flavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link NewSoda} instance.
+ *
+ * @param flavor The flavor of this {@link NewSoda}
+ */
+ public void setFlavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param price The price of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda price( @Nonnull final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link NewSoda} instance.
+ *
+ * @param price The price of this {@link NewSoda}
+ */
+ public void setPrice( @Nonnull final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link NewSoda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link NewSoda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("NewSoda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link NewSoda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( name != null ) declaredFields.put("name", name);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( zero != null ) declaredFields.put("zero", zero);
+ if( since != null ) declaredFields.put("since", since);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link NewSoda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final NewSoda newSoda = (NewSoda) o;
+ return Objects.equals(this.cloudSdkCustomFields, newSoda.cloudSdkCustomFields) &&
+ Objects.equals(this.name, newSoda.name) &&
+ Objects.equals(this.brand, newSoda.brand) &&
+ Objects.equals(this.zero, newSoda.zero) &&
+ Objects.equals(this.since, newSoda.since) &&
+ Objects.equals(this.flavor, newSoda.flavor) &&
+ Objects.equals(this.price, newSoda.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, brand, zero, since, flavor, price, cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class NewSoda {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" zero: ").append(toIndentedString(zero)).append("\n");
+ sb.append(" since: ").append(toIndentedString(since)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/Soda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/Soda.java
new file mode 100644
index 000000000..b0cab12da
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/Soda.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.builder.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Soda
+ */
+// CHECKSTYLE:OFF
+public class Soda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("id")
+ private Long id;
+
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("isAvailable")
+ private Boolean isAvailable;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ /**
+ * Gets or Sets diet
+ */
+ public enum DietEnum {
+ /**
+ * The SUGAR option of this Soda
+ */
+ SUGAR("sugar"),
+
+ /**
+ * The ZERO option of this Soda
+ */
+ ZERO("zero"),
+
+ /**
+ * The LIGHT option of this Soda
+ */
+ LIGHT("light");
+
+ private String value;
+
+ DietEnum(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Get the value of the enum
+ * @return The enum value
+ */
+ @JsonValue
+ @Nonnull public String getValue() {
+ return value;
+ }
+
+ /**
+ * Get the String value of the enum value.
+ * @return The enum value as String
+ */
+ @Override
+ @Nonnull public String toString() {
+ return String.valueOf(value);
+ }
+
+ /**
+ * Get the enum value from a String value
+ * @param value The String value
+ * @return The enum value of type Soda
+ */
+ @JsonCreator
+ @Nullable public static DietEnum fromValue(@Nonnull final String value) {
+ for (DietEnum b : DietEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+ }
+
+ @JsonProperty("diet")
+ private DietEnum diet;
+
+ @JsonProperty("embedding")
+ private float[] embedding;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the id of this {@link Soda} instance and return the same instance.
+ *
+ * @param id The id of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda id( @Nullable final Long id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Get id
+ * @return id The id of this {@link Soda} instance.
+ */
+ @Nonnull
+ public Long getId() {
+ return id;
+ }
+
+ /**
+ * Set the id of this {@link Soda} instance.
+ *
+ * @param id The id of this {@link Soda}
+ */
+ public void setId( @Nullable final Long id) {
+ this.id = id;
+ }
+
+ /**
+ * Set the name of this {@link Soda} instance and return the same instance.
+ *
+ * @param name The name of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda name( @Nonnull final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link Soda} instance.
+ *
+ * @param name The name of this {@link Soda}
+ */
+ public void setName( @Nonnull final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the brand of this {@link Soda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda brand( @Nonnull final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link Soda} instance.
+ *
+ * @param brand The brand of this {@link Soda}
+ */
+ public void setBrand( @Nonnull final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the isAvailable of this {@link Soda} instance and return the same instance.
+ *
+ * @param isAvailable The isAvailable of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda isAvailable( @Nullable final Boolean isAvailable) {
+ this.isAvailable = isAvailable;
+ return this;
+ }
+
+ /**
+ * Get isAvailable
+ * @return isAvailable The isAvailable of this {@link Soda} instance.
+ */
+ @Nonnull
+ public Boolean isAvailable() {
+ return isAvailable;
+ }
+
+ /**
+ * Set the isAvailable of this {@link Soda} instance.
+ *
+ * @param isAvailable The isAvailable of this {@link Soda}
+ */
+ public void setIsAvailable( @Nullable final Boolean isAvailable) {
+ this.isAvailable = isAvailable;
+ }
+
+ /**
+ * Set the flavor of this {@link Soda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda flavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link Soda} instance.
+ *
+ * @param flavor The flavor of this {@link Soda}
+ */
+ public void setFlavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link Soda} instance and return the same instance.
+ *
+ * @param price The price of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda price( @Nonnull final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link Soda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link Soda} instance.
+ *
+ * @param price The price of this {@link Soda}
+ */
+ public void setPrice( @Nonnull final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Set the diet of this {@link Soda} instance and return the same instance.
+ *
+ * @param diet The diet of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda diet( @Nullable final DietEnum diet) {
+ this.diet = diet;
+ return this;
+ }
+
+ /**
+ * Get diet
+ * @return diet The diet of this {@link Soda} instance.
+ */
+ @Nullable
+ public DietEnum getDiet() {
+ return diet;
+ }
+
+ /**
+ * Set the diet of this {@link Soda} instance.
+ *
+ * @param diet The diet of this {@link Soda}
+ */
+ public void setDiet( @Nullable final DietEnum diet) {
+ this.diet = diet;
+ }
+
+ /**
+ * Set the embedding of this {@link Soda} instance and return the same instance.
+ *
+ * @param embedding The embedding of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda embedding( @Nonnull final float[] embedding) {
+ this.embedding = embedding;
+ return this;
+ }
+
+ /**
+ * Get embedding
+ * @return embedding The embedding of this {@link Soda} instance.
+ */
+ @Nonnull
+ public float[] getEmbedding() {
+ return embedding;
+ }
+
+ /**
+ * Set the embedding of this {@link Soda} instance.
+ *
+ * @param embedding The embedding of this {@link Soda}
+ */
+ public void setEmbedding( @Nonnull final float[] embedding) {
+ this.embedding = embedding;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link Soda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link Soda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("Soda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link Soda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( id != null ) declaredFields.put("id", id);
+ if( name != null ) declaredFields.put("name", name);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( isAvailable != null ) declaredFields.put("isAvailable", isAvailable);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ if( diet != null ) declaredFields.put("diet", diet);
+ if( embedding != null ) declaredFields.put("embedding", embedding);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link Soda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final Soda soda = (Soda) o;
+ return Objects.equals(this.cloudSdkCustomFields, soda.cloudSdkCustomFields) &&
+ Objects.equals(this.id, soda.id) &&
+ Objects.equals(this.name, soda.name) &&
+ Objects.equals(this.brand, soda.brand) &&
+ Objects.equals(this.isAvailable, soda.isAvailable) &&
+ Objects.equals(this.flavor, soda.flavor) &&
+ Objects.equals(this.price, soda.price) &&
+ Objects.equals(this.diet, soda.diet) &&
+ Arrays.equals(this.embedding, soda.embedding);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, brand, isAvailable, flavor, price, diet, Arrays.hashCode(embedding), cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class Soda {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" isAvailable: ").append(toIndentedString(isAvailable)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ sb.append(" diet: ").append(toIndentedString(diet)).append("\n");
+ sb.append(" embedding: ").append(toIndentedString(embedding)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/UpdateSoda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/UpdateSoda.java
new file mode 100644
index 000000000..85f725e6a
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-for-ai-sdk/output/com/sap/cloud/sdk/services/builder/model/UpdateSoda.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.builder.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.time.LocalDate;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * UpdateSoda
+ */
+// CHECKSTYLE:OFF
+public class UpdateSoda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("zero")
+ private Boolean zero;
+
+ @JsonProperty("since")
+ private LocalDate since;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the name of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param name The name of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda name( @Nullable final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link UpdateSoda} instance.
+ *
+ * @param name The name of this {@link UpdateSoda}
+ */
+ public void setName( @Nullable final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the zero of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param zero The zero of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda zero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ return this;
+ }
+
+ /**
+ * Get zero
+ * @return zero The zero of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public Boolean isZero() {
+ return zero;
+ }
+
+ /**
+ * Set the zero of this {@link UpdateSoda} instance.
+ *
+ * @param zero The zero of this {@link UpdateSoda}
+ */
+ public void setZero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ }
+
+ /**
+ * Set the since of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param since The since of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda since( @Nullable final LocalDate since) {
+ this.since = since;
+ return this;
+ }
+
+ /**
+ * Get since
+ * @return since The since of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public LocalDate getSince() {
+ return since;
+ }
+
+ /**
+ * Set the since of this {@link UpdateSoda} instance.
+ *
+ * @param since The since of this {@link UpdateSoda}
+ */
+ public void setSince( @Nullable final LocalDate since) {
+ this.since = since;
+ }
+
+ /**
+ * Set the brand of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda brand( @Nullable final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link UpdateSoda} instance.
+ *
+ * @param brand The brand of this {@link UpdateSoda}
+ */
+ public void setBrand( @Nullable final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the flavor of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda flavor( @Nullable final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link UpdateSoda} instance.
+ *
+ * @param flavor The flavor of this {@link UpdateSoda}
+ */
+ public void setFlavor( @Nullable final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param price The price of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda price( @Nullable final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link UpdateSoda} instance.
+ *
+ * @param price The price of this {@link UpdateSoda}
+ */
+ public void setPrice( @Nullable final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link UpdateSoda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link UpdateSoda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("UpdateSoda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link UpdateSoda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( name != null ) declaredFields.put("name", name);
+ if( zero != null ) declaredFields.put("zero", zero);
+ if( since != null ) declaredFields.put("since", since);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link UpdateSoda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final UpdateSoda updateSoda = (UpdateSoda) o;
+ return Objects.equals(this.cloudSdkCustomFields, updateSoda.cloudSdkCustomFields) &&
+ Objects.equals(this.name, updateSoda.name) &&
+ Objects.equals(this.zero, updateSoda.zero) &&
+ Objects.equals(this.since, updateSoda.since) &&
+ Objects.equals(this.brand, updateSoda.brand) &&
+ Objects.equals(this.flavor, updateSoda.flavor) &&
+ Objects.equals(this.price, updateSoda.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, zero, since, brand, flavor, price, cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class UpdateSoda {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" zero: ").append(toIndentedString(zero)).append("\n");
+ sb.append(" since: ").append(toIndentedString(since)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/input/sodastore.json b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/input/sodastore.json
new file mode 100644
index 000000000..f10d46994
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/input/sodastore.json
@@ -0,0 +1,235 @@
+{
+ "openapi": "3.0.0",
+ "info": {
+ "title": "Soda Store API",
+ "version": "1.0.0",
+ "description": "API for managing sodas in a soda store"
+ },
+ "paths": {
+ "/sodas": {
+ "get": {
+ "summary": "Get a list of all sodas",
+ "x-sap-cloud-sdk-api-name": "AwesomeSodas",
+ "operationId": "getSodas",
+ "responses": {
+ "200": {
+ "description": "A list of sodas",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "summary": "Add a new soda to the store",
+ "x-sap-cloud-sdk-api-name": "AwesomeSoda",
+ "operationId": "addSoda",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NewSoda"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "The newly added soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/sodas/{sodaId}": {
+ "get": {
+ "summary": "Get details of a specific soda",
+ "operationId": "getSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to retrieve",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ },
+ "put": {
+ "summary": "Update details of a specific soda",
+ "operationId": "updateSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to update",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateSoda"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated soda",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Soda"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ },
+ "delete": {
+ "summary": "Delete a specific soda from the store",
+ "operationId": "deleteSodaById",
+ "parameters": [
+ {
+ "name": "sodaId",
+ "in": "path",
+ "description": "ID of the soda to delete",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Soda successfully deleted"
+ },
+ "404": {
+ "description": "Soda not found"
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Soda": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ }
+ },
+ "required": ["name", "brand", "flavor", "price"]
+ },
+ "NewSoda": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "zero": {
+ "type": "boolean"
+ },
+ "since": {
+ "type": "string",
+ "format": "date"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ }
+ },
+ "required": ["name", "brand", "flavor", "price"]
+ },
+ "UpdateSoda": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "zero": {
+ "type": "boolean"
+ },
+ "since": {
+ "type": "string",
+ "format": "date"
+ },
+ "brand": {
+ "type": "string"
+ },
+ "flavor": {
+ "type": "string"
+ },
+ "price": {
+ "type": "number",
+ "format": "float"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodaApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodaApi.java
new file mode 100644
index 000000000..963ff8f28
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodaApi.java
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.NewSoda;
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.Soda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class AwesomeSodaApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public AwesomeSodaApi() {}
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API.
+ *
+ * @param httpDestination The destination that API should be used with
+ */
+ public AwesomeSodaApi( @Nonnull final Destination httpDestination )
+ {
+ super(httpDestination);
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API based on a given {@link ApiClient}.
+ *
+ * @param apiClient
+ * ApiClient to invoke the API on
+ */
+ public AwesomeSodaApi(@Nonnull final ApiClient apiClient) {
+ super(apiClient);
+ }
+
+
+ /**
+ * Add a new soda to the store
+ *
+ *
201 - The newly added soda
+ * @param newSoda
+ * The value for the parameter newSoda
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda addSoda(@Nonnull final NewSoda newSoda) throws OpenApiRequestException {
+ final Object localVarPostBody = newSoda;
+
+ // verify the required parameter 'newSoda' is set
+ if (newSoda == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'newSoda' when calling addSoda")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "POST",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodasApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodasApi.java
new file mode 100644
index 000000000..084e38ade
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/AwesomeSodasApi.java
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.Soda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class AwesomeSodasApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public AwesomeSodasApi() {}
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API.
+ *
+ * @param httpDestination The destination that API should be used with
+ */
+ public AwesomeSodasApi( @Nonnull final Destination httpDestination )
+ {
+ super(httpDestination);
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API based on a given {@link ApiClient}.
+ *
+ * @param apiClient
+ * ApiClient to invoke the API on
+ */
+ public AwesomeSodasApi(@Nonnull final ApiClient apiClient) {
+ super(apiClient);
+ }
+
+
+ /**
+ * Get a list of all sodas
+ *
+ *
200 - A list of sodas
+ * @return List<Soda>
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public List getSodas() throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // create path and map variables
+ final String localVarPath = "/sodas";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference> localVarReturnType = new TypeReference>() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java
new file mode 100644
index 000000000..f60962727
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java
@@ -0,0 +1,247 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.Soda;
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.UpdateSoda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class DefaultApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public DefaultApi() {}
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API.
+ *
+ * @param httpDestination The destination that API should be used with
+ */
+ public DefaultApi( @Nonnull final Destination httpDestination )
+ {
+ super(httpDestination);
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API based on a given {@link ApiClient}.
+ *
+ * @param apiClient
+ * ApiClient to invoke the API on
+ */
+ public DefaultApi(@Nonnull final ApiClient apiClient) {
+ super(apiClient);
+ }
+
+
+ /**
+ * Delete a specific soda from the store
+ *
+ *
204 - Soda successfully deleted
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to delete
+ * @return An OpenApiResponse containing the status code of the HttpResponse.
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public OpenApiResponse deleteSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling deleteSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "DELETE",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Get details of a specific soda
+ *
+ *
200 - The requested soda
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to retrieve
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda getSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling getSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Update details of a specific soda
+ *
+ *
200 - The updated soda
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to update
+ * @param updateSoda
+ * The value for the parameter updateSoda
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda updateSodaById(@Nonnull final Long sodaId, @Nonnull final UpdateSoda updateSoda) throws OpenApiRequestException {
+ final Object localVarPostBody = updateSoda;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling updateSodaById")
+ .statusCode(400);
+ }
+
+ // verify the required parameter 'updateSoda' is set
+ if (updateSoda == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'updateSoda' when calling updateSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "PUT",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+}
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/NewSoda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/NewSoda.java
new file mode 100644
index 000000000..6bbd8468d
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/NewSoda.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.time.LocalDate;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * NewSoda
+ */
+// CHECKSTYLE:OFF
+public class NewSoda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("zero")
+ private Boolean zero;
+
+ @JsonProperty("since")
+ private LocalDate since;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the name of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param name The name of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda name( @Nonnull final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link NewSoda} instance.
+ *
+ * @param name The name of this {@link NewSoda}
+ */
+ public void setName( @Nonnull final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the brand of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda brand( @Nonnull final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link NewSoda} instance.
+ *
+ * @param brand The brand of this {@link NewSoda}
+ */
+ public void setBrand( @Nonnull final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the zero of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param zero The zero of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda zero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ return this;
+ }
+
+ /**
+ * Get zero
+ * @return zero The zero of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public Boolean isZero() {
+ return zero;
+ }
+
+ /**
+ * Set the zero of this {@link NewSoda} instance.
+ *
+ * @param zero The zero of this {@link NewSoda}
+ */
+ public void setZero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ }
+
+ /**
+ * Set the since of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param since The since of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda since( @Nullable final LocalDate since) {
+ this.since = since;
+ return this;
+ }
+
+ /**
+ * Get since
+ * @return since The since of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public LocalDate getSince() {
+ return since;
+ }
+
+ /**
+ * Set the since of this {@link NewSoda} instance.
+ *
+ * @param since The since of this {@link NewSoda}
+ */
+ public void setSince( @Nullable final LocalDate since) {
+ this.since = since;
+ }
+
+ /**
+ * Set the flavor of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda flavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link NewSoda} instance.
+ *
+ * @param flavor The flavor of this {@link NewSoda}
+ */
+ public void setFlavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link NewSoda} instance and return the same instance.
+ *
+ * @param price The price of this {@link NewSoda}
+ * @return The same instance of this {@link NewSoda} class
+ */
+ @Nonnull public NewSoda price( @Nonnull final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link NewSoda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link NewSoda} instance.
+ *
+ * @param price The price of this {@link NewSoda}
+ */
+ public void setPrice( @Nonnull final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link NewSoda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link NewSoda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("NewSoda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link NewSoda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( name != null ) declaredFields.put("name", name);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( zero != null ) declaredFields.put("zero", zero);
+ if( since != null ) declaredFields.put("since", since);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link NewSoda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final NewSoda newSoda = (NewSoda) o;
+ return Objects.equals(this.cloudSdkCustomFields, newSoda.cloudSdkCustomFields) &&
+ Objects.equals(this.name, newSoda.name) &&
+ Objects.equals(this.brand, newSoda.brand) &&
+ Objects.equals(this.zero, newSoda.zero) &&
+ Objects.equals(this.since, newSoda.since) &&
+ Objects.equals(this.flavor, newSoda.flavor) &&
+ Objects.equals(this.price, newSoda.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, brand, zero, since, flavor, price, cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class NewSoda {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" zero: ").append(toIndentedString(zero)).append("\n");
+ sb.append(" since: ").append(toIndentedString(since)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/Soda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/Soda.java
new file mode 100644
index 000000000..b0159f9aa
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/Soda.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Soda
+ */
+// CHECKSTYLE:OFF
+public class Soda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("id")
+ private Long id;
+
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the id of this {@link Soda} instance and return the same instance.
+ *
+ * @param id The id of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda id( @Nullable final Long id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Get id
+ * @return id The id of this {@link Soda} instance.
+ */
+ @Nonnull
+ public Long getId() {
+ return id;
+ }
+
+ /**
+ * Set the id of this {@link Soda} instance.
+ *
+ * @param id The id of this {@link Soda}
+ */
+ public void setId( @Nullable final Long id) {
+ this.id = id;
+ }
+
+ /**
+ * Set the name of this {@link Soda} instance and return the same instance.
+ *
+ * @param name The name of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda name( @Nonnull final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link Soda} instance.
+ *
+ * @param name The name of this {@link Soda}
+ */
+ public void setName( @Nonnull final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the brand of this {@link Soda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda brand( @Nonnull final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link Soda} instance.
+ *
+ * @param brand The brand of this {@link Soda}
+ */
+ public void setBrand( @Nonnull final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the flavor of this {@link Soda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda flavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link Soda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link Soda} instance.
+ *
+ * @param flavor The flavor of this {@link Soda}
+ */
+ public void setFlavor( @Nonnull final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link Soda} instance and return the same instance.
+ *
+ * @param price The price of this {@link Soda}
+ * @return The same instance of this {@link Soda} class
+ */
+ @Nonnull public Soda price( @Nonnull final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link Soda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link Soda} instance.
+ *
+ * @param price The price of this {@link Soda}
+ */
+ public void setPrice( @Nonnull final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link Soda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link Soda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("Soda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link Soda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( id != null ) declaredFields.put("id", id);
+ if( name != null ) declaredFields.put("name", name);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link Soda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final Soda soda = (Soda) o;
+ return Objects.equals(this.cloudSdkCustomFields, soda.cloudSdkCustomFields) &&
+ Objects.equals(this.id, soda.id) &&
+ Objects.equals(this.name, soda.name) &&
+ Objects.equals(this.brand, soda.brand) &&
+ Objects.equals(this.flavor, soda.flavor) &&
+ Objects.equals(this.price, soda.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, brand, flavor, price, cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class Soda {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/UpdateSoda.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/UpdateSoda.java
new file mode 100644
index 000000000..65139c68c
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-json/output/com/sap/cloud/sdk/services/apiclassvendorextension/model/UpdateSoda.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * Soda Store API
+ * API for managing sodas in a soda store
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.time.LocalDate;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * UpdateSoda
+ */
+// CHECKSTYLE:OFF
+public class UpdateSoda
+// CHECKSTYLE:ON
+{
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("zero")
+ private Boolean zero;
+
+ @JsonProperty("since")
+ private LocalDate since;
+
+ @JsonProperty("brand")
+ private String brand;
+
+ @JsonProperty("flavor")
+ private String flavor;
+
+ @JsonProperty("price")
+ private Float price;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map cloudSdkCustomFields = new LinkedHashMap<>();
+
+ /**
+ * Set the name of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param name The name of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda name( @Nullable final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name The name of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of this {@link UpdateSoda} instance.
+ *
+ * @param name The name of this {@link UpdateSoda}
+ */
+ public void setName( @Nullable final String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the zero of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param zero The zero of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda zero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ return this;
+ }
+
+ /**
+ * Get zero
+ * @return zero The zero of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public Boolean isZero() {
+ return zero;
+ }
+
+ /**
+ * Set the zero of this {@link UpdateSoda} instance.
+ *
+ * @param zero The zero of this {@link UpdateSoda}
+ */
+ public void setZero( @Nullable final Boolean zero) {
+ this.zero = zero;
+ }
+
+ /**
+ * Set the since of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param since The since of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda since( @Nullable final LocalDate since) {
+ this.since = since;
+ return this;
+ }
+
+ /**
+ * Get since
+ * @return since The since of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public LocalDate getSince() {
+ return since;
+ }
+
+ /**
+ * Set the since of this {@link UpdateSoda} instance.
+ *
+ * @param since The since of this {@link UpdateSoda}
+ */
+ public void setSince( @Nullable final LocalDate since) {
+ this.since = since;
+ }
+
+ /**
+ * Set the brand of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param brand The brand of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda brand( @Nullable final String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * Get brand
+ * @return brand The brand of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getBrand() {
+ return brand;
+ }
+
+ /**
+ * Set the brand of this {@link UpdateSoda} instance.
+ *
+ * @param brand The brand of this {@link UpdateSoda}
+ */
+ public void setBrand( @Nullable final String brand) {
+ this.brand = brand;
+ }
+
+ /**
+ * Set the flavor of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param flavor The flavor of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda flavor( @Nullable final String flavor) {
+ this.flavor = flavor;
+ return this;
+ }
+
+ /**
+ * Get flavor
+ * @return flavor The flavor of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public String getFlavor() {
+ return flavor;
+ }
+
+ /**
+ * Set the flavor of this {@link UpdateSoda} instance.
+ *
+ * @param flavor The flavor of this {@link UpdateSoda}
+ */
+ public void setFlavor( @Nullable final String flavor) {
+ this.flavor = flavor;
+ }
+
+ /**
+ * Set the price of this {@link UpdateSoda} instance and return the same instance.
+ *
+ * @param price The price of this {@link UpdateSoda}
+ * @return The same instance of this {@link UpdateSoda} class
+ */
+ @Nonnull public UpdateSoda price( @Nullable final Float price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Get price
+ * @return price The price of this {@link UpdateSoda} instance.
+ */
+ @Nonnull
+ public Float getPrice() {
+ return price;
+ }
+
+ /**
+ * Set the price of this {@link UpdateSoda} instance.
+ *
+ * @param price The price of this {@link UpdateSoda}
+ */
+ public void setPrice( @Nullable final Float price) {
+ this.price = price;
+ }
+
+ /**
+ * Get the names of the unrecognizable properties of the {@link UpdateSoda}.
+ * @return The set of properties names
+ */
+ @JsonIgnore
+ @Nonnull
+ public Set getCustomFieldNames() {
+ return cloudSdkCustomFields.keySet();
+ }
+
+ /**
+ * Get the value of an unrecognizable property of this {@link UpdateSoda} instance.
+ * @deprecated Use {@link #toMap()} instead.
+ * @param name The name of the property
+ * @return The value of the property
+ * @throws NoSuchElementException If no property with the given name could be found.
+ */
+ @Nullable
+ @Deprecated
+ public Object getCustomField( @Nonnull final String name ) throws NoSuchElementException {
+ if( !cloudSdkCustomFields.containsKey(name) ) {
+ throw new NoSuchElementException("UpdateSoda has no field with name '" + name + "'.");
+ }
+ return cloudSdkCustomFields.get(name);
+ }
+
+ /**
+ * Get the value of all properties of this {@link UpdateSoda} instance including unrecognized properties.
+ *
+ * @return The map of all properties
+ */
+ @JsonIgnore
+ @Nonnull
+ public Map toMap()
+ {
+ final Map declaredFields = new LinkedHashMap<>(cloudSdkCustomFields);
+ if( name != null ) declaredFields.put("name", name);
+ if( zero != null ) declaredFields.put("zero", zero);
+ if( since != null ) declaredFields.put("since", since);
+ if( brand != null ) declaredFields.put("brand", brand);
+ if( flavor != null ) declaredFields.put("flavor", flavor);
+ if( price != null ) declaredFields.put("price", price);
+ return declaredFields;
+ }
+
+ /**
+ * Set an unrecognizable property of this {@link UpdateSoda} instance. If the map previously contained a mapping
+ * for the key, the old value is replaced by the specified value.
+ * @param customFieldName The name of the property
+ * @param customFieldValue The value of the property
+ */
+ @JsonIgnore
+ public void setCustomField( @Nonnull String customFieldName, @Nullable Object customFieldValue )
+ {
+ cloudSdkCustomFields.put(customFieldName, customFieldValue);
+ }
+
+
+ @Override
+ public boolean equals(@Nullable final java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final UpdateSoda updateSoda = (UpdateSoda) o;
+ return Objects.equals(this.cloudSdkCustomFields, updateSoda.cloudSdkCustomFields) &&
+ Objects.equals(this.name, updateSoda.name) &&
+ Objects.equals(this.zero, updateSoda.zero) &&
+ Objects.equals(this.since, updateSoda.since) &&
+ Objects.equals(this.brand, updateSoda.brand) &&
+ Objects.equals(this.flavor, updateSoda.flavor) &&
+ Objects.equals(this.price, updateSoda.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, zero, since, brand, flavor, price, cloudSdkCustomFields);
+ }
+
+ @Override
+ @Nonnull public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class UpdateSoda {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" zero: ").append(toIndentedString(zero)).append("\n");
+ sb.append(" since: ").append(toIndentedString(since)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" flavor: ").append(toIndentedString(flavor)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ cloudSdkCustomFields.forEach((k,v) -> sb.append(" ").append(k).append(": ").append(toIndentedString(v)).append("\n"));
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(final java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/input/sodastore.yaml b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/input/sodastore.yaml
new file mode 100644
index 000000000..0acd4ad2d
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/input/sodastore.yaml
@@ -0,0 +1,157 @@
+openapi: 3.0.0
+info:
+ title: Soda Store API
+ version: 1.0.0
+ description: API for managing sodas in a soda store
+
+paths:
+ /sodas:
+ get:
+ summary: Get a list of all sodas
+ operationId: getSodas
+ responses:
+ '200':
+ description: A list of sodas
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Soda'
+
+ post:
+ summary: Add a new soda to the store
+ operationId: addSoda
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewSoda'
+ responses:
+ '201':
+ description: The newly added soda
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Soda'
+
+ /sodas/{sodaId}:
+ get:
+ summary: Get details of a specific soda
+ operationId: getSodaById
+ parameters:
+ - name: sodaId
+ in: path
+ description: ID of the soda to retrieve
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '200':
+ description: The requested soda
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Soda'
+ '404':
+ description: Soda not found
+
+ put:
+ summary: Update details of a specific soda
+ operationId: updateSodaById
+ parameters:
+ - name: sodaId
+ in: path
+ description: ID of the soda to update
+ required: true
+ schema:
+ type: integer
+ format: int64
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateSoda'
+ responses:
+ '200':
+ description: The updated soda
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Soda'
+ '404':
+ description: Soda not found
+
+ delete:
+ summary: Delete a specific soda from the store
+ operationId: deleteSodaById
+ parameters:
+ - name: sodaId
+ in: path
+ description: ID of the soda to delete
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '204':
+ description: Soda successfully deleted
+ '404':
+ description: Soda not found
+
+components:
+ schemas:
+ Soda:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ brand:
+ type: string
+ flavor:
+ type: string
+ price:
+ type: number
+ format: float
+ required:
+ - name
+ - brand
+ - flavor
+ - price
+
+ NewSoda:
+ type: object
+ properties:
+ name:
+ type: string
+ brand:
+ type: string
+ flavor:
+ type: string
+ price:
+ type: number
+ format: float
+ required:
+ - name
+ - brand
+ - flavor
+ - price
+
+ UpdateSoda:
+ type: object
+ properties:
+ name:
+ type: string
+ brand:
+ type: string
+ flavor:
+ type: string
+ price:
+ type: number
+ format: float
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java
new file mode 100644
index 000000000..44651981e
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/api-class-vendor-extension-yaml/output/com/sap/cloud/sdk/services/apiclassvendorextension/api/DefaultApi.java
@@ -0,0 +1,352 @@
+/*
+* Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+*/
+
+package com.sap.cloud.sdk.services.apiclassvendorextension.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import com.sap.cloud.sdk.services.openapi.apache.OpenApiResponse;
+import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
+import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
+import com.sap.cloud.sdk.services.openapi.apache.Pair;
+
+
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.NewSoda;
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.Soda;
+import com.sap.cloud.sdk.services.apiclassvendorextension.model.UpdateSoda;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
+
+
+/**
+* Soda Store API in version 1.0.0.
+*
+* API for managing sodas in a soda store
+*/
+public class DefaultApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API
+ */
+ public DefaultApi() {}
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API.
+ *
+ * @param httpDestination The destination that API should be used with
+ */
+ public DefaultApi( @Nonnull final Destination httpDestination )
+ {
+ super(httpDestination);
+ }
+
+ /**
+ * Instantiates this API class to invoke operations on the Soda Store API based on a given {@link ApiClient}.
+ *
+ * @param apiClient
+ * ApiClient to invoke the API on
+ */
+ public DefaultApi(@Nonnull final ApiClient apiClient) {
+ super(apiClient);
+ }
+
+
+ /**
+ * Add a new soda to the store
+ *
+ *
201 - The newly added soda
+ * @param newSoda
+ * The value for the parameter newSoda
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda addSoda(@Nonnull final NewSoda newSoda) throws OpenApiRequestException {
+ final Object localVarPostBody = newSoda;
+
+ // verify the required parameter 'newSoda' is set
+ if (newSoda == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'newSoda' when calling addSoda")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "POST",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Delete a specific soda from the store
+ *
+ *
204 - Soda successfully deleted
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to delete
+ * @return An OpenApiResponse containing the status code of the HttpResponse.
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public OpenApiResponse deleteSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling deleteSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List localVarCollectionQueryParams = new ArrayList();
+ final Map localVarHeaderParams = new HashMap();
+ final Map localVarFormParams = new HashMap();
+
+
+ final String[] localVarAccepts = {
+
+ };
+ final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);
+
+ final TypeReference localVarReturnType = new TypeReference() {};
+
+ return apiClient.invokeAPI(
+ localVarPath,
+ "DELETE",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarReturnType
+ );
+ }
+
+ /**
+ * Get details of a specific soda
+ *
+ *
200 - The requested soda
+ *
404 - Soda not found
+ * @param sodaId
+ * ID of the soda to retrieve
+ * @return Soda
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public Soda getSodaById(@Nonnull final Long sodaId) throws OpenApiRequestException {
+ final Object localVarPostBody = null;
+
+ // verify the required parameter 'sodaId' is set
+ if (sodaId == null) {
+ throw new OpenApiRequestException("Missing the required parameter 'sodaId' when calling getSodaById")
+ .statusCode(400);
+ }
+
+ // create path and map variables
+ final String localVarPath = "/sodas/{sodaId}"
+ .replaceAll("\\{" + "sodaId" + "\\}", ApiClient.escapeString(ApiClient.parameterToString(sodaId)));
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ final List localVarQueryParams = new ArrayList();
+ final List