Skip to content

Commit 7527d2b

Browse files
committed
Additional changes for updating non-streaming error unmarshaller
1 parent 7e7c124 commit 7527d2b

26 files changed

+858
-1473
lines changed

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

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@
2525
import com.squareup.javapoet.TypeName;
2626
import com.squareup.javapoet.TypeVariableName;
2727
import com.squareup.javapoet.WildcardTypeName;
28-
import java.util.HashSet;
2928
import java.util.Optional;
30-
import java.util.Set;
3129
import java.util.concurrent.CompletableFuture;
3230
import java.util.function.Function;
3331
import javax.lang.model.element.Modifier;
@@ -41,6 +39,7 @@
4139
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
4240
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
4341
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
42+
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
4443
import software.amazon.awssdk.codegen.poet.PoetExtension;
4544
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
4645
import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait;
@@ -179,28 +178,24 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
179178

180179
builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType);
181180
builder.add("switch (errorCode) {\n");
182-
Set<String> processedExceptions = new HashSet<>();
183-
184-
opModel.getExceptions().forEach(exception -> {
185-
String exceptionName = exception.getExceptionName();
186-
if (!processedExceptions.add(exceptionName)) {
187-
return;
188-
}
189-
ShapeModel exceptionShape = model.getShapes().get(exceptionName);
190-
String errorCode = exceptionShape.getErrorCode();
191-
192-
builder.add("case $S:\n", errorCode);
193-
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
194-
.add(".errorCode($S)\n", errorCode);
195-
builder.add(populateHttpStatusCode(exceptionShape, model));
196-
builder.add(".exceptionBuilderSupplier($T::builder)\n",
197-
poetExtensions.getModelClassFromShape(exceptionShape))
198-
.add(".build());\n");
199-
});
181+
model.getShapes().values().stream()
182+
.filter(shape -> shape.getShapeType() == ShapeType.Exception)
183+
.forEach(exceptionShape -> {
184+
String exceptionName = exceptionShape.getShapeName();
185+
String errorCode = exceptionShape.getErrorCode();
186+
187+
builder.add("case $S:\n", errorCode);
188+
builder.add("return $T.of($T.builder()\n", Optional.class, ExceptionMetadata.class)
189+
.add(".errorCode($S)\n", errorCode);
190+
builder.add(populateHttpStatusCode(exceptionShape, model));
191+
builder.add(".exceptionBuilderSupplier($T::builder)\n",
192+
poetExtensions.getModelClassFromShape(exceptionShape))
193+
.add(".build());\n");
194+
});
200195

201196
builder.add("default: return $T.empty();\n", Optional.class);
202197
builder.add("}\n");
203-
builder.add("};\n\n");
198+
builder.add("};\n");
204199

205200
builder.add("$T<$T> errorResponseHandler = createErrorResponseHandler($L, operationMetadata, exceptionMetadataMapper);",
206201
HttpResponseHandler.class, AwsServiceException.class, protocolFactory);

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

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,12 @@
2121
import com.squareup.javapoet.MethodSpec;
2222
import com.squareup.javapoet.ParameterizedTypeName;
2323
import com.squareup.javapoet.TypeName;
24-
import java.util.HashSet;
2524
import java.util.Optional;
26-
import java.util.Set;
2725
import java.util.concurrent.CompletableFuture;
28-
import java.util.function.Function;
2926
import javax.lang.model.element.Modifier;
3027
import software.amazon.awssdk.awscore.exception.AwsServiceException;
3128
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3229
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
33-
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3430
import software.amazon.awssdk.codegen.poet.PoetExtension;
3531
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
3632
import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait;
@@ -40,7 +36,6 @@
4036
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
4137
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
4238
import software.amazon.awssdk.core.http.HttpResponseHandler;
43-
import software.amazon.awssdk.protocols.core.ExceptionMetadata;
4439
import software.amazon.awssdk.protocols.query.AwsQueryProtocolFactory;
4540
import software.amazon.awssdk.utils.CompletableFutureUtils;
4641

@@ -74,6 +69,8 @@ public MethodSpec initProtocolFactory(IntermediateModel model) {
7469

7570
methodSpec.addCode("return $T.builder()\n", protocolFactoryClass());
7671

72+
registerModeledExceptions(model, poetExtensions).forEach(methodSpec::addCode);
73+
7774
methodSpec.addCode(".clientConfiguration(clientConfiguration)\n"
7875
+ ".defaultServiceExceptionSupplier($T::builder)\n",
7976
poetExtensions.getModelClass(model.getSdkModeledExceptionBaseClassName()));
@@ -97,41 +94,11 @@ public CodeBlock responseHandler(IntermediateModel model,
9794

9895
@Override
9996
public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
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", errorCode);
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());
97+
return Optional.of(
98+
CodeBlock.builder()
99+
.add("\n\n$T errorResponseHandler = protocolFactory.createErrorResponseHandler();",
100+
ParameterizedTypeName.get(HttpResponseHandler.class, AwsServiceException.class))
101+
.build());
135102
}
136103

137104
@Override
@@ -226,18 +193,6 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
226193

227194
@Override
228195
public Optional<MethodSpec> createErrorResponseHandler() {
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());
196+
return Optional.empty();
241197
}
242-
243-
}
198+
}

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

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,9 @@
2222
import com.squareup.javapoet.ParameterizedTypeName;
2323
import com.squareup.javapoet.TypeName;
2424
import com.squareup.javapoet.WildcardTypeName;
25-
import java.util.HashSet;
2625
import java.util.Map;
2726
import java.util.Optional;
28-
import java.util.Set;
2927
import java.util.concurrent.CompletableFuture;
30-
import java.util.function.Function;
3128
import software.amazon.awssdk.awscore.eventstream.EventStreamAsyncResponseTransformer;
3229
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionPojoSupplier;
3330
import software.amazon.awssdk.awscore.eventstream.RestEventStreamAsyncResponseTransformer;
@@ -46,7 +43,6 @@
4643
import software.amazon.awssdk.core.SdkPojoBuilder;
4744
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
4845
import software.amazon.awssdk.core.http.HttpResponseHandler;
49-
import software.amazon.awssdk.protocols.core.ExceptionMetadata;
5046
import software.amazon.awssdk.protocols.xml.AwsXmlProtocolFactory;
5147
import software.amazon.awssdk.protocols.xml.XmlOperationMetadata;
5248
import software.amazon.awssdk.utils.CompletableFutureUtils;
@@ -95,7 +91,7 @@ public CodeBlock responseHandler(IntermediateModel model,
9591
return CodeBlock.builder()
9692
.addStatement("\n\n$T responseHandler = protocolFactory.createCombinedResponseHandler($T::builder, "
9793
+ "new $T().withHasStreamingSuccessResponse($L))",
98-
handlerType, responseType, XmlOperationMetadata.class, opModel.hasStreamingOutput())
94+
handlerType, responseType, XmlOperationMetadata.class, opModel.hasStreamingOutput())
9995
.build();
10096
}
10197

@@ -112,46 +108,7 @@ private CodeBlock streamingResponseHandler(OperationModel opModel) {
112108

113109
@Override
114110
public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
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());
111+
return opModel.hasStreamingOutput() ? streamingErrorResponseHandler(opModel) : Optional.empty();
155112
}
156113

157114
private Optional<CodeBlock> streamingErrorResponseHandler(OperationModel opModel) {
@@ -331,9 +288,9 @@ private CodeBlock eventStreamResponseHandlers(OperationModel opModel, TypeName p
331288
streamResponseOpMd);
332289

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

338295

339296
ShapeModel eventStreamShape = EventStreamUtils.getEventStreamInResponse(opModel.getOutputShape());
@@ -429,4 +386,4 @@ private CodeBlock whenCompleteBlock(OperationModel operationModel, String respon
429386

430387
return whenComplete.build();
431388
}
432-
}
389+
}

0 commit comments

Comments
 (0)