22
33import com .google .gson .Gson ;
44import com .google .gson .GsonBuilder ;
5+ import com .google .gson .reflect .TypeToken ;
56import com .shipengine .exception .ClientTimeoutException ;
67import com .shipengine .exception .RateLimitExceededException ;
78import com .shipengine .exception .ShipEngineException ;
9+ import com .shipengine .ErrorResponse ;
810
911import java .io .IOException ;
1012import java .io .InputStream ;
@@ -416,7 +418,12 @@ private String listToJson(List list) {
416418 private static Map apiResponseToMap (String apiResponse ) {
417419 return gson .fromJson (apiResponse , HashMap .class );
418420 }
419-
421+
422+ private static ErrorResponse apiResponseToErrorResponse (String apiResponse ) {
423+ TypeToken <ErrorResponse > mapType = new TypeToken <ErrorResponse >(){};
424+ return gson .fromJson (apiResponse , mapType .getType ());
425+ }
426+
420427 private static List <Map <String , String >> apiResponseToList (String apiResponse ) {
421428 List <Map <String , String >> newList = new ArrayList <>();
422429 List apiResponseAsList = gson .fromJson (apiResponse , List .class );
@@ -436,44 +443,44 @@ private void checkResponseForErrors(
436443 switch (statusCode ) {
437444 case 400 :
438445 case 500 :
439- Map < String , ArrayList < Map < String , String >>> responseBody400And500 = apiResponseToMap (httpResponseBody );
440- Map <String , String > error400And500 = responseBody400And500 .get ( "errors" ).get (0 );
446+ ErrorResponse responseBody400And500 = apiResponseToErrorResponse (httpResponseBody );
447+ Map <String , String > error400And500 = responseBody400And500 .getErrors ( ).get (0 );
441448 throw new ShipEngineException (
442449 error400And500 .get ("message" ),
443- responseBody400And500 .get ( "request_id" ). toString (),
450+ responseBody400And500 .getRequestId (),
444451 error400And500 .get ("error_source" ),
445452 error400And500 .get ("error_type" ),
446453 error400And500 .get ("error_code" )
447454 );
448455 case 404 :
449- Map < String , ArrayList < Map < String , String >>> responseBody404 = httpResponseBody .equals ("" ) ?
450- Map . of () :
451- apiResponseToMap (httpResponseBody );
452- Map <String , String > error404 = responseBody404 .containsKey ( "errors" ) ?
453- responseBody404 .get ( "errors" ).get (0 ) :
456+ ErrorResponse responseBody404 = httpResponseBody .equals ("" ) ?
457+ new ErrorResponse () :
458+ apiResponseToErrorResponse (httpResponseBody );
459+ Map <String , String > error404 = responseBody404 .getErrors () != null ?
460+ responseBody404 .getErrors ( ).get (0 ) :
454461 Map .of ();
455462 throw new ShipEngineException (
456463 mapSizeIsNotZero (error404 ) ? error404 .get ("message" ) : "404 Error Occurred.." ,
457- responseBody404 .size () != 0 ? responseBody404 .get ( "request_id" ). toString () : "" ,
464+ responseBody404 .getRequestId () != null ? responseBody404 .getRequestId () : "" ,
458465 "shipengine" ,
459466 mapSizeIsNotZero (error404 ) ? error404 .get ("error_type" ) : "error" ,
460467 mapSizeIsNotZero (error404 ) ? error404 .get ("error_code" ) : "not_found"
461468 );
462469 case 429 :
463470 Optional <String > retryAfterHeader = responseHeaders .firstValue ("retry-after" );
464- Map < String , String > responseBody429 = apiResponseToMap (httpResponseBody );
471+ ErrorResponse responseBody429 = apiResponseToErrorResponse (httpResponseBody );
465472 if (retryAfterHeader .isPresent ()) {
466473 int retry = Integer .parseInt (retryAfterHeader .get ()) * 1000 ;
467474
468475 if (retry > config .getTimeout ()) {
469476 throw new ClientTimeoutException (
470- responseBody429 .get ( "request_id" ),
477+ responseBody429 .getRequestId ( ),
471478 "shipengine" ,
472479 config .getTimeout ()
473480 );
474481 } else {
475482 throw new RateLimitExceededException (
476- responseBody429 .get ( "request_id" ),
483+ responseBody429 .getRequestId ( ),
477484 "shipengine" ,
478485 retry
479486 );
0 commit comments