Skip to content

Commit 9387838

Browse files
committed
Generalized Fallback deserializer ready. Test success.
1 parent 9afba08 commit 9387838

34 files changed

+79
-682
lines changed

orchestration/.openapi-generator-ignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ pom.xml
1414
README.md
1515
settings.gradle
1616
src/main/AndroidManifest.xml
17-
.openapi-generator-ignore
1817
api/
1918
.openapi-generator/
20-
.openapi-generator
2119

2220
src/main/java/com/sap/ai/sdk/orchestration/client/model/FilterConfig.java
2321
src/main/java/com/sap/ai/sdk/orchestration/client/model/GroundingModuleConfigConfigFiltersInner.java

orchestration/pom.xml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,23 +170,11 @@
170170
<enumUnknownDefaultCase>true</enumUnknownDefaultCase>
171171
<useBeanValidation>false</useBeanValidation>
172172
<useOneOfInterfaces>true</useOneOfInterfaces>
173-
<!--<legacyDiscriminatorBehavior>false</legacyDiscriminatorBehavior>-->
174173
</configOptions>
175174
<generateModels>true</generateModels>
176175
<generateSupportingFiles>false</generateSupportingFiles>
177176
<generateApis>false</generateApis>
178177
<library>resttemplate</library>
179-
<!--<importMappings>
180-
<importMapping>FilterConfig=com.sap.ai.sdk.orchestration.client.oneofs.FilterConfig</importMapping>
181-
<importMapping>GroundingModuleConfigConfigFiltersInner=com.sap.ai.sdk.orchestration.client.oneofs.GroundingModuleConfigConfigFiltersInner</importMapping>
182-
<importMapping>LLMModuleResult=com.sap.ai.sdk.orchestration.client.oneofs.LLMModuleResult</importMapping>
183-
<importMapping>MaskingProviderConfig=com.sap.ai.sdk.orchestration.client.oneofs.MaskingProviderConfig</importMapping>
184-
<importMapping>ModuleResultsOutputUnmaskingInner=com.sap.ai.sdk.orchestration.client.oneofs.ModuleResultsOutputUnmaskingInner</importMapping>
185-
<importMapping>TemplateRefTemplateRef=com.sap.ai.sdk.orchestration.client.oneofs.TemplateRefTemplateRef</importMapping>
186-
<importMapping>TemplatingModuleConfig=com.sap.ai.sdk.orchestration.client.oneofs.TemplatingModuleConfig</importMapping>
187-
</importMappings>
188-
<typeMappings>com.sap.ai.sdk.orchestration.client.model.FilterConfig=com.sap.ai.sdk.orchestration.client.oneofs.FilterConfig,
189-
GroundingModuleConfigConfigFiltersInner=com.sap.ai.sdk.orchestration.client.oneofs.GroundingModuleConfigConfigFiltersInner,LLMModuleResult=com.sap.ai.sdk.orchestration.client.oneofs.LLMModuleResult,MaskingProviderConfig=com.sap.ai.sdk.orchestration.client.oneofs.MaskingProviderConfig,ModuleResultsOutputUnmaskingInner=com.sap.ai.sdk.orchestration.client.oneofs.ModuleResultsOutputUnmaskingInner,TemplateRefTemplateRef=com.sap.ai.sdk.orchestration.client.oneofs.TemplateRefTemplateRef,TemplatingModuleConfig=com.sap.ai.sdk.orchestration.client.oneofs.TemplatingModuleConfig</typeMappings>-->
190178
<!--<configHelp>true</configHelp>-->
191179
</configuration>
192180
</execution>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.sap.ai.sdk.orchestration;
2+
3+
import com.fasterxml.jackson.annotation.JsonSubTypes;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.databind.*;
6+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
7+
import java.io.IOException;
8+
9+
public class GeneralizedFallbackDeserializer<T> extends StdDeserializer<T> {
10+
11+
private final Class<T> baseType;
12+
13+
public GeneralizedFallbackDeserializer(Class<T> baseClass) {
14+
super(baseClass);
15+
this.baseType = baseClass;
16+
}
17+
18+
@Override
19+
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
20+
ObjectMapper mapper = (ObjectMapper) p.getCodec();
21+
JsonNode rootNode = mapper.readTree(p);
22+
23+
// Get the possible subtypes from @JsonSubTypes
24+
JsonSubTypes subTypes = baseType.getAnnotation(JsonSubTypes.class);
25+
if (subTypes == null || subTypes.value().length == 0) {
26+
throw new JsonMappingException(p, "No subtypes found for " + baseType.getName());
27+
}
28+
29+
Exception lastException = null;
30+
for (JsonSubTypes.Type subType : subTypes.value()) {
31+
Class<? extends T> candidateClass = (Class<? extends T>) subType.value();
32+
33+
try {
34+
// Attempt to deserialize into the candidate class
35+
// If successful, return the result
36+
return mapper.treeToValue(rootNode, candidateClass);
37+
} catch (Exception e) {
38+
// Save the exception and try the next candidate
39+
lastException = e;
40+
}
41+
}
42+
43+
// If none succeeded, throw an exception with the last caught exception as the cause
44+
throw JsonMappingException.from(
45+
p, "Unable to deserialize " + baseType.getName(), lastException);
46+
}
47+
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/LLMModuleResultDeserializer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.sap.ai.sdk.orchestration;
22

33
import com.fasterxml.jackson.core.JsonParser;
4-
import com.fasterxml.jackson.core.JsonProcessingException;
54
import com.fasterxml.jackson.databind.*;
65
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
76
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResult;
@@ -16,8 +15,7 @@ public LLMModuleResultDeserializer() {
1615
}
1716

1817
@Override
19-
public LLMModuleResult deserialize(JsonParser p, DeserializationContext ctxt)
20-
throws IOException, JsonProcessingException {
18+
public LLMModuleResult deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
2119

2220
// Check if the target type is a concrete class
2321
JavaType targetType = ctxt.getContextualType();

orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public class OrchestrationClient implements OrchestrationConfig<OrchestrationCli
4848
.visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
4949
.visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
5050
.serializationInclusion(JsonInclude.Include.NON_NULL)
51-
.deserializerByType(LLMModuleResult.class, new LLMModuleResultDeserializer())
51+
.deserializerByType(
52+
LLMModuleResult.class, new GeneralizedFallbackDeserializer<>(LLMModuleResult.class))
5253
.build();
5354
}
5455

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/AzureContentSafety.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
})
2727
@javax.annotation.Generated(
2828
value = "org.openapitools.codegen.languages.JavaClientCodegen",
29-
date = "2024-11-08T14:16:03.918111+01:00[Europe/Berlin]",
29+
date = "2024-11-08T15:36:05.863594+01:00[Europe/Berlin]",
3030
comments = "Generator version: 7.9.0")
3131
public class AzureContentSafety {
3232
public static final String JSON_PROPERTY_HATE = "Hate";

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/AzureContentSafetyFilterConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
})
2727
@javax.annotation.Generated(
2828
value = "org.openapitools.codegen.languages.JavaClientCodegen",
29-
date = "2024-11-08T14:16:03.918111+01:00[Europe/Berlin]",
29+
date = "2024-11-08T15:36:05.863594+01:00[Europe/Berlin]",
3030
comments = "Generator version: 7.9.0")
3131
public class AzureContentSafetyFilterConfig implements FilterConfig {
3232
/** String represents name of the filter provider */

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/ChatDelta.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
@JsonPropertyOrder({ChatDelta.JSON_PROPERTY_ROLE, ChatDelta.JSON_PROPERTY_CONTENT})
2222
@javax.annotation.Generated(
2323
value = "org.openapitools.codegen.languages.JavaClientCodegen",
24-
date = "2024-11-08T14:16:03.918111+01:00[Europe/Berlin]",
24+
date = "2024-11-08T15:36:05.863594+01:00[Europe/Berlin]",
2525
comments = "Generator version: 7.9.0")
2626
public class ChatDelta {
2727
public static final String JSON_PROPERTY_ROLE = "role";

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/ChatMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
@JsonPropertyOrder({ChatMessage.JSON_PROPERTY_ROLE, ChatMessage.JSON_PROPERTY_CONTENT})
2222
@javax.annotation.Generated(
2323
value = "org.openapitools.codegen.languages.JavaClientCodegen",
24-
date = "2024-11-08T14:16:03.918111+01:00[Europe/Berlin]",
24+
date = "2024-11-08T15:36:05.863594+01:00[Europe/Berlin]",
2525
comments = "Generator version: 7.9.0")
2626
public class ChatMessage {
2727
public static final String JSON_PROPERTY_ROLE = "role";

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/CompletionPostRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
})
3030
@javax.annotation.Generated(
3131
value = "org.openapitools.codegen.languages.JavaClientCodegen",
32-
date = "2024-11-08T14:16:03.918111+01:00[Europe/Berlin]",
32+
date = "2024-11-08T15:36:05.863594+01:00[Europe/Berlin]",
3333
comments = "Generator version: 7.9.0")
3434
public class CompletionPostRequest {
3535
public static final String JSON_PROPERTY_ORCHESTRATION_CONFIG = "orchestration_config";

0 commit comments

Comments
 (0)