killbill-memoizeit

payment: make sure logging in DefaultPaymentApi looks-up

6/24/2016 10:08:58 PM

Details

diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
index 9f2d5b6..ace4fef 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
@@ -91,7 +91,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = paymentProcessor.createAuthorization(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                          SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -135,7 +137,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = pluginControlPaymentProcessor.createAuthorization(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                                       properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -172,7 +176,8 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             payment = paymentProcessor.createCapture(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
                                                                    SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
 
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -212,7 +217,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = pluginControlPaymentProcessor.createCapture(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
                                                                                 properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -251,7 +258,8 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             payment = paymentProcessor.createPurchase(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                     SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
 
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -301,7 +309,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
 
             payment = pluginControlPaymentProcessor.createPurchase(IS_API_PAYMENT, account, nonNulPaymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                                  properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -335,7 +345,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = paymentProcessor.createVoid(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey,
                                                                 SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -373,7 +385,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = pluginControlPaymentProcessor.createVoid(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey,
                                                                              properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -409,7 +423,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = paymentProcessor.createRefund(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
                                                                   SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -451,7 +467,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = pluginControlPaymentProcessor.createRefund(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
                                                                                properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -490,7 +508,8 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             payment = paymentProcessor.createCredit(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                   SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
 
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -533,7 +552,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = pluginControlPaymentProcessor.createCredit(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
                                                                                properties, paymentControlPluginNames, callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -608,7 +629,9 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = paymentProcessor.createChargeback(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, amount, currency, true,
                                                                       callContext, internalCallContext);
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -647,7 +670,8 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             payment = pluginControlPaymentProcessor.createChargeback(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey, amount, currency,
                                                                                    paymentControlPluginNames, callContext, internalCallContext);
 
-            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
+
             return payment;
         } finally {
             logExitAPICall(transactionType,
@@ -679,14 +703,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
             payment = paymentProcessor.createChargebackReversal(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, null, null, true, callContext, internalCallContext);
 
-            // See https://github.com/killbill/killbill/issues/552
-            paymentTransaction = Iterables.<PaymentTransaction>find(Lists.<PaymentTransaction>reverse(payment.getTransactions()),
-                                                                    new Predicate<PaymentTransaction>() {
-                                                                        @Override
-                                                                        public boolean apply(final PaymentTransaction input) {
-                                                                            return paymentTransactionExternalKey.equals(input.getExternalKey());
-                                                                        }
-                                                                    });
+            paymentTransaction = findPaymentTransaction(payment, paymentTransactionExternalKey);
 
             return payment;
         } finally {
@@ -826,6 +843,21 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         return paymentMethods;
     }
 
+    private PaymentTransaction findPaymentTransaction(final Payment payment, @Nullable final String paymentTransactionExternalKey) {
+        // By design, the payment transactions are already correctly sorted (by effective date asc)
+        if (paymentTransactionExternalKey == null) {
+            return Iterables.getLast(payment.getTransactions());
+        } else {
+            return Iterables.<PaymentTransaction>find(Lists.<PaymentTransaction>reverse(payment.getTransactions()),
+                                                      new Predicate<PaymentTransaction>() {
+                                                          @Override
+                                                          public boolean apply(final PaymentTransaction input) {
+                                                              return paymentTransactionExternalKey.equals(input.getExternalKey());
+                                                          }
+                                                      });
+        }
+    }
+
     private void logEnterAPICall(final String transactionType,
                                    final Account account,
                                    @Nullable final UUID paymentMethodId,
@@ -876,8 +908,6 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
                            paymentControlPluginNames);
     }
 
-
-
     private void logAPICallInternal(final String prefixMsg,
                                     final String transactionType,
                                     final Account account,