Skip to content

Commit e687576

Browse files
committed
Fixing test failures
1 parent be111ed commit e687576

25 files changed

+5153
-4572
lines changed

Diff for: .changes/next-release/bugfix-AWSSDKforJavav2-e869e94.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"type": "bugfix",
33
"category": "AWS SDK for Java v2",
44
"contributor": "",
5-
"description": "Update non-streaming error unmarshalling to use the same mapping function that was previously implemented for streaming operations, which allows to deprecate createErrorResponseHandler(JsonOperationMetadata) method."
5+
"description": "Enhance non-streaming error unmarshalling to properly unmarshall exceptions to their expected types."
66
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ public Optional<CodeBlock> errorResponseHandler(OperationModel opModel) {
177177
ParameterizedTypeName.get(Optional.class, ExceptionMetadata.class));
178178

179179
builder.add("\n$T exceptionMetadataMapper = errorCode -> {\n", metadataMapperType);
180+
builder.add("if (errorCode == null) {\n");
181+
builder.add("return $T.empty();\n", Optional.class);
182+
builder.add("}\n");
180183
builder.add("switch (errorCode) {\n");
181184
model.getShapes().values().stream()
182185
.filter(shape -> shape.getShapeType() == ShapeType.Exception)

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java

+407-365
Large diffs are not rendered by default.

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-cbor-async-client-class.java

+407-365
Large diffs are not rendered by default.

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java

+454-406
Large diffs are not rendered by default.

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-client-class.java

+337-298
Large diffs are not rendered by default.

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java

+412-370
Large diffs are not rendered by default.

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-query-compatible-json-async-client-class.java

+26-24
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class DefaultQueryToJsonCompatibleAsyncClient implements QueryToJsonCompat
5757
private static final Logger log = LoggerFactory.getLogger(DefaultQueryToJsonCompatibleAsyncClient.class);
5858

5959
private static final AwsProtocolMetadata protocolMetadata = AwsProtocolMetadata.builder()
60-
.serviceProtocol(AwsServiceProtocol.AWS_JSON).build();
60+
.serviceProtocol(AwsServiceProtocol.AWS_JSON).build();
6161

6262
private final AsyncClientHandler clientHandler;
6363

@@ -99,41 +99,43 @@ protected DefaultQueryToJsonCompatibleAsyncClient(SdkClientConfiguration clientC
9999
public CompletableFuture<APostOperationResponse> aPostOperation(APostOperationRequest aPostOperationRequest) {
100100
SdkClientConfiguration clientConfiguration = updateSdkClientConfiguration(aPostOperationRequest, this.clientConfiguration);
101101
List<MetricPublisher> metricPublishers = resolveMetricPublishers(clientConfiguration, aPostOperationRequest
102-
.overrideConfiguration().orElse(null));
102+
.overrideConfiguration().orElse(null));
103103
MetricCollector apiCallMetricCollector = metricPublishers.isEmpty() ? NoOpMetricCollector.create() : MetricCollector
104-
.create("ApiCall");
104+
.create("ApiCall");
105105
try {
106106
apiCallMetricCollector.reportMetric(CoreMetric.SERVICE_ID, "QueryToJsonCompatibleService");
107107
apiCallMetricCollector.reportMetric(CoreMetric.OPERATION_NAME, "APostOperation");
108108
JsonOperationMetadata operationMetadata = JsonOperationMetadata.builder().hasStreamingSuccessResponse(false)
109-
.isPayloadJson(true).build();
109+
.isPayloadJson(true).build();
110110

111111
HttpResponseHandler<APostOperationResponse> responseHandler = protocolFactory.createResponseHandler(
112-
operationMetadata, APostOperationResponse::builder);
112+
operationMetadata, APostOperationResponse::builder);
113113
Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper = errorCode -> {
114+
if (errorCode == null) {
115+
return Optional.empty();
116+
}
114117
switch (errorCode) {
115-
case "InvalidInput":
116-
return Optional.of(ExceptionMetadata.builder().errorCode("InvalidInput").httpStatusCode(400)
117-
.exceptionBuilderSupplier(InvalidInputException::builder).build());
118-
default:
119-
return Optional.empty();
118+
case "InvalidInput":
119+
return Optional.of(ExceptionMetadata.builder().errorCode("InvalidInput").httpStatusCode(400)
120+
.exceptionBuilderSupplier(InvalidInputException::builder).build());
121+
default:
122+
return Optional.empty();
120123
}
121124
};
122-
123125
HttpResponseHandler<AwsServiceException> errorResponseHandler = createErrorResponseHandler(protocolFactory,
124-
operationMetadata, exceptionMetadataMapper);
126+
operationMetadata, exceptionMetadataMapper);
125127
String hostPrefix = "{StringMember}-foo.";
126128
HostnameValidator.validateHostnameCompliant(aPostOperationRequest.stringMember(), "StringMember",
127-
"aPostOperationRequest");
129+
"aPostOperationRequest");
128130
String resolvedHostExpression = String.format("%s-foo.", aPostOperationRequest.stringMember());
129131

130132
CompletableFuture<APostOperationResponse> executeFuture = clientHandler
131-
.execute(new ClientExecutionParams<APostOperationRequest, APostOperationResponse>()
132-
.withOperationName("APostOperation").withProtocolMetadata(protocolMetadata)
133-
.withMarshaller(new APostOperationRequestMarshaller(protocolFactory))
134-
.withResponseHandler(responseHandler).withErrorResponseHandler(errorResponseHandler)
135-
.withRequestConfiguration(clientConfiguration).withMetricCollector(apiCallMetricCollector)
136-
.hostPrefixExpression(resolvedHostExpression).withInput(aPostOperationRequest));
133+
.execute(new ClientExecutionParams<APostOperationRequest, APostOperationResponse>()
134+
.withOperationName("APostOperation").withProtocolMetadata(protocolMetadata)
135+
.withMarshaller(new APostOperationRequestMarshaller(protocolFactory))
136+
.withResponseHandler(responseHandler).withErrorResponseHandler(errorResponseHandler)
137+
.withRequestConfiguration(clientConfiguration).withMetricCollector(apiCallMetricCollector)
138+
.hostPrefixExpression(resolvedHostExpression).withInput(aPostOperationRequest));
137139
CompletableFuture<APostOperationResponse> whenCompleted = executeFuture.whenComplete((r, e) -> {
138140
metricPublishers.forEach(p -> p.publish(apiCallMetricCollector.collect()));
139141
});
@@ -157,12 +159,12 @@ public final String serviceName() {
157159

158160
private <T extends BaseAwsJsonProtocolFactory.Builder<T>> T init(T builder) {
159161
return builder.clientConfiguration(clientConfiguration)
160-
.defaultServiceExceptionSupplier(QueryToJsonCompatibleException::builder).protocol(AwsJsonProtocol.AWS_JSON)
161-
.protocolVersion("1.1").hasAwsQueryCompatible(true);
162+
.defaultServiceExceptionSupplier(QueryToJsonCompatibleException::builder).protocol(AwsJsonProtocol.AWS_JSON)
163+
.protocolVersion("1.1").hasAwsQueryCompatible(true);
162164
}
163165

164166
private static List<MetricPublisher> resolveMetricPublishers(SdkClientConfiguration clientConfiguration,
165-
RequestOverrideConfiguration requestOverrideConfiguration) {
167+
RequestOverrideConfiguration requestOverrideConfiguration) {
166168
List<MetricPublisher> publishers = null;
167169
if (requestOverrideConfiguration != null) {
168170
publishers = requestOverrideConfiguration.metricPublishers();
@@ -206,7 +208,7 @@ private SdkClientConfiguration updateSdkClientConfiguration(SdkRequest request,
206208
return configuration.build();
207209
}
208210
QueryToJsonCompatibleServiceClientConfigurationBuilder serviceConfigBuilder = new QueryToJsonCompatibleServiceClientConfigurationBuilder(
209-
configuration);
211+
configuration);
210212
for (SdkPlugin plugin : plugins) {
211213
plugin.configureClient(serviceConfigBuilder);
212214
}
@@ -215,7 +217,7 @@ private SdkClientConfiguration updateSdkClientConfiguration(SdkRequest request,
215217
}
216218

217219
private HttpResponseHandler<AwsServiceException> createErrorResponseHandler(BaseAwsJsonProtocolFactory protocolFactory,
218-
JsonOperationMetadata operationMetadata, Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper) {
220+
JsonOperationMetadata operationMetadata, Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper) {
219221
return protocolFactory.createErrorResponseHandler(operationMetadata, exceptionMetadataMapper);
220222
}
221223

Diff for: codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-query-compatible-json-sync-client-class.java

+26-24
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ final class DefaultQueryToJsonCompatibleClient implements QueryToJsonCompatibleC
5353
private static final Logger log = Logger.loggerFor(DefaultQueryToJsonCompatibleClient.class);
5454

5555
private static final AwsProtocolMetadata protocolMetadata = AwsProtocolMetadata.builder()
56-
.serviceProtocol(AwsServiceProtocol.AWS_JSON).build();
56+
.serviceProtocol(AwsServiceProtocol.AWS_JSON).build();
5757

5858
private final SyncClientHandler clientHandler;
5959

@@ -89,43 +89,45 @@ protected DefaultQueryToJsonCompatibleClient(SdkClientConfiguration clientConfig
8989
*/
9090
@Override
9191
public APostOperationResponse aPostOperation(APostOperationRequest aPostOperationRequest) throws InvalidInputException,
92-
AwsServiceException, SdkClientException, QueryToJsonCompatibleException {
92+
AwsServiceException, SdkClientException, QueryToJsonCompatibleException {
9393
JsonOperationMetadata operationMetadata = JsonOperationMetadata.builder().hasStreamingSuccessResponse(false)
94-
.isPayloadJson(true).build();
94+
.isPayloadJson(true).build();
9595

9696
HttpResponseHandler<APostOperationResponse> responseHandler = protocolFactory.createResponseHandler(operationMetadata,
97-
APostOperationResponse::builder);
97+
APostOperationResponse::builder);
9898
Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper = errorCode -> {
99+
if (errorCode == null) {
100+
return Optional.empty();
101+
}
99102
switch (errorCode) {
100-
case "InvalidInput":
101-
return Optional.of(ExceptionMetadata.builder().errorCode("InvalidInput").httpStatusCode(400)
102-
.exceptionBuilderSupplier(InvalidInputException::builder).build());
103-
default:
104-
return Optional.empty();
103+
case "InvalidInput":
104+
return Optional.of(ExceptionMetadata.builder().errorCode("InvalidInput").httpStatusCode(400)
105+
.exceptionBuilderSupplier(InvalidInputException::builder).build());
106+
default:
107+
return Optional.empty();
105108
}
106109
};
107-
108110
HttpResponseHandler<AwsServiceException> errorResponseHandler = createErrorResponseHandler(protocolFactory,
109-
operationMetadata, exceptionMetadataMapper);
111+
operationMetadata, exceptionMetadataMapper);
110112
SdkClientConfiguration clientConfiguration = updateSdkClientConfiguration(aPostOperationRequest, this.clientConfiguration);
111113
List<MetricPublisher> metricPublishers = resolveMetricPublishers(clientConfiguration, aPostOperationRequest
112-
.overrideConfiguration().orElse(null));
114+
.overrideConfiguration().orElse(null));
113115
MetricCollector apiCallMetricCollector = metricPublishers.isEmpty() ? NoOpMetricCollector.create() : MetricCollector
114-
.create("ApiCall");
116+
.create("ApiCall");
115117
try {
116118
apiCallMetricCollector.reportMetric(CoreMetric.SERVICE_ID, "QueryToJsonCompatibleService");
117119
apiCallMetricCollector.reportMetric(CoreMetric.OPERATION_NAME, "APostOperation");
118120
String hostPrefix = "{StringMember}-foo.";
119121
HostnameValidator.validateHostnameCompliant(aPostOperationRequest.stringMember(), "StringMember",
120-
"aPostOperationRequest");
122+
"aPostOperationRequest");
121123
String resolvedHostExpression = String.format("%s-foo.", aPostOperationRequest.stringMember());
122124

123125
return clientHandler.execute(new ClientExecutionParams<APostOperationRequest, APostOperationResponse>()
124-
.withOperationName("APostOperation").withProtocolMetadata(protocolMetadata)
125-
.withResponseHandler(responseHandler).withErrorResponseHandler(errorResponseHandler)
126-
.hostPrefixExpression(resolvedHostExpression).withRequestConfiguration(clientConfiguration)
127-
.withInput(aPostOperationRequest).withMetricCollector(apiCallMetricCollector)
128-
.withMarshaller(new APostOperationRequestMarshaller(protocolFactory)));
126+
.withOperationName("APostOperation").withProtocolMetadata(protocolMetadata)
127+
.withResponseHandler(responseHandler).withErrorResponseHandler(errorResponseHandler)
128+
.hostPrefixExpression(resolvedHostExpression).withRequestConfiguration(clientConfiguration)
129+
.withInput(aPostOperationRequest).withMetricCollector(apiCallMetricCollector)
130+
.withMarshaller(new APostOperationRequestMarshaller(protocolFactory)));
129131
} finally {
130132
metricPublishers.forEach(p -> p.publish(apiCallMetricCollector.collect()));
131133
}
@@ -137,7 +139,7 @@ public final String serviceName() {
137139
}
138140

139141
private static List<MetricPublisher> resolveMetricPublishers(SdkClientConfiguration clientConfiguration,
140-
RequestOverrideConfiguration requestOverrideConfiguration) {
142+
RequestOverrideConfiguration requestOverrideConfiguration) {
141143
List<MetricPublisher> publishers = null;
142144
if (requestOverrideConfiguration != null) {
143145
publishers = requestOverrideConfiguration.metricPublishers();
@@ -152,7 +154,7 @@ private static List<MetricPublisher> resolveMetricPublishers(SdkClientConfigurat
152154
}
153155

154156
private HttpResponseHandler<AwsServiceException> createErrorResponseHandler(BaseAwsJsonProtocolFactory protocolFactory,
155-
JsonOperationMetadata operationMetadata, Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper) {
157+
JsonOperationMetadata operationMetadata, Function<String, Optional<ExceptionMetadata>> exceptionMetadataMapper) {
156158
return protocolFactory.createErrorResponseHandler(operationMetadata, exceptionMetadataMapper);
157159
}
158160

@@ -186,7 +188,7 @@ private SdkClientConfiguration updateSdkClientConfiguration(SdkRequest request,
186188
return configuration.build();
187189
}
188190
QueryToJsonCompatibleServiceClientConfigurationBuilder serviceConfigBuilder = new QueryToJsonCompatibleServiceClientConfigurationBuilder(
189-
configuration);
191+
configuration);
190192
for (SdkPlugin plugin : plugins) {
191193
plugin.configureClient(serviceConfigBuilder);
192194
}
@@ -196,8 +198,8 @@ private SdkClientConfiguration updateSdkClientConfiguration(SdkRequest request,
196198

197199
private <T extends BaseAwsJsonProtocolFactory.Builder<T>> T init(T builder) {
198200
return builder.clientConfiguration(clientConfiguration)
199-
.defaultServiceExceptionSupplier(QueryToJsonCompatibleException::builder).protocol(AwsJsonProtocol.AWS_JSON)
200-
.protocolVersion("1.1").hasAwsQueryCompatible(true);
201+
.defaultServiceExceptionSupplier(QueryToJsonCompatibleException::builder).protocol(AwsJsonProtocol.AWS_JSON)
202+
.protocolVersion("1.1").hasAwsQueryCompatible(true);
201203
}
202204

203205
@Override

0 commit comments

Comments
 (0)