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,46 @@ 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+ System .out .println (httpResponseBody );
448+ Map <String , String > error400And500 = responseBody400And500 .getErrors ().get (0 );
441449 throw new ShipEngineException (
442450 error400And500 .get ("message" ),
443- responseBody400And500 .get ( "request_id" ). toString (),
451+ responseBody400And500 .getRequestId (),
444452 error400And500 .get ("error_source" ),
445453 error400And500 .get ("error_type" ),
446454 error400And500 .get ("error_code" )
447455 );
448456 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 ) :
457+ System .out .println (httpResponseBody );
458+ ErrorResponse responseBody404 = httpResponseBody .equals ("" ) ?
459+ new ErrorResponse () :
460+ apiResponseToErrorResponse (httpResponseBody );
461+ Map <String , String > error404 = responseBody404 .getErrors () != null ?
462+ responseBody404 .getErrors ().get (0 ) :
454463 Map .of ();
455464 throw new ShipEngineException (
456465 mapSizeIsNotZero (error404 ) ? error404 .get ("message" ) : "404 Error Occurred.." ,
457- responseBody404 .size () != 0 ? responseBody404 .get ( "request_id" ). toString () : "" ,
466+ responseBody404 .getRequestId () != null ? responseBody404 .getRequestId () : "" ,
458467 "shipengine" ,
459468 mapSizeIsNotZero (error404 ) ? error404 .get ("error_type" ) : "error" ,
460469 mapSizeIsNotZero (error404 ) ? error404 .get ("error_code" ) : "not_found"
461470 );
462471 case 429 :
463472 Optional <String > retryAfterHeader = responseHeaders .firstValue ("retry-after" );
464- Map < String , String > responseBody429 = apiResponseToMap (httpResponseBody );
473+ ErrorResponse responseBody429 = apiResponseToErrorResponse (httpResponseBody );
465474 if (retryAfterHeader .isPresent ()) {
466475 int retry = Integer .parseInt (retryAfterHeader .get ()) * 1000 ;
467476
468477 if (retry > config .getTimeout ()) {
469478 throw new ClientTimeoutException (
470- responseBody429 .get ( "request_id" ),
479+ responseBody429 .getRequestId ( ),
471480 "shipengine" ,
472481 config .getTimeout ()
473482 );
474483 } else {
475484 throw new RateLimitExceededException (
476- responseBody429 .get ( "request_id" ),
485+ responseBody429 .getRequestId ( ),
477486 "shipengine" ,
478487 retry
479488 );
0 commit comments