diff --git a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java index e19a2db5..26ed50e1 100644 --- a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java +++ b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java @@ -2,6 +2,9 @@ import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; import com.braintreegateway.exceptions.ServerException; @@ -15,6 +18,8 @@ */ @Experimental("This class is experimental and may change in future releases.") public class CustomerRecommendationsPayload { + private static final Logger LOGGER = Logger.getLogger("Braintree"); + private final String sessionId; private final boolean isInPayPalNetwork; private final CustomerRecommendations recommendations; @@ -44,13 +49,8 @@ private static CustomerRecommendations extractRecommendations(Map paymentRecommendationList = paymentRecommendations.stream() - .map(recommendationObj -> { - Integer recommendedPriority = getValue(recommendationObj, "recommendedPriority"); - String paymentOptionString = getValue(recommendationObj, "paymentOption"); - RecommendedPaymentOption paymentOption = RecommendedPaymentOption - .valueOf(paymentOptionString); - return new PaymentRecommendation(paymentOption, recommendedPriority); - }) + .map(CustomerRecommendationsPayload::parsePaymentRecommendation) + .filter(Objects::nonNull) .collect(Collectors.toList()); return new CustomerRecommendations(paymentRecommendationList); @@ -59,6 +59,35 @@ private static CustomerRecommendations extractRecommendations(Map recommendationObj) { + if (recommendationObj == null || !recommendationObj.containsKey("paymentOption")) { + LOGGER.log(Level.WARNING, "Skipping payment recommendation with missing payment option"); + return null; + } + RecommendedPaymentOption paymentOption = parsePaymentOption(getValue(recommendationObj, "paymentOption")); + if (paymentOption == null) { + return null; + } + Integer recommendedPriority = recommendationObj.containsKey("recommendedPriority") + ? (Integer) recommendationObj.get("recommendedPriority") + : null; + return new PaymentRecommendation(paymentOption, recommendedPriority); + } + + private static RecommendedPaymentOption parsePaymentOption(String paymentOptionString) { + if (paymentOptionString == null || paymentOptionString.trim().isEmpty()) { + LOGGER.log(Level.WARNING, "Skipping payment recommendation with missing payment option"); + return null; + } + try { + return RecommendedPaymentOption.valueOf(paymentOptionString.trim()); + } catch (IllegalArgumentException e) { + LOGGER.log(Level.WARNING, + "Skipping unknown payment recommendation option: " + paymentOptionString); + return null; + } + } + private static T getValue(Map response, String key) { Map map = response; String[] keyParts = key.split("\\.");