diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index 97cf62aea..e1e295ab4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -221,6 +221,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ rowSet = callFilteredPgSql(sql, valueFilter, filterColumnType); } else if (databaseTypeResolver.isMySQL()) { rowSet = callFilteredMysql(sql, valueFilter, filterColumnType); + } else { + throw new IllegalStateException("Database type is not supported"); } String[] resultColumnNames = resultColumns.split(","); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java index 74ff37f40..6ca5ac501 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java @@ -133,17 +133,9 @@ public class LoanCOBApiFilter extends OncePerRequestFilter { private Long getLoanId(boolean isGlim, Supplier> streamSupplier) { if (!isGlim) { - if (streamSupplier.get().count() >= LOAN_ID_INDEX_IN_URL + 1) { - return Long.valueOf(streamSupplier.get().skip(LOAN_ID_INDEX_IN_URL).findFirst().get()); - } else { - return null; - } + return streamSupplier.get().skip(LOAN_ID_INDEX_IN_URL).findFirst().map(Long::valueOf).orElse(null); } else { - if (streamSupplier.get().count() >= GLIM_ID_INDEX_IN_URL + 1) { - return Long.valueOf(streamSupplier.get().skip(GLIM_ID_INDEX_IN_URL).findFirst().get()); - } else { - return null; - } + return streamSupplier.get().skip(GLIM_ID_INDEX_IN_URL).findFirst().map(Long::valueOf).orElse(null); } } @@ -155,9 +147,6 @@ public class LoanCOBApiFilter extends OncePerRequestFilter { } private boolean isGlim(Supplier> streamSupplier) { - if (streamSupplier.get().count() >= GLIM_STRING_INDEX_IN_URL + 1) { - return "glimAccount".equals(streamSupplier.get().skip(GLIM_STRING_INDEX_IN_URL).findFirst().get()); - } - return false; + return streamSupplier.get().skip(GLIM_STRING_INDEX_IN_URL).findFirst().map(s -> s.equals("glimAccount")).orElse(false); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java index 550f5365a..84a6915b9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java @@ -198,7 +198,7 @@ public class FloatingRateDataValidator { baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).notNull(); if (isBaseLendingRate == null) { baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).trueOrFalseRequired(false); - } else if (isBaseLendingRate && baseLendingRate != null && !baseLendingRate.getId().equals(floatingRateForUpdate.getId())) { + } else if (isBaseLendingRate && baseLendingRate != null && !baseLendingRate.getId().equals(floatingRateForUpdate.getId())) { // NOSONAR baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).failWithCode("baselendingrate.duplicate", "Base Lending Rate already exists"); } @@ -220,7 +220,7 @@ public class FloatingRateDataValidator { isActive = floatingRateForUpdate.isActive(); } - if (baseLendingRate != null && baseLendingRate.getId().equals(floatingRateForUpdate.getId()) && (!isBaseLendingRate || !isActive)) { + if (baseLendingRate != null && baseLendingRate.getId().equals(floatingRateForUpdate.getId()) && (!isBaseLendingRate || !isActive)) { // NOSONAR isBLRModifiedAsNonBLR = true; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java index a99e8750a..d1fb1d42b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java @@ -294,8 +294,9 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo break; } } - - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(newChargeRefundTxn.getLoan())); + if (newChargeRefundTxn != null) { + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(newChargeRefundTxn.getLoan())); + } businessEventNotifierService.notifyPostBusinessEvent(new LoanChargeRefundBusinessEvent(newChargeRefundTxn)); return result; } @@ -1075,7 +1076,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo BigDecimal chargeAmountPaid; BigDecimal chargeAmountRefunded = BigDecimal.ZERO; MonetaryCurrency loanCurrency = loanCharge.getLoan().getCurrency(); - if (loanCharge.isInstalmentFee()) { + if (loanCharge.isInstalmentFee() && installmentChargeEntry != null) { final Integer installmentNumber = installmentChargeEntry.getRepaymentInstallment().getInstallmentNumber(); chargeAmountPaid = installmentChargeEntry.getAmountPaid(loanCurrency).getAmount(); for (LoanChargePaidBy loanChargePaidBy : loanCharge.getLoanChargePaidBySet()) { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImplTest.java index caa3ab3b4..34d88cd35 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImplTest.java @@ -99,4 +99,21 @@ public class ReadWriteNonCoreDataServiceImplTest { when(genericDataService.fillResultsetColumnHeaders("table")).thenReturn(Collections.emptyList()); assertThrows(PlatformApiDataValidationException.class, () -> underTest.queryDataTable("table", "cf1", "vf1", "rc1,rc2")); } + + @Test + public void testInvalidDatabase() { + SqlRowSet sqlRS = Mockito.mock(SqlRowSet.class); + when(jdbcTemplate.queryForRowSet(eq("select rc1,rc2 from table where cf1 = ?"), any(Object[].class), any(int[].class))) + .thenReturn(sqlRS); + when(sqlRS.next()).thenReturn(true).thenReturn(false); + when(sqlRS.getObject(ArgumentMatchers.anyString())).thenReturn("value1").thenReturn("value2"); + when(databaseTypeResolver.isPostgreSQL()).thenReturn(false); + when(databaseTypeResolver.isMySQL()).thenReturn(false); + ResultsetColumnHeaderData cf1 = ResultsetColumnHeaderData.detailed("cf1", "text", 10L, false, false, null, null); + ResultsetColumnHeaderData rc1 = ResultsetColumnHeaderData.detailed("rc1", "text", 10L, false, false, null, null); + ResultsetColumnHeaderData rc2 = ResultsetColumnHeaderData.detailed("rc2", "text", 10L, false, false, null, null); + when(genericDataService.fillResultsetColumnHeaders("table")).thenReturn(List.of(cf1, rc1, rc2)); + + assertThrows(IllegalStateException.class, () -> underTest.queryDataTable("table", "cf1", "vf1", "rc1,rc2")); + } }