Skip to content

Commit 8450448

Browse files
authored
Update non-streaming error unmarshaller with the new mapping function (#6122)
* Update non-streaming error unmarshaller with the new mapping function * Updating tests
1 parent 178e964 commit 8450448

25 files changed

+5396
-3034
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Update non-streaming error unmarshalling to properly unmarshall exceptions to their expected types."
6+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
4040
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
4141
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
42+
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
4243
import software.amazon.awssdk.codegen.poet.PoetExtension;
4344
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
4445
import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait;
@@ -116,7 +117,6 @@ public MethodSpec initProtocolFactory(IntermediateModel model) {
116117
methodSpec.addCode("$L", hasAwsQueryCompatible());
117118
}
118119

119-
registerModeledExceptions(model, poetExtensions).forEach(methodSpec::addCode);
120120
methodSpec.addCode(";");
121121

122122
return methodSpec.build();
@@ -170,11 +170,40 @@ public CodeBlock responseHandler(IntermediateModel model, OperationModel opModel
170170
public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
171171
String protocolFactory = protocolFactoryLiteral(model, opModel);
172172

173-
return Optional.of(
174-
CodeBlock.builder()
175-
.add("\n\n$T<$T> errorResponseHandler = createErrorResponseHandler($L, operationMetadata);",
176-
HttpResponseHandler.class, AwsServiceException.class, protocolFactory)
177-
.build());
173+
CodeBlock.Builder builder = CodeBlock.builder();
174+
ParameterizedTypeName metadataMapperType = ParameterizedTypeName.get(
175+
ClassName.get(Function.class),
176+
ClassName.get(String.class),
177+
ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
178+
179+
builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType);
180+
builder.add("if (errorCode == null) {\n");
181+
builder.add("return $T.empty();\n", Optional.class);
182+
builder.add("}\n");
183+
builder.add("switch (errorCode) {\n");
184+
model.getShapes().values().stream()
185+
.filter(shape -> shape.getShapeType() == ShapeType.Exception)
186+
.forEach(exceptionShape -> {
187+
String exceptionName = exceptionShape.getShapeName();
188+
String errorCode = exceptionShape.getErrorCode();
189+
190+
builder.add("case $S:\n", errorCode);
191+
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
192+
.add(".errorCode($S)\n", errorCode);
193+
builder.add(populateHttpStatusCode(exceptionShape, model));
194+
builder.add(".exceptionBuilderSupplier($T::builder)\n",
195+
poetExtensions.getModelClassFromShape(exceptionShape))
196+
.add(".build());\n");
197+
});
198+
199+
builder.add("default: return $T.empty();\n", Optional.class);
200+
builder.add("}\n");
201+
builder.add("};\n");
202+
203+
builder.add("$T<$T> errorResponseHandler = createErrorResponseHandler($L, operationMetadata, exceptionMetadataMapper);",
204+
HttpResponseHandler.class, AwsServiceException.class, protocolFactory);
205+
206+
return Optional.of(builder.build());
178207
}
179208

180209
@Override
@@ -411,21 +440,6 @@ public Optional<MethodSpec> createErrorResponseHandler() {
411440
ClassName httpResponseHandler = ClassName.get(HttpResponseHandler.class);
412441
ClassName sdkBaseException = ClassName.get(AwsServiceException.class);
413442
TypeName responseHandlerOfException = ParameterizedTypeName.get(httpResponseHandler, sdkBaseException);
414-
415-
return Optional.of(MethodSpec.methodBuilder("createErrorResponseHandler")
416-
.addParameter(BaseAwsJsonProtocolFactory.class, "protocolFactory")
417-
.addParameter(JsonOperationMetadata.class, "operationMetadata")
418-
.returns(responseHandlerOfException)
419-
.addModifiers(Modifier.PRIVATE)
420-
.addStatement("return protocolFactory.createErrorResponseHandler(operationMetadata)")
421-
.build());
422-
}
423-
424-
@Override
425-
public Optional<MethodSpec> createEventstreamErrorResponseHandler() {
426-
ClassName httpResponseHandler = ClassName.get(HttpResponseHandler.class);
427-
ClassName sdkBaseException = ClassName.get(AwsServiceException.class);
428-
TypeName responseHandlerOfException = ParameterizedTypeName.get(httpResponseHandler, sdkBaseException);
429443
ParameterizedTypeName mapperType = ParameterizedTypeName.get(ClassName.get(Function.class),
430444
ClassName.get(String.class), ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
431445

0 commit comments

Comments
 (0)