Skip to content

Commit d065b95

Browse files
committed
Additional changes for updating non-streaming error unmarshaller
1 parent 96922e2 commit d065b95

File tree

7 files changed

+75
-11
lines changed

7 files changed

+75
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
189189
ShapeModel exceptionShape = model.getShapes().get(exceptionName);
190190
String errorCode = exceptionShape.getErrorCode();
191191

192-
builder.add("case $S:\n", exceptionShape.getC2jName());
192+
builder.add("case $S:\n", errorCode);
193193
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
194194
.add(".errorCode($S)\n", errorCode);
195195
builder.add(populateHttpStatusCode(exceptionShape, model));

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,21 @@
2424
import java.util.ArrayList;
2525
import java.util.List;
2626
import java.util.Optional;
27+
import java.util.stream.Collectors;
2728
import software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler;
2829
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2930
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
3031
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
3132
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
33+
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3234
import software.amazon.awssdk.codegen.model.service.AuthType;
3335
import software.amazon.awssdk.codegen.poet.PoetExtension;
3436
import software.amazon.awssdk.codegen.utils.AuthUtils;
3537
import software.amazon.awssdk.core.CredentialType;
3638
import software.amazon.awssdk.core.client.handler.SyncClientHandler;
3739
import software.amazon.awssdk.core.runtime.transform.AsyncStreamingRequestMarshaller;
3840
import software.amazon.awssdk.core.runtime.transform.StreamingRequestMarshaller;
41+
import software.amazon.awssdk.protocols.core.ExceptionMetadata;
3942
import software.amazon.awssdk.utils.StringUtils;
4043

4144
public interface ProtocolSpec {
@@ -71,6 +74,23 @@ default List<MethodSpec> additionalMethods() {
7174
return new ArrayList<>();
7275
}
7376

77+
default List<CodeBlock> registerModeledExceptions(IntermediateModel model, PoetExtension poetExtensions) {
78+
return model.getShapes().values().stream()
79+
.filter(s -> s.getShapeType() == ShapeType.Exception)
80+
.map(e -> CodeBlock.builder()
81+
.add(".registerModeledException($T.builder()"
82+
+ ".errorCode($S)"
83+
+ ".exceptionBuilderSupplier($T::builder)"
84+
+ "$L" // populateHttpStatusCode
85+
+ ".build())",
86+
ExceptionMetadata.class,
87+
e.getErrorCode(),
88+
poetExtensions.getModelClass(e.getShapeName()),
89+
populateHttpStatusCode(e, model))
90+
.build())
91+
.collect(Collectors.toList());
92+
}
93+
7494
default String populateHttpStatusCode(ShapeModel shapeModel, IntermediateModel model) {
7595
Integer statusCode = shapeModel.getHttpStatusCode();
7696

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
114114
}
115115
ShapeModel exceptionShape = intermediateModel.getShapes().get(exceptionName);
116116
String errorCode = exceptionShape.getErrorCode();
117-
builder.add("case $S:\n", exceptionShape.getC2jName());
117+
builder.add("case $S:\n", errorCode);
118118
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
119119
.add(".errorCode($S)\n", errorCode);
120120
builder.add(populateHttpStatusCode(exceptionShape, intermediateModel));

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

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@
2323
import com.squareup.javapoet.TypeName;
2424
import com.squareup.javapoet.WildcardTypeName;
2525
import java.util.Map;
26+
import java.util.HashSet;
2627
import java.util.Optional;
28+
import java.util.Set;
2729
import java.util.concurrent.CompletableFuture;
30+
import java.util.function.Function;
2831
import software.amazon.awssdk.awscore.eventstream.EventStreamAsyncResponseTransformer;
2932
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionPojoSupplier;
3033
import software.amazon.awssdk.awscore.eventstream.RestEventStreamAsyncResponseTransformer;
@@ -43,6 +46,7 @@
4346
import software.amazon.awssdk.core.SdkPojoBuilder;
4447
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
4548
import software.amazon.awssdk.core.http.HttpResponseHandler;
49+
import software.amazon.awssdk.protocols.core.ExceptionMetadata;
4650
import software.amazon.awssdk.protocols.xml.AwsXmlProtocolFactory;
4751
import software.amazon.awssdk.protocols.xml.XmlOperationMetadata;
4852
import software.amazon.awssdk.utils.CompletableFutureUtils;
@@ -108,7 +112,46 @@ private CodeBlock streamingResponseHandler(OperationModel opModel) {
108112

109113
@Override
110114
public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
111-
return opModel.hasStreamingOutput() ? streamingErrorResponseHandler(opModel) : Optional.empty();
115+
if (opModel.hasStreamingOutput()) {
116+
return streamingErrorResponseHandler(opModel);
117+
}
118+
119+
CodeBlock.Builder builder = CodeBlock.builder();
120+
ParameterizedTypeName metadataMapperType = ParameterizedTypeName.get(
121+
ClassName.get(Function.class),
122+
ClassName.get(String.class),
123+
ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
124+
125+
builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType);
126+
builder.add("switch (errorCode) {\n");
127+
Set<String> processedExceptions = new HashSet<>();
128+
129+
opModel.getExceptions().forEach(exception -> {
130+
String exceptionName = exception.getExceptionName();
131+
if (!processedExceptions.add(exceptionName)) {
132+
return;
133+
}
134+
ShapeModel exceptionShape = model.getShapes().get(exceptionName);
135+
String errorCode = exceptionShape.getErrorCode();
136+
137+
builder.add("case $S:\n", errorCode);
138+
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
139+
.add(".errorCode($S)\n", errorCode);
140+
builder.add(populateHttpStatusCode(exceptionShape, model));
141+
builder.add(".exceptionBuilderSupplier($T::builder)\n",
142+
poetExtensions.getModelClassFromShape(exceptionShape))
143+
.add(".build());\n");
144+
});
145+
146+
builder.add("default: return $T.empty();\n", Optional.class);
147+
builder.add("}\n");
148+
builder.add("};\n\n");
149+
150+
builder.add("$T<$T> errorResponseHandler = protocolFactory.createErrorResponseHandler(exceptionMetadataMapper);",
151+
HttpResponseHandler.class,
152+
AwsServiceException.class);
153+
154+
return Optional.of(builder.build());
112155
}
113156

114157
private Optional<CodeBlock> streamingErrorResponseHandler(OperationModel opModel) {
@@ -288,9 +331,9 @@ private CodeBlock eventStreamResponseHandlers(OperationModel opModel, TypeName p
288331
streamResponseOpMd);
289332

290333
// Response handler responsible for errors for the API call itself, as well as errors sent over the event stream
291-
builder.addStatement("$T errorResponseHandler = protocolFactory"
292-
+ ".createErrorResponseHandler()", ParameterizedTypeName.get(HttpResponseHandler.class,
293-
AwsServiceException.class));
334+
// builder.addStatement("$T errorResponseHandler = protocolFactory"
335+
// + ".createErrorResponseHandler()", ParameterizedTypeName.get(HttpResponseHandler.class,
336+
// AwsServiceException.class));
294337

295338

296339
ShapeModel eventStreamShape = EventStreamUtils.getEventStreamInResponse(opModel.getOutputShape());

core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,8 @@ private AwsXmlErrorUnmarshaller(Builder builder) {
5858
}
5959

6060
private Optional<ExceptionMetadata> defaultMapToExceptionMetadata(String errorCode) {
61-
return Optional.ofNullable(exceptions)
62-
.flatMap(exs -> exs.stream()
63-
.filter(e -> e.errorCode().equals(errorCode))
64-
.findFirst());
61+
return exceptions.stream().filter(e -> e.errorCode().equals(errorCode))
62+
.findAny();
6563
}
6664

6765
/**

core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/unmarshall/AwsXmlErrorProtocolUnmarshaller.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private AwsXmlErrorProtocolUnmarshaller(Builder builder) {
9191
this.exceptionMetadataMapper = builder.exceptionMetadataMapper;
9292
this.awsXmlErrorUnmarshaller = AwsXmlErrorUnmarshaller.builder()
9393
.defaultExceptionSupplier(builder.defaultExceptionSupplier)
94+
.exceptions(builder.exceptions)
9495
.exceptionMetadataMapper(this.exceptionMetadataMapper)
9596
.errorUnmarshaller(builder.errorUnmarshaller)
9697
.build();

core/protocols/aws-xml-protocol/src/main/java/software/amazon/awssdk/protocols/xml/AwsXmlProtocolFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,9 @@ public <T extends AwsResponse> HttpResponseHandler<Response<T>> createCombinedRe
174174

175175
return new CombinedResponseHandler<>
176176
(createResponseHandler(pojoSupplier, staxOperationMetadata),
177-
createErrorResponseHandler(this.exceptionMetadataMapper));
177+
this.exceptionMetadataMapper != null
178+
? createErrorResponseHandler(this.exceptionMetadataMapper)
179+
: createErrorResponseHandler());
178180
}
179181

180182
/**

0 commit comments

Comments
 (0)