Skip to content

Commit b8a9246

Browse files
committed
Simplify generated error unmarshalling code in json protocol based clients.
1 parent 1926819 commit b8a9246

5 files changed

Lines changed: 35 additions & 14 deletions

File tree

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": "apache-hb",
5+
"description": "Simplify generated error unmarshalling code in json protocol based clients."
6+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/AsyncClientClass.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ protected void addAdditionalMethods(TypeSpec.Builder type) {
172172
model));
173173
protocolSpec.createErrorResponseHandler().ifPresent(type::addMethod);
174174
protocolSpec.createEventstreamErrorResponseHandler().ifPresent(type::addMethod);
175+
protocolSpec.errorResponseHandlerProvider(model).ifPresent(type::addMethod);
175176
}
176177

177178
@Override
@@ -331,10 +332,10 @@ protected MethodSpec.Builder operationBody(MethodSpec.Builder builder, Operation
331332
CoreMetric.class, "SERVICE_ID", model.getMetadata().getServiceId());
332333
builder.addStatement("apiCallMetricCollector.reportMetric($T.$L, $S)",
333334
CoreMetric.class, "OPERATION_NAME", opModel.getOperationName());
334-
335+
335336
if (opModel.hasStreamingOutput()) {
336337
ClassName responseType = poetExtensions.getModelClass(opModel.getReturnType().getReturnType());
337-
338+
338339
builder.addStatement("$T<$T<$T, ReturnT>, $T<$T>> $N = $T.wrapWithEndOfStreamFuture($N)",
339340
Pair.class,
340341
AsyncResponseTransformer.class,
@@ -344,11 +345,11 @@ protected MethodSpec.Builder operationBody(MethodSpec.Builder builder, Operation
344345
"pair",
345346
AsyncResponseTransformerUtils.class,
346347
"asyncResponseTransformer");
347-
348+
348349
builder.addStatement("$N = $N.left()",
349350
"asyncResponseTransformer",
350351
"pair");
351-
352+
352353
builder.addStatement("$T<$T> $N = $N.right()",
353354
CompletableFuture.class,
354355
Void.class,

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/SyncClientClass.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ protected void addAdditionalMethods(TypeSpec.Builder type) {
140140
type.addMethod(updateSdkClientConfigurationMethod(configurationUtils.serviceClientConfigurationBuilderClassName(),
141141
model));
142142
type.addMethod(protocolSpec.initProtocolFactory(model));
143+
144+
protocolSpec.errorResponseHandlerProvider(model).ifPresent(type::addMethod);
143145
}
144146

145147
private FieldSpec logger() {

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.codegen.poet.client.specs;
1717

1818
import static software.amazon.awssdk.codegen.model.intermediate.Protocol.AWS_JSON;
19+
import static javax.lang.model.element.Modifier.PRIVATE;
1920

2021
import com.squareup.javapoet.ClassName;
2122
import com.squareup.javapoet.CodeBlock;
@@ -167,12 +168,18 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
167168
String protocolFactory = protocolFactoryLiteral(model, opModel);
168169

169170
CodeBlock.Builder builder = CodeBlock.builder();
170-
ParameterizedTypeName metadataMapperType = ParameterizedTypeName.get(
171-
ClassName.get(Function.class),
172-
ClassName.get(String.class),
173-
ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
174171

175-
builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType);
172+
builder.add("$T<$T> errorResponseHandler = createErrorResponseHandler($L, operationMetadata, this::exceptionMetadataMapper);",
173+
HttpResponseHandler.class, AwsServiceException.class, protocolFactory);
174+
175+
return Optional.of(builder.build());
176+
}
177+
178+
@Override
179+
public Optional<MethodSpec> errorResponseHandlerProvider(IntermediateModel model) {
180+
181+
CodeBlock.Builder builder = CodeBlock.builder();
182+
176183
builder.add("if (errorCode == null) {\n");
177184
builder.add("return $T.empty();\n", Optional.class);
178185
builder.add("}\n");
@@ -194,12 +201,13 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
194201

195202
builder.add("default: return $T.empty();\n", Optional.class);
196203
builder.add("}\n");
197-
builder.add("};\n");
198-
199-
builder.add("$T<$T> errorResponseHandler = createErrorResponseHandler($L, operationMetadata, exceptionMetadataMapper);",
200-
HttpResponseHandler.class, AwsServiceException.class, protocolFactory);
201204

202-
return Optional.of(builder.build());
205+
MethodSpec.Builder method = MethodSpec.methodBuilder("exceptionMetadataMapper")
206+
.addModifiers(PRIVATE)
207+
.addParameter(String.class, "errorCode")
208+
.addCode(builder.build())
209+
.returns(ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
210+
return Optional.of(method.build());
203211
}
204212

205213
@Override

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ public interface ProtocolSpec {
5151

5252
Optional<CodeBlock> errorResponseHandler(OperationModel opModel);
5353

54+
default Optional<MethodSpec> errorResponseHandlerProvider(IntermediateModel model) {
55+
return Optional.empty();
56+
}
57+
5458
CodeBlock executionHandler(OperationModel opModel);
5559

5660
/**

0 commit comments

Comments
 (0)