From ac9ffc64d283b3a26c442f65fec4fe4a6d823edc Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Meyer Date: Fri, 31 Mar 2017 02:39:38 -0700 Subject: [PATCH] payment: limit number of queries when processing payments Use the new "return rehydrated object upon create or update" mechanism to avoid unnecessary get queries. Signed-off-by: Pierre-Alexandre Meyer --- .../payment/core/PaymentProcessor.java | 13 ++-- .../core/sm/PaymentAutomatonDAOHelper.java | 35 +++++----- .../core/sm/PaymentAutomatonRunner.java | 4 +- .../payment/core/sm/PaymentStateContext.java | 15 +++- .../payment/dao/DefaultPaymentDao.java | 69 ++++++++++++------- .../dao/PaymentAndTransactionModelDao.java | 40 +++++++++++ .../billing/payment/dao/PaymentDao.java | 12 ++-- .../billing/payment/dao/PaymentSqlDao.java | 15 ++-- .../payment/dao/TransactionSqlDao.java | 16 ++--- .../MockRetryAuthorizeOperationCallback.java | 2 +- .../billing/payment/dao/MockPaymentDao.java | 28 +++++--- .../payment/dao/TestDefaultPaymentDao.java | 8 +-- .../billing/payment/dao/TestPaymentDao.java | 4 +- 13 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 payment/src/main/java/org/killbill/billing/payment/dao/PaymentAndTransactionModelDao.java diff --git a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java index 4db7ea51dd..8cc235eabd 100644 --- a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java +++ b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java @@ -225,14 +225,15 @@ public Payment apply(final PaymentModelDao paymentModelDao) { public Payment getPayment(final UUID paymentId, final boolean withPluginInfo, final boolean withAttempts, final Iterable properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException { final PaymentModelDao paymentModelDao = paymentDao.getPayment(paymentId, internalTenantContext); - if (paymentModelDao == null) { - return null; - } - return toPayment(paymentModelDao, withPluginInfo, withAttempts, properties, tenantContext, internalTenantContext); + return getPayment(paymentModelDao, withPluginInfo, withAttempts, properties, tenantContext, internalTenantContext); } public Payment getPaymentByExternalKey(final String paymentExternalKey, final boolean withPluginInfo, final boolean withAttempts, final Iterable properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException { final PaymentModelDao paymentModelDao = paymentDao.getPaymentByExternalKey(paymentExternalKey, internalTenantContext); + return getPayment(paymentModelDao, withPluginInfo, withAttempts, properties, tenantContext, internalTenantContext); + } + + private Payment getPayment(final PaymentModelDao paymentModelDao, final boolean withPluginInfo, final boolean withAttempts, final Iterable properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException { if (paymentModelDao == null) { return null; } @@ -546,9 +547,9 @@ public boolean apply(final PaymentTransactionModelDao input) { currentStateName = paymentModelDao.getLastSuccessStateName(); } - final UUID nonNullPaymentId = paymentAutomatonRunner.run(paymentStateContext, daoHelper, currentStateName, transactionType); + paymentAutomatonRunner.run(paymentStateContext, daoHelper, currentStateName, transactionType); - return getPayment(nonNullPaymentId, true, false, properties, callContext, internalCallContext); + return getPayment(paymentStateContext.getPaymentModelDao(), true, false, properties, callContext, internalCallContext); } private void runSanityOnTransactionExternalKey(final Iterable allPaymentTransactionsForKey, diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonDAOHelper.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonDAOHelper.java index 5b11b15311..70c793a5bc 100644 --- a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonDAOHelper.java +++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonDAOHelper.java @@ -31,6 +31,7 @@ import org.killbill.billing.payment.api.TransactionStatus; import org.killbill.billing.payment.api.TransactionType; import org.killbill.billing.payment.core.PaymentPluginServiceRegistration; +import org.killbill.billing.payment.dao.PaymentAndTransactionModelDao; import org.killbill.billing.payment.dao.PaymentDao; import org.killbill.billing.payment.dao.PaymentMethodModelDao; import org.killbill.billing.payment.dao.PaymentModelDao; @@ -86,8 +87,8 @@ public void createNewPaymentTransaction() throws PaymentApiException { final PaymentTransactionModelDao newPaymentTransactionModelDao = buildNewPaymentTransactionModelDao(newPaymentModelDao.getId()); existingTransactions = ImmutableList.of(); - final PaymentModelDao paymentModelDao = paymentDao.insertPaymentWithFirstTransaction(newPaymentModelDao, newPaymentTransactionModelDao, internalCallContext); - paymentTransactionModelDao = paymentDao.getTransactionsForPayment(paymentModelDao.getId(), internalCallContext).get(0); + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = paymentDao.insertPaymentWithFirstTransaction(newPaymentModelDao, newPaymentTransactionModelDao, internalCallContext); + paymentTransactionModelDao = paymentAndTransactionModelDao.getPaymentTransactionModelDao(); } else { existingTransactions = paymentDao.getTransactionsForPayment(paymentStateContext.getPaymentId(), internalCallContext); @@ -131,22 +132,22 @@ public void processPaymentInfoPlugin(final TransactionStatus transactionStatus, final String gatewayErrorMsg = paymentInfoPlugin == null ? null : paymentInfoPlugin.getGatewayError(); final String lastSuccessPaymentState = paymentSMHelper.isSuccessState(currentPaymentStateName) ? currentPaymentStateName : null; - paymentDao.updatePaymentAndTransactionOnCompletion(paymentStateContext.getAccount().getId(), - paymentStateContext.getAttemptId(), - paymentStateContext.getPaymentId(), - paymentStateContext.getTransactionType(), - currentPaymentStateName, - lastSuccessPaymentState, - paymentStateContext.getPaymentTransactionModelDao().getId(), - transactionStatus, - processedAmount, - processedCurrency, - gatewayErrorCode, - gatewayErrorMsg, - internalCallContext); - + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = paymentDao.updatePaymentAndTransactionOnCompletion(paymentStateContext.getAccount().getId(), + paymentStateContext.getAttemptId(), + paymentStateContext.getPaymentId(), + paymentStateContext.getTransactionType(), + currentPaymentStateName, + lastSuccessPaymentState, + paymentStateContext.getPaymentTransactionModelDao().getId(), + transactionStatus, + processedAmount, + processedCurrency, + gatewayErrorCode, + gatewayErrorMsg, + internalCallContext); // Update the context - paymentStateContext.setPaymentTransactionModelDao(paymentDao.getPaymentTransaction(paymentStateContext.getPaymentTransactionModelDao().getId(), internalCallContext)); + paymentStateContext.setPaymentModelDao(paymentAndTransactionModelDao.getPaymentModelDao()); + paymentStateContext.setPaymentTransactionModelDao(paymentAndTransactionModelDao.getPaymentTransactionModelDao()); } public String getPaymentProviderPluginName(final boolean includeDeleted) throws PaymentApiException { diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonRunner.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonRunner.java index 331d317b34..6c2f77a218 100644 --- a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonRunner.java +++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentAutomatonRunner.java @@ -160,7 +160,7 @@ public PaymentAutomatonDAOHelper buildDaoHelper(final PaymentStateContext paymen return new PaymentAutomatonDAOHelper(paymentStateContext, utcNow, paymentDao, paymentPluginServiceRegistration, internalCallContext, eventBus, paymentSMHelper); } - public UUID run(final PaymentStateContext paymentStateContext, + public void run(final PaymentStateContext paymentStateContext, final PaymentAutomatonDAOHelper daoHelper, @Nullable final String currentStateNameOrNull, final TransactionType transactionType) throws PaymentApiException { @@ -214,8 +214,6 @@ public UUID run(final PaymentStateContext paymentStateContext, } runStateMachineOperation(currentStateName, transactionType, leavingStateCallback, operationCallback, enteringStateCallback, includeDeletedPaymentMethod, paymentStateContext, daoHelper); - - return paymentStateContext.getPaymentId(); } // diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentStateContext.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentStateContext.java index 632f15d4a0..c0d5709de7 100644 --- a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentStateContext.java +++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentStateContext.java @@ -1,6 +1,6 @@ /* - * Copyright 2014-2015 Groupon, Inc - * Copyright 2014-2015 The Billing Project, LLC + * Copyright 2014-2017 Groupon, Inc + * Copyright 2014-2017 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the @@ -29,6 +29,7 @@ import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.api.TransactionType; +import org.killbill.billing.payment.dao.PaymentModelDao; import org.killbill.billing.payment.dao.PaymentTransactionModelDao; import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin; import org.killbill.billing.util.callcontext.CallContext; @@ -38,7 +39,7 @@ public class PaymentStateContext { - + private PaymentModelDao paymentModelDao; // The following fields (paymentId, transactionId, amount, currency) may take their value from the paymentTransactionModelDao *when they are not already set* private PaymentTransactionModelDao paymentTransactionModelDao; // Initialized in CTOR or only set through paymentTransactionModelDao @@ -119,6 +120,14 @@ public void setPaymentMethodId(final UUID paymentMethodId) { this.paymentMethodId = paymentMethodId; } + public PaymentModelDao getPaymentModelDao() { + return paymentModelDao; + } + + public void setPaymentModelDao(final PaymentModelDao paymentModelDao) { + this.paymentModelDao = paymentModelDao; + } + public PaymentTransactionModelDao getPaymentTransactionModelDao() { return paymentTransactionModelDao; } diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java index 22e43e74a1..22baff9962 100644 --- a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java +++ b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java @@ -288,19 +288,22 @@ private List expandSearchFilterToStateNames(final String searchKey) { } @Override - public PaymentModelDao insertPaymentWithFirstTransaction(final PaymentModelDao payment, final PaymentTransactionModelDao paymentTransaction, final InternalCallContext context) { + public PaymentAndTransactionModelDao insertPaymentWithFirstTransaction(final PaymentModelDao payment, final PaymentTransactionModelDao paymentTransaction, final InternalCallContext context) { + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = new PaymentAndTransactionModelDao(); - return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper() { + return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper() { @Override - public PaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception { + public PaymentAndTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception { final PaymentSqlDao paymentSqlDao = entitySqlDaoWrapperFactory.become(PaymentSqlDao.class); final PaymentModelDao paymentModelDao = createAndRefresh(paymentSqlDao, payment, context); + paymentAndTransactionModelDao.setPaymentModelDao(paymentModelDao); final TransactionSqlDao transactionSqlDao = entitySqlDaoWrapperFactory.become(TransactionSqlDao.class); - createAndRefresh(transactionSqlDao, paymentTransaction, context); + final PaymentTransactionModelDao paymentTransactionModelDao = createAndRefresh(transactionSqlDao, paymentTransaction, context); + paymentAndTransactionModelDao.setPaymentTransactionModelDao(paymentTransactionModelDao); - return paymentModelDao; + return paymentAndTransactionModelDao; } }); } @@ -321,34 +324,50 @@ public PaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory } @Override - public void updatePaymentAndTransactionOnCompletion(final UUID accountId, @Nullable final UUID attemptId, final UUID paymentId, final TransactionType transactionType, - final String currentPaymentStateName, @Nullable final String lastPaymentSuccessStateName, - final UUID transactionId, final TransactionStatus transactionStatus, - final BigDecimal processedAmount, final Currency processedCurrency, - final String gatewayErrorCode, final String gatewayErrorMsg, - final InternalCallContext context) { - transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper() { + public PaymentAndTransactionModelDao updatePaymentAndTransactionOnCompletion(final UUID accountId, @Nullable final UUID attemptId, final UUID paymentId, final TransactionType transactionType, + final String currentPaymentStateName, @Nullable final String lastPaymentSuccessStateName, + final UUID transactionId, final TransactionStatus transactionStatus, + final BigDecimal processedAmount, final Currency processedCurrency, + final String gatewayErrorCode, final String gatewayErrorMsg, + final InternalCallContext context) { + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = new PaymentAndTransactionModelDao(); + + return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper() { @Override - public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception { + public PaymentAndTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception { final InternalCallContext contextWithUpdatedDate = contextWithUpdatedDate(context); + final TransactionSqlDao transactional = entitySqlDaoWrapperFactory.become(TransactionSqlDao.class); - final PaymentTransactionModelDao paymentTransactionModelDao = transactional.getById(transactionId.toString(), context); - transactional.updateTransactionStatus(transactionId.toString(), - attemptId == null ? (paymentTransactionModelDao.getAttemptId() == null ? null : paymentTransactionModelDao.getAttemptId().toString()) : attemptId.toString(), - processedAmount, - processedCurrency == null ? null : processedCurrency.toString(), - transactionStatus == null ? null : transactionStatus.toString(), - gatewayErrorCode, - gatewayErrorMsg, - contextWithUpdatedDate); + final String updatedAttemptId; + if (attemptId == null) { + final PaymentTransactionModelDao paymentTransactionModelDao = transactional.getById(transactionId.toString(), context); + updatedAttemptId = paymentTransactionModelDao.getAttemptId() == null ? null : paymentTransactionModelDao.getAttemptId().toString(); + } else { + updatedAttemptId = attemptId.toString(); + } + final PaymentTransactionModelDao paymentTransactionModelDao = (PaymentTransactionModelDao) transactional.updateTransactionStatus(transactionId.toString(), + updatedAttemptId, + processedAmount, + processedCurrency == null ? null : processedCurrency.toString(), + transactionStatus == null ? null : transactionStatus.toString(), + gatewayErrorCode, + gatewayErrorMsg, + contextWithUpdatedDate); + paymentAndTransactionModelDao.setPaymentTransactionModelDao(paymentTransactionModelDao); + + final PaymentSqlDao paymentSqlDao = entitySqlDaoWrapperFactory.become(PaymentSqlDao.class); + final PaymentModelDao paymentModelDao; if (lastPaymentSuccessStateName != null) { - entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updateLastSuccessPaymentStateName(paymentId.toString(), currentPaymentStateName, lastPaymentSuccessStateName, contextWithUpdatedDate); + paymentModelDao = (PaymentModelDao) paymentSqlDao.updateLastSuccessPaymentStateName(paymentId.toString(), currentPaymentStateName, lastPaymentSuccessStateName, contextWithUpdatedDate); } else { - entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentStateName(paymentId.toString(), currentPaymentStateName, contextWithUpdatedDate); + paymentModelDao = (PaymentModelDao) paymentSqlDao.updatePaymentStateName(paymentId.toString(), currentPaymentStateName, contextWithUpdatedDate); } + paymentAndTransactionModelDao.setPaymentModelDao(paymentModelDao); + postPaymentEventFromTransaction(accountId, transactionStatus, transactionType, paymentId, transactionId, processedAmount, processedCurrency, clock.getUTCNow(), gatewayErrorCode, entitySqlDaoWrapperFactory, context); - return null; + + return paymentAndTransactionModelDao; } }); } diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAndTransactionModelDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAndTransactionModelDao.java new file mode 100644 index 0000000000..96d698782a --- /dev/null +++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAndTransactionModelDao.java @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Groupon, Inc + * Copyright 2017 The Billing Project, LLC + * + * The Billing Project licenses this file to you under the Apache License, version 2.0 + * (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.killbill.billing.payment.dao; + +public class PaymentAndTransactionModelDao { + + private PaymentModelDao paymentModelDao; + private PaymentTransactionModelDao paymentTransactionModelDao; + + public PaymentModelDao getPaymentModelDao() { + return paymentModelDao; + } + + public void setPaymentModelDao(final PaymentModelDao paymentModelDao) { + this.paymentModelDao = paymentModelDao; + } + + public PaymentTransactionModelDao getPaymentTransactionModelDao() { + return paymentTransactionModelDao; + } + + public void setPaymentTransactionModelDao(final PaymentTransactionModelDao paymentTransactionModelDao) { + this.paymentTransactionModelDao = paymentTransactionModelDao; + } +} diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java index 2c46e15cfe..b7180e8770 100644 --- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java +++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java @@ -1,7 +1,9 @@ /* * Copyright 2010-2013 Ning, Inc. + * Copyright 2014-2017 Groupon, Inc + * Copyright 2014-2017 The Billing Project, LLC * - * Ning licenses this file to you under the Apache License, version 2.0 + * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * @@ -55,13 +57,13 @@ public interface PaymentDao extends EntityDao searchPayments(String searchKey, Long offset, Long limit, InternalTenantContext context); - public PaymentModelDao insertPaymentWithFirstTransaction(PaymentModelDao payment, PaymentTransactionModelDao paymentTransaction, InternalCallContext context); + public PaymentAndTransactionModelDao insertPaymentWithFirstTransaction(PaymentModelDao payment, PaymentTransactionModelDao paymentTransaction, InternalCallContext context); public PaymentTransactionModelDao updatePaymentWithNewTransaction(UUID paymentId, PaymentTransactionModelDao paymentTransaction, InternalCallContext context); - public void updatePaymentAndTransactionOnCompletion(UUID accountId, UUID attemptId, UUID paymentId, TransactionType transactionType, String currentPaymentStateName, String lastPaymentSuccessStateName, UUID transactionId, - TransactionStatus paymentStatus, BigDecimal processedAmount, Currency processedCurrency, - String gatewayErrorCode, String gatewayErrorMsg, InternalCallContext context); + public PaymentAndTransactionModelDao updatePaymentAndTransactionOnCompletion(UUID accountId, UUID attemptId, UUID paymentId, TransactionType transactionType, String currentPaymentStateName, String lastPaymentSuccessStateName, UUID transactionId, + TransactionStatus paymentStatus, BigDecimal processedAmount, Currency processedCurrency, + String gatewayErrorCode, String gatewayErrorMsg, InternalCallContext context); public PaymentModelDao getPayment(UUID paymentId, InternalTenantContext context); diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentSqlDao.java index 2be09a6145..ee8ad0f812 100644 --- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentSqlDao.java +++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentSqlDao.java @@ -45,17 +45,16 @@ void updatePaymentForNewTransaction(@Bind("id") final String paymentId, @SqlUpdate @Audited(ChangeType.UPDATE) - void updatePaymentStateName(@Bind("id") final String paymentId, - @Bind("stateName") final String stateName, - @BindBean final InternalCallContext context); - + Object updatePaymentStateName(@Bind("id") final String paymentId, + @Bind("stateName") final String stateName, + @BindBean final InternalCallContext context); @SqlUpdate @Audited(ChangeType.UPDATE) - void updateLastSuccessPaymentStateName(@Bind("id") final String paymentId, - @Bind("stateName") final String stateName, - @Bind("lastSuccessStateName") final String lastSuccessStateName, - @BindBean final InternalCallContext context); + Object updateLastSuccessPaymentStateName(@Bind("id") final String paymentId, + @Bind("stateName") final String stateName, + @Bind("lastSuccessStateName") final String lastSuccessStateName, + @BindBean final InternalCallContext context); @SqlQuery public PaymentModelDao getPaymentByExternalKey(@Bind("externalKey") final String externalKey, diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/TransactionSqlDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/TransactionSqlDao.java index 4f687aa58e..ba8b73969f 100644 --- a/payment/src/main/java/org/killbill/billing/payment/dao/TransactionSqlDao.java +++ b/payment/src/main/java/org/killbill/billing/payment/dao/TransactionSqlDao.java @@ -42,14 +42,14 @@ public interface TransactionSqlDao extends EntitySqlDao getPaymentTransactionsByExternalKey(@Bind("transactionExternalKey") final String transactionExternalKey, diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java index d6e79c8004..deee81e8e7 100644 --- a/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java +++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java @@ -87,7 +87,7 @@ protected Payment doCallSpecificOperationCallback() throws PaymentApiException { paymentStateContext.getCurrency(), "", ""); - final PaymentModelDao paymentModelDao = paymentDao.insertPaymentWithFirstTransaction(payment, transaction, paymentStateContext.getInternalCallContext()); + final PaymentModelDao paymentModelDao = paymentDao.insertPaymentWithFirstTransaction(payment, transaction, paymentStateContext.getInternalCallContext()).getPaymentModelDao(); final PaymentTransaction convertedTransaction = new DefaultPaymentTransaction(transaction.getId(), paymentStateContext.getAttemptId(), transaction.getTransactionExternalKey(), diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java index 12ce2be23a..f1679758a3 100644 --- a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java +++ b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java @@ -1,7 +1,7 @@ /* * Copyright 2010-2013 Ning, Inc. - * Copyright 2014-2016 Groupon, Inc - * Copyright 2014-2016 The Billing Project, LLC + * Copyright 2014-2017 Groupon, Inc + * Copyright 2014-2017 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the @@ -191,7 +191,8 @@ public Pagination searchPayments(final String searchKey, final } @Override - public PaymentModelDao insertPaymentWithFirstTransaction(final PaymentModelDao payment, final PaymentTransactionModelDao paymentTransaction, final InternalCallContext context) { + public PaymentAndTransactionModelDao insertPaymentWithFirstTransaction(final PaymentModelDao payment, final PaymentTransactionModelDao paymentTransaction, final InternalCallContext context) { + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = new PaymentAndTransactionModelDao(); payment.setTenantRecordId(context.getTenantRecordId()); paymentTransaction.setTenantRecordId(context.getTenantRecordId()); @@ -207,7 +208,11 @@ public PaymentModelDao insertPaymentWithFirstTransaction(final PaymentModelDao p mockNonEntityDao.addTenantRecordIdMapping(paymentTransaction.getId(), context); mockNonEntityDao.addAccountRecordIdMapping((paymentTransaction.getId()), context); } - return payment; + + paymentAndTransactionModelDao.setPaymentModelDao(payment); + paymentAndTransactionModelDao.setPaymentTransactionModelDao(paymentTransaction); + + return paymentAndTransactionModelDao; } @Override @@ -224,10 +229,12 @@ public PaymentTransactionModelDao updatePaymentWithNewTransaction(final UUID pay } @Override - public void updatePaymentAndTransactionOnCompletion(final UUID accountId, final UUID attemptId, final UUID paymentId, final TransactionType transactionType, - final String currentPaymentStateName, final String lastSuccessPaymentStateName, final UUID transactionId, - final TransactionStatus paymentStatus, final BigDecimal processedAmount, final Currency processedCurrency, - final String gatewayErrorCode, final String gatewayErrorMsg, final InternalCallContext context) { + public PaymentAndTransactionModelDao updatePaymentAndTransactionOnCompletion(final UUID accountId, final UUID attemptId, final UUID paymentId, final TransactionType transactionType, + final String currentPaymentStateName, final String lastSuccessPaymentStateName, final UUID transactionId, + final TransactionStatus paymentStatus, final BigDecimal processedAmount, final Currency processedCurrency, + final String gatewayErrorCode, final String gatewayErrorMsg, final InternalCallContext context) { + final PaymentAndTransactionModelDao paymentAndTransactionModelDao = new PaymentAndTransactionModelDao(); + synchronized (this) { final PaymentModelDao payment = payments.get(paymentId); if (payment != null) { @@ -242,6 +249,11 @@ public void updatePaymentAndTransactionOnCompletion(final UUID accountId, final transaction.setGatewayErrorCode(gatewayErrorCode); transaction.setGatewayErrorMsg(gatewayErrorMsg); } + + paymentAndTransactionModelDao.setPaymentModelDao(payment); + paymentAndTransactionModelDao.setPaymentTransactionModelDao(transaction); + + return paymentAndTransactionModelDao; } } diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java index 35d2c42e0a..0fa8999c97 100644 --- a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java +++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java @@ -1,6 +1,6 @@ /* - * Copyright 2014-2016 Groupon, Inc - * Copyright 2014-2016 The Billing Project, LLC + * Copyright 2014-2017 Groupon, Inc + * Copyright 2014-2017 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the @@ -50,7 +50,7 @@ private void testPaymentCRUDForAccount(final int runNb) throws Exception { final PaymentTransactionModelDao specifiedFirstPaymentTransactionModelDao = generatePaymentTransactionModelDao(specifiedFirstPaymentModelDao.getId()); // Create and verify the payment and transaction - final PaymentModelDao firstPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, internalCallContext); + final PaymentModelDao firstPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, internalCallContext).getPaymentModelDao(); verifyPayment(firstPaymentModelDao, specifiedFirstPaymentModelDao); verifyPaymentAndTransactions(internalCallContext, specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao); @@ -89,7 +89,7 @@ private void testPaymentCRUDForAccount(final int runNb) throws Exception { final PaymentModelDao paymentModelDao = generatePaymentModelDao(accountId); final PaymentTransactionModelDao paymentTransactionModelDao = generatePaymentTransactionModelDao(paymentModelDao.getId()); - final PaymentModelDao insertedPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, paymentTransactionModelDao, internalCallContext); + final PaymentModelDao insertedPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, paymentTransactionModelDao, internalCallContext).getPaymentModelDao(); verifyPayment(insertedPaymentModelDao, paymentModelDao); // Verify search APIs diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java index a23c0a0c76..113c147425 100644 --- a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java +++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java @@ -110,7 +110,7 @@ public void testPaymentAndTransactions() { TransactionStatus.SUCCESS, BigDecimal.TEN, Currency.AED, "success", ""); - final PaymentModelDao savedPayment = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, transactionModelDao, internalCallContext); + final PaymentModelDao savedPayment = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, transactionModelDao, internalCallContext).getPaymentModelDao(); assertEquals(savedPayment.getId(), paymentModelDao.getId()); assertEquals(savedPayment.getAccountId(), paymentModelDao.getAccountId()); assertEquals(savedPayment.getExternalKey(), paymentModelDao.getExternalKey()); @@ -312,7 +312,7 @@ public void testPendingTransactions() { TransactionStatus.PENDING, BigDecimal.TEN, Currency.AED, "pending", ""); - final PaymentModelDao payment = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, transaction1, internalCallContext); + final PaymentModelDao payment = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, transaction1, internalCallContext).getPaymentModelDao(); final PaymentTransactionModelDao transaction2 = new PaymentTransactionModelDao(initialTime, initialTime, null, transactionExternalKey2, paymentModelDao.getId(), TransactionType.AUTHORIZE, initialTime,