|
21 | 21 | import com.squareup.javapoet.MethodSpec;
|
22 | 22 | import com.squareup.javapoet.ParameterizedTypeName;
|
23 | 23 | import com.squareup.javapoet.TypeName;
|
| 24 | +import java.util.HashSet; |
24 | 25 | import java.util.Optional;
|
| 26 | +import java.util.Set; |
25 | 27 | import java.util.concurrent.CompletableFuture;
|
| 28 | +import java.util.function.Function; |
26 | 29 | import javax.lang.model.element.Modifier;
|
27 | 30 | import software.amazon.awssdk.awscore.exception.AwsServiceException;
|
28 | 31 | import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
|
29 | 32 | import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
|
| 33 | +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; |
30 | 34 | import software.amazon.awssdk.codegen.poet.PoetExtension;
|
31 | 35 | import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
|
32 | 36 | import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait;
|
|
36 | 40 | import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
37 | 41 | import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
|
38 | 42 | import software.amazon.awssdk.core.http.HttpResponseHandler;
|
| 43 | +import software.amazon.awssdk.protocols.core.ExceptionMetadata; |
39 | 44 | import software.amazon.awssdk.protocols.query.AwsQueryProtocolFactory;
|
40 | 45 | import software.amazon.awssdk.utils.CompletableFutureUtils;
|
41 | 46 |
|
@@ -92,11 +97,41 @@ public CodeBlock responseHandler(IntermediateModel model,
|
92 | 97 |
|
93 | 98 | @Override
|
94 | 99 | public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
|
95 |
| - return Optional.of( |
96 |
| - CodeBlock.builder() |
97 |
| - .add("\n\n$T errorResponseHandler = protocolFactory.createErrorResponseHandler();", |
98 |
| - ParameterizedTypeName.get(HttpResponseHandler.class, AwsServiceException.class)) |
99 |
| - .build()); |
| 100 | + CodeBlock.Builder builder = CodeBlock.builder(); |
| 101 | + ParameterizedTypeName metadataMapperType = ParameterizedTypeName.get( |
| 102 | + ClassName.get(Function.class), |
| 103 | + ClassName.get(String.class), |
| 104 | + ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class)); |
| 105 | + |
| 106 | + builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType); |
| 107 | + builder.add("switch (errorCode) {\n"); |
| 108 | + Set<String> processedExceptions = new HashSet<>(); |
| 109 | + |
| 110 | + opModel.getExceptions().forEach(exception -> { |
| 111 | + String exceptionName = exception.getExceptionName(); |
| 112 | + if (!processedExceptions.add(exceptionName)) { |
| 113 | + return; |
| 114 | + } |
| 115 | + ShapeModel exceptionShape = intermediateModel.getShapes().get(exceptionName); |
| 116 | + String errorCode = exceptionShape.getErrorCode(); |
| 117 | + builder.add("case $S:\n", exceptionShape.getC2jName()); |
| 118 | + builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class) |
| 119 | + .add(".errorCode($S)\n", errorCode); |
| 120 | + builder.add(populateHttpStatusCode(exceptionShape, intermediateModel)); |
| 121 | + builder.add(".exceptionBuilderSupplier($T::builder)\n", |
| 122 | + poetExtensions.getModelClassFromShape(exceptionShape)) |
| 123 | + .add(".build());\n"); |
| 124 | + }); |
| 125 | + |
| 126 | + builder.add("default: return $T.empty();\n", Optional.class); |
| 127 | + builder.add("}\n"); |
| 128 | + builder.add("};\n\n"); |
| 129 | + |
| 130 | + builder.add("$T<$T> errorResponseHandler = protocolFactory.createErrorResponseHandler(exceptionMetadataMapper);", |
| 131 | + HttpResponseHandler.class, |
| 132 | + AwsServiceException.class); |
| 133 | + |
| 134 | + return Optional.of(builder.build()); |
100 | 135 | }
|
101 | 136 |
|
102 | 137 | @Override
|
@@ -191,6 +226,18 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
|
191 | 226 |
|
192 | 227 | @Override
|
193 | 228 | public Optional<MethodSpec> createErrorResponseHandler() {
|
194 |
| - return Optional.empty(); |
| 229 | + ParameterizedTypeName mapperType = ParameterizedTypeName.get( |
| 230 | + ClassName.get(Function.class), |
| 231 | + ClassName.get(String.class), |
| 232 | + ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class)); |
| 233 | + |
| 234 | + return Optional.of(MethodSpec.methodBuilder("createErrorResponseHandler") |
| 235 | + .addModifiers(Modifier.PRIVATE) |
| 236 | + .returns(ParameterizedTypeName.get(ClassName.get(HttpResponseHandler.class), |
| 237 | + ClassName.get(AwsServiceException.class))) |
| 238 | + .addParameter(mapperType, "exceptionMetadataMapper") |
| 239 | + .addStatement("return protocolFactory.createErrorResponseHandler(exceptionMetadataMapper)") |
| 240 | + .build()); |
195 | 241 | }
|
| 242 | + |
196 | 243 | }
|
0 commit comments