Skip to content

Commit 96922e2

Browse files
committed
Update query protocol error unmarshalling with new mapping function
1 parent 323da2c commit 96922e2

File tree

13 files changed

+864
-89
lines changed

13 files changed

+864
-89
lines changed

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

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@
2121
import com.squareup.javapoet.MethodSpec;
2222
import com.squareup.javapoet.ParameterizedTypeName;
2323
import com.squareup.javapoet.TypeName;
24+
import java.util.HashSet;
2425
import java.util.Optional;
26+
import java.util.Set;
2527
import java.util.concurrent.CompletableFuture;
28+
import java.util.function.Function;
2629
import javax.lang.model.element.Modifier;
2730
import software.amazon.awssdk.awscore.exception.AwsServiceException;
2831
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2932
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
33+
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3034
import software.amazon.awssdk.codegen.poet.PoetExtension;
3135
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
3236
import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait;
@@ -36,6 +40,7 @@
3640
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
3741
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
3842
import software.amazon.awssdk.core.http.HttpResponseHandler;
43+
import software.amazon.awssdk.protocols.core.ExceptionMetadata;
3944
import software.amazon.awssdk.protocols.query.AwsQueryProtocolFactory;
4045
import software.amazon.awssdk.utils.CompletableFutureUtils;
4146

@@ -92,11 +97,41 @@ public CodeBlock responseHandler(IntermediateModel model,
9297

9398
@Override
9499
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());
100135
}
101136

102137
@Override
@@ -191,6 +226,18 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
191226

192227
@Override
193228
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());
195241
}
242+
196243
}

0 commit comments

Comments
 (0)