diff --git a/datamodel/openapi/openapi-generator/src/main/java/com/sap/cloud/sdk/datamodel/openapi/generator/CustomOpenAPINormalizer.java b/datamodel/openapi/openapi-generator/src/main/java/com/sap/cloud/sdk/datamodel/openapi/generator/CustomOpenAPINormalizer.java index b4dd6a3a8..2d9d58460 100644 --- a/datamodel/openapi/openapi-generator/src/main/java/com/sap/cloud/sdk/datamodel/openapi/generator/CustomOpenAPINormalizer.java +++ b/datamodel/openapi/openapi-generator/src/main/java/com/sap/cloud/sdk/datamodel/openapi/generator/CustomOpenAPINormalizer.java @@ -137,7 +137,8 @@ public Schema normalizeSchema( final @Nonnull Schema schema, final @Nonnull Set< } else if( schema.getContentEncoding() != null ) { // Any other content encoding (e.g., "binary") → treat as binary schema.setFormat("binary"); - } else if( schema.getContentMediaType() != null ) { + } else if( schema.getContentMediaType() != null + && !"application/json".equalsIgnoreCase(schema.getContentMediaType()) ) { // contentMediaType without contentEncoding → binary stream schema.setFormat("binary"); } 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 0a3d68b90..1999b7ac9 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 @@ -60,6 +60,17 @@ enum TestCase 6, Map.of(), Map.of()), + MULTIPART_BINARY_STRING( + "multipart-binary-string", + "sodastore.yaml", + "com.sap.cloud.sdk.datamodel.rest.test.api", + "com.sap.cloud.sdk.datamodel.rest.test.model", + ApiMaturity.RELEASED, + false, + true, + 2, + Map.of(), + Map.of()), INLINEOBJECT_SCHEMA_NAME( "inlineobject-schemas-enabled", "sodastore.yaml", @@ -257,7 +268,10 @@ enum TestCase } @ParameterizedTest - @EnumSource( value = TestCase.class, mode = EnumSource.Mode.EXCLUDE, names = { "FILE_HANDLING" } ) + @EnumSource( + value = TestCase.class, + mode = EnumSource.Mode.EXCLUDE, + names = { "FILE_HANDLING", "MULTIPART_BINARY_STRING" } ) void integrationTests( final TestCase testCase, @TempDir final Path path ) throws Throwable { diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/input/sodastore.yaml b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/input/sodastore.yaml new file mode 100644 index 000000000..1c330cdee --- /dev/null +++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/input/sodastore.yaml @@ -0,0 +1,43 @@ +openapi: 3.1.0 +info: + title: String and File multipart body + version: 1.0.0 + +paths: + /predict_parquet: + post: + summary: Make predictions from Parquet file + operationId: predict_parquet + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_predict_parquet' + encoding: + file: + contentType: application/vnd.apache.parquet + required: true + +components: + schemas: + Body_predict_parquet: + type: object + properties: + file: + type: string + contentMediaType: application/vnd.apache.parquet + title: File + prediction_config: + type: string + title: Prediction Config + description: JSON string containing the prediction configuration (see PredictionConfig schema). + example: { \"target_columns\": [ { \"name\": \"PRICE\",\"prediction_placeholder\": null,\"task_type\": \"regression\" } ] } + contentMediaType: application/json + contentSchema: + $ref: '#/components/schemas/PredictionConfig' + PredictionConfig: + type: object + properties: + test: + type: string + title: Test diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/api/DefaultApi.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/api/DefaultApi.java new file mode 100644 index 000000000..09a346c0a --- /dev/null +++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/api/DefaultApi.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved. + */ + +package com.sap.cloud.sdk.datamodel.rest.test.api; + +import com.fasterxml.jackson.core.type.TypeReference; + +import com.sap.cloud.sdk.services.openapi.apache.core.OpenApiRequestException; +import com.sap.cloud.sdk.services.openapi.apache.core.OpenApiResponse; +import com.sap.cloud.sdk.services.openapi.apache.apiclient.ApiClient; +import com.sap.cloud.sdk.services.openapi.apache.apiclient.BaseApi; +import com.sap.cloud.sdk.services.openapi.apache.apiclient.Pair; + + +import java.io.File; + +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; + + +/** + * String and File multipart body in version 1.0.0. + *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ */
+public class DefaultApi extends BaseApi {
+
+ /**
+ * Instantiates this API class to invoke operations on the String and File multipart body.
+ *
+ * @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 String and File multipart body based on a given {@link ApiClient}.
+ *
+ * @param apiClient
+ * ApiClient to invoke the API on
+ */
+ public DefaultApi(@Nonnull final ApiClient apiClient) {
+ super(apiClient);
+ }
+
+ /**
+ * Creates a new API instance with additional default headers.
+ *
+ * @param defaultHeaders Additional headers to include in all requests
+ * @return A new API instance with the combined headers
+ */
+ public DefaultApi withDefaultHeaders(@Nonnull final Map Make predictions from Parquet file
+ *
+ * @param _file (optional)
+ * The value for the parameter _file
+ * @param predictionConfig (optional)
+ * JSON string containing the prediction configuration (see PredictionConfig schema).
+ * @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 predictParquet(@Nullable final File _file , @Nullable final String predictionConfig ) throws OpenApiRequestException {
+
+ // create path and map variables
+ final String localVarPath = "/predict_parquet";
+
+ final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ final List Make predictions from Parquet file
+ *
+ * @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 predictParquet() throws OpenApiRequestException {
+ return predictParquet(null, null);
+ }
+ }
diff --git a/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/model/PredictionConfig.java b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/model/PredictionConfig.java
new file mode 100644
index 000000000..11f120644
--- /dev/null
+++ b/datamodel/openapi/openapi-generator/src/test/resources/DataModelGeneratorApacheIntegrationTest/multipart-binary-string/output/com/sap/cloud/sdk/datamodel/rest/test/model/PredictionConfig.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2026 SAP SE or an SAP affiliate company. All rights reserved.
+ */
+
+/*
+ * String and File multipart body
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ *
+ *
+ * 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.datamodel.rest.test.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;
+
+/**
+ * PredictionConfig
+ */
+// CHECKSTYLE:OFF
+public class PredictionConfig
+// CHECKSTYLE:ON
+{
+ @JsonProperty("test")
+ private String test;
+
+ @JsonAnySetter
+ @JsonAnyGetter
+ private final Map