From e43be716ae26e5ae11179dcb61a9a61b4333cace Mon Sep 17 00:00:00 2001 From: Wandji Collins Date: Tue, 15 Dec 2020 09:32:49 +0100 Subject: [PATCH] FINERACT-1157:UnsupportedOperationException at InteropServiceImpl --- .../service/InteropServiceImpl.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java index a2e367672..78351a6ef 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java @@ -97,11 +97,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.http.HttpStatus; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.HttpClientErrorException; @Service public class InteropServiceImpl implements InteropService { @@ -246,7 +248,7 @@ public class InteropServiceImpl implements InteropService { String subIdOrType) { InteropIdentifier identifier = findIdentifier(idType, idValue, subIdOrType); if (identifier == null) { - throw new UnsupportedOperationException( + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Account not found for identifier " + idType + "/" + idValue + (subIdOrType == null ? "" : ("/" + subIdOrType))); } @@ -279,7 +281,7 @@ public class InteropServiceImpl implements InteropService { String subIdOrType) { InteropIdentifier identifier = findIdentifier(idType, idValue, subIdOrType); if (identifier == null) { - throw new UnsupportedOperationException( + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Account not found for identifier " + idType + "/" + idValue + (subIdOrType == null ? "" : ("/" + subIdOrType))); } @@ -329,7 +331,7 @@ public class InteropServiceImpl implements InteropService { if (transactionType.isDebit()) { fee = savingsAccount.calculateWithdrawalFee(request.getAmount().getAmount()); if (MathUtil.isLessThan(savingsAccount.getWithdrawableBalance(), request.getAmount().getAmount().add(fee))) { - throw new UnsupportedOperationException("Not enough balance amount for requested amount plus fees!"); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Not enough balance amount for requested amount plus fees!"); } } else { fee = BigDecimal.ZERO; @@ -362,10 +364,10 @@ public class InteropServiceImpl implements InteropService { BigDecimal total = calculateTotalTransferAmount(request, savingsAccount); if (MathUtil.isLessThan(savingsAccount.getWithdrawableBalance(), total)) { - throw new UnsupportedOperationException("Not enough balance amount for requested amount plus fees!"); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Not enough balance amount for requested amount plus fees!"); } if (findTransaction(savingsAccount, transferCode, AMOUNT_HOLD.getValue()) != null) { - throw new UnsupportedOperationException("Transfer amount was already put on hold " + transferCode); + throw new HttpClientErrorException(HttpStatus.TOO_MANY_REQUESTS, "Transfer amount was already put on hold " + transferCode); } PaymentDetail paymentDetail = instance(findPaymentType(), savingsAccount.getExternalId(), null, getRoutingCode(), transferCode, @@ -398,7 +400,7 @@ public class InteropServiceImpl implements InteropService { String transferCode = request.getTransferCode(); if (findTransaction(savingsAccount, transferCode, (isDebit ? WITHDRAWAL : DEPOSIT).getValue()) != null) { - throw new UnsupportedOperationException("Transfer was already committed with code: " + transferCode); + throw new HttpClientErrorException(HttpStatus.TOO_MANY_REQUESTS, "Transfer was already committed with code: " + transferCode); } LocalDateTime transactionDateTime = DateUtils.getLocalDateTimeOfTenant(); @@ -409,16 +411,17 @@ public class InteropServiceImpl implements InteropService { if (isDebit) { SavingsAccountTransaction holdTransaction = findTransaction(savingsAccount, transferCode, AMOUNT_HOLD.getValue()); if (holdTransaction == null) { - throw new UnsupportedOperationException("Missing onhold transaction for transfer: " + transferCode); + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Missing onhold transaction for transfer: " + transferCode); } BigDecimal totalTransferAmount = calculateTotalTransferAmount(request, savingsAccount); if (holdTransaction.getAmount().compareTo(totalTransferAmount) != 0) { - throw new UnsupportedOperationException("Transfer request amount plus fees does not match with onhold amount!"); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, + "Transfer request amount plus fees does not match with onhold amount!"); } if (MathUtil.isLessThan(savingsAccount.getWithdrawableBalance().add(holdTransaction.getAmount()), totalTransferAmount)) { - throw new UnsupportedOperationException("Not enough balance amount!"); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Not enough balance amount!"); } if (holdTransaction.getReleaseIdOfHoldAmountTransaction() == null) { @@ -473,7 +476,8 @@ public class InteropServiceImpl implements InteropService { savingsAccountRepository.save(savingsAccount); } else { - throw new UnsupportedOperationException("No active onhold transaction exists with transferCode " + request.getTransferCode()); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, + "No active onhold transaction exists with transferCode " + request.getTransferCode()); } return InteropTransferResponseData.build(command.commandId(), request.getTransactionCode(), InteropActionState.ACCEPTED, @@ -494,7 +498,7 @@ public class InteropServiceImpl implements InteropService { return InteropKycResponseData.build(accountKyc); } catch (final EmptyResultDataAccessException e) { - throw new UnsupportedOperationException("Error in retrieving KYC information: " + e); + throw new HttpClientErrorException(HttpStatus.NO_CONTENT, "Error in retrieving KYC information: " + e); } } @@ -524,7 +528,7 @@ public class InteropServiceImpl implements InteropService { private Loan validateAndGetLoan(String accountId) { Loan loan = loanRepository.findNonClosedLoanByAccountNumber(accountId); if (loan == null) { - throw new UnsupportedOperationException("Loan not found for the given account No: " + accountId); + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Loan not found for the given account No: " + accountId); } return loan; } @@ -536,12 +540,12 @@ public class InteropServiceImpl implements InteropService { ApplicationCurrency requestCurrency = currencyRepository.findOneByCode(request.getAmount().getCurrency()); if (!savingsAccount.getCurrency().getCode().equals(requestCurrency.getCode())) { - throw new UnsupportedOperationException("Account and request has different currencies!"); + throw new HttpClientErrorException(HttpStatus.CONFLICT, "Account and request has different currencies!"); } SavingsAccountTransactionType transactionType = request.getTransactionRole().getTransactionType(); if (!savingsAccount.isTransactionAllowed(transactionType, request.getExpirationLocalDate())) { - throw new UnsupportedOperationException("Transaction not allowed on account!"); + throw new HttpClientErrorException(HttpStatus.NOT_ACCEPTABLE, "Transaction not allowed on account!"); } request.normalizeAmounts(savingsAccount.getCurrency());