1818import com .fasterxml .jackson .core .JsonFactory ;
1919import java .util .List ;
2020import java .util .Map ;
21+ import java .util .Optional ;
2122import java .util .function .Supplier ;
2223import software .amazon .awssdk .annotations .SdkInternalApi ;
2324import software .amazon .awssdk .awscore .exception .AwsErrorDetails ;
@@ -49,11 +50,11 @@ public final class AwsJsonProtocolErrorUnmarshaller implements HttpResponseHandl
4950
5051 private AwsJsonProtocolErrorUnmarshaller (Builder builder ) {
5152 this .jsonProtocolUnmarshaller = builder .jsonProtocolUnmarshaller ;
52- this .exceptions = builder .exceptions ;
5353 this .errorCodeParser = builder .errorCodeParser ;
5454 this .errorMessageParser = builder .errorMessageParser ;
5555 this .jsonFactory = builder .jsonFactory ;
5656 this .defaultExceptionSupplier = builder .defaultExceptionSupplier ;
57+ this .exceptions = builder .exceptions ;
5758 }
5859
5960 @ Override
@@ -64,12 +65,14 @@ public AwsServiceException handle(SdkHttpFullResponse response, ExecutionAttribu
6465 private AwsServiceException unmarshall (SdkHttpFullResponse response , ExecutionAttributes executionAttributes ) {
6566 JsonContent jsonContent = JsonContent .createJsonContent (response , jsonFactory );
6667 String errorCode = errorCodeParser .parseErrorCode (response , jsonContent );
67- SdkPojo sdkPojo = exceptions .stream ()
68- .filter (e -> e .errorCode ().equals (errorCode ))
69- .map (ExceptionMetadata ::exceptionBuilderSupplier )
70- .findAny ()
71- .orElse (defaultExceptionSupplier )
72- .get ();
68+
69+ Optional <ExceptionMetadata > modeledExceptionMetadata = exceptions .stream ()
70+ .filter (e -> e .errorCode ().equals (errorCode ))
71+ .findAny ();
72+
73+ SdkPojo sdkPojo = modeledExceptionMetadata .map (ExceptionMetadata ::exceptionBuilderSupplier )
74+ .orElse (defaultExceptionSupplier )
75+ .get ();
7376
7477 AwsServiceException .Builder exception = ((AwsServiceException ) jsonProtocolUnmarshaller
7578 .unmarshall (sdkPojo , response , jsonContent .getJsonNode ())).toBuilder ();
@@ -78,22 +81,19 @@ private AwsServiceException unmarshall(SdkHttpFullResponse response, ExecutionAt
7881 errorCode , errorMessage ));
7982 // Status code and request id are sdk level fields
8083 exception .message (errorMessage );
81- exception .statusCode (statusCode (response , errorCode ));
84+ exception .statusCode (statusCode (response , modeledExceptionMetadata ));
8285 exception .requestId (getRequestIdFromHeaders (response .headers ()));
8386 return exception .build ();
8487 }
8588
86- private int statusCode (SdkHttpFullResponse response , String errorCode ) {
89+ private int statusCode (SdkHttpFullResponse response , Optional < ExceptionMetadata > modeledExceptionMetadata ) {
8790 if (response .statusCode () != 0 ) {
8891 return response .statusCode ();
8992 }
9093
91- return exceptions .stream ()
92- .filter (e -> e .errorCode ().equals (errorCode ))
93- .filter (e -> e .httpStatusCode () != null )
94- .map (ExceptionMetadata ::httpStatusCode )
95- .findAny ()
96- .orElse (500 );
94+ return modeledExceptionMetadata .filter (m -> m .httpStatusCode () != null )
95+ .map (ExceptionMetadata ::httpStatusCode )
96+ .orElse (500 );
9797 }
9898
9999 /**
0 commit comments