From 57791b8f37c5cbfbfdc244d875caa15b87513985 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Thu, 9 May 2013 11:30:46 +0100 Subject: [PATCH] MIFOSX-339: use common search parameters for loans and journal entries retrieve all as it contains logic and api for dealing with limits. --- .../journalentry/api/DateParam.java | 3 - .../api/JournalEntriesApiResource.java | 12 ++-- .../JournalEntryReadPlatformService.java | 5 +- .../JournalEntryReadPlatformServiceImpl.java | 44 ++++++-------- .../ClientReadPlatformServiceImpl.java | 3 - .../group/service/SearchParameters.java | 60 +++++++++++++------ .../loanaccount/api/LoansApiResource.java | 7 ++- .../service/LoanReadPlatformService.java | 3 +- .../service/LoanReadPlatformServiceImpl.java | 36 +++++------ 9 files changed, 94 insertions(+), 79 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/DateParam.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/DateParam.java index c28eabce3..67ba484d9 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/DateParam.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/DateParam.java @@ -20,9 +20,6 @@ import org.apache.commons.lang.StringUtils; * Class for parsing dates sent as query parameters * * TODO: Vishwas Should move this class to a more generic package - * - * @author - * */ public class DateParam { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java index 150cf6757..96ba0e0e8 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java @@ -34,6 +34,7 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.group.service.SearchParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -80,8 +81,6 @@ public class JournalEntriesApiResource { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); - Page glJournalEntries = null; - Date fromDate = null; if (fromDateParam != null) { fromDate = fromDateParam.getDate(); @@ -90,11 +89,14 @@ public class JournalEntriesApiResource { if (toDateParam != null) { toDate = toDateParam.getDate(); } - glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(officeId, glAccountId, onlyManualEntries, fromDate, toDate, - offset, limit, orderBy, sortOrder, transactionId); + + final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder); + + Page glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(searchParameters, glAccountId, + onlyManualEntries, fromDate, toDate, transactionId); return this.apiJsonSerializerService.serialize(glJournalEntries); } - + @GET @Path("{journalEntryId}") @Consumes({ MediaType.APPLICATION_JSON }) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java index 54bb0d71b..3e85a11f1 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java @@ -9,12 +9,13 @@ import java.util.Date; import org.mifosplatform.accounting.journalentry.data.JournalEntryData; import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.portfolio.group.service.SearchParameters; public interface JournalEntryReadPlatformService { JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId); - Page retrieveAll(Long officeId, Long glAccountId, Boolean onlyManualEntries, Date fromDate, Date toDate, - Integer offset, Integer limit, String orderBy, String sortOrder, String transactionId); + Page retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate, + Date toDate, String transactionId); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java index 02f50f824..4995b8b5d 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java @@ -23,6 +23,7 @@ import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; +import org.mifosplatform.portfolio.group.service.SearchParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -33,7 +34,7 @@ import org.springframework.stereotype.Service; public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlatformService { private final JdbcTemplate jdbcTemplate; - + private final GLJournalEntryMapper journalEntryMapper = new GLJournalEntryMapper(); private final PaginationHelper paginationHelper = new PaginationHelper(); @@ -89,16 +90,15 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat final Boolean reversed = rs.getBoolean("reversed"); final String referenceNumber = rs.getString("referenceNumber"); - return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, - transactionDate, entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, - createdByUserName, comments, reversed, referenceNumber); + return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, transactionDate, + entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, createdByUserName, + comments, reversed, referenceNumber); } } @Override - public Page retrieveAll(final Long officeId, final Long glAccountId, final Boolean onlyManualEntries, - final Date fromDate, final Date toDate, final Integer offset, final Integer limit, final String orderBy, - final String sortOrder, final String transactionId) { + public Page retrieveAll(final SearchParameters searchParameters, final Long glAccountId, + final Boolean onlyManualEntries, final Date fromDate, final Date toDate, final String transactionId) { StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); @@ -113,9 +113,9 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat arrayPos = arrayPos + 1; } - if (officeId != null && officeId != 0) { + if (searchParameters.isOfficeIdPassed()) { sqlBuilder.append(" and journalEntry.office_id = ?"); - objectArray[arrayPos] = officeId; + objectArray[arrayPos] = searchParameters.getOfficeId(); arrayPos = arrayPos + 1; } @@ -156,26 +156,20 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat } } - if (StringUtils.isNotBlank(orderBy)) { - sqlBuilder.append(" order by ").append(orderBy); - if (StringUtils.isNotBlank(sortOrder)) { - sqlBuilder.append(' ').append(sortOrder); + if (searchParameters.isOrderByRequested()) { + sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()); + + if (searchParameters.isSortOrderProvided()) { + sqlBuilder.append(' ').append(searchParameters.getSortOrder()); } } - if (limit != null && limit > 0) { - Integer maxLimitAllowed = 200; - if (limit < maxLimitAllowed) { - maxLimitAllowed = limit; + if (searchParameters.isLimited()) { + sqlBuilder.append(" limit ").append(searchParameters.getLimit()); + if (searchParameters.isOffset()) { + sqlBuilder.append(" offset ").append(searchParameters.getOffset()); } - sqlBuilder.append(" limit ").append(maxLimitAllowed); - if (offset != null) { - sqlBuilder.append(" offset ").append(offset); - } - } else if (limit != null && limit == -1) { - ; - } else - sqlBuilder.append(" limit ").append(200); + } final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final String sqlCountRows = "SELECT FOUND_ROWS()"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java index 42efd7cf4..714f29a36 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java @@ -90,9 +90,6 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService sqlBuilder.append(" and (").append(extraCriteria).append(")"); } - // DONT order by default - just use database natural ordering so doesnt - // have to scan entire database table. - // sql += " order by c.display_name ASC, c.account_no ASC"; if (searchParameters.isOrderByRequested()) { sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java index 5ecfef19e..98bb243a5 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java @@ -30,20 +30,35 @@ public final class SearchParameters { final String displayName, final String firstname, final String lastname, final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { - Integer maxLimitAllowed = getCheckedLimit(200, limit); - + Integer maxLimitAllowed = getCheckedLimit(limit); + return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed, orderBy, sortOrder); } - - public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId, - final String name, final String hierarchy, final Integer offset, - final Integer limit, final String orderBy, final String sortOrder) { - Integer maxLimitAllowed = getCheckedLimit(200, limit); + public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId, final String name, + final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { - return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, - orderBy, sortOrder); + Integer maxLimitAllowed = getCheckedLimit(limit); + + return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy, + sortOrder); + } + + public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, + final String orderBy, final String sortOrder) { + + Integer maxLimitAllowed = getCheckedLimit(limit); + + return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder); + } + + public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy, + final String sortOrder) { + + Integer maxLimitAllowed = getCheckedLimit(limit); + + return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder); } private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, @@ -69,14 +84,25 @@ public final class SearchParameters { public boolean isSortOrderProvided() { return StringUtils.isNotBlank(this.sortOrder); } - - public static Integer getCheckedLimit(Integer maxLimitAllowed, Integer limit) { - if (limit != null && limit < maxLimitAllowed && limit > 0) { - return limit; - } else if (limit != null && limit == -1) { - return null; - } else - return maxLimitAllowed; + + public static Integer getCheckedLimit(final Integer limit) { + + final Integer maxLimitAllowed = 200; + // default to max limit first off + Integer checkedLimit = maxLimitAllowed; + + if (limit != null && limit > 0) { + checkedLimit = limit; + } else if (limit != null) { + // unlimited case: limit provided and 0 or less + checkedLimit = null; + } + + return checkedLimit; + } + + public boolean isOfficeIdPassed() { + return this.officeId != null && this.officeId != 0; } public String getSqlSearch() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java index 8b673a16f..7c6306194 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java @@ -54,6 +54,7 @@ import org.mifosplatform.portfolio.fund.data.FundData; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; +import org.mifosplatform.portfolio.group.service.SearchParameters; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; @@ -367,8 +368,10 @@ public class LoansApiResource { @QueryParam("sortOrder") final String sortOrder) { context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); - final Page loanBasicDetails = this.loanReadPlatformService.retrieveAll(sqlSearch, externalId, offset, limit, - orderBy, sortOrder); + + final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder); + + final Page loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters); return this.toApiJsonSerializer.serialize(loanBasicDetails); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java index 7325cb7c8..288665b90 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -9,6 +9,7 @@ import java.util.Collection; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.calendar.data.CalendarData; +import org.mifosplatform.portfolio.group.service.SearchParameters; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; import org.mifosplatform.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData; @@ -48,5 +49,5 @@ public interface LoanReadPlatformService { Collection retrieveCalendars(Long groupId); - Page retrieveAll(String sqlSearch, String externalId, Integer offset, Integer limit, String orderBy, String sortOrder); + Page retrieveAll(SearchParameters searchParameters); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 17b87be32..29f5b3d17 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -42,6 +42,7 @@ import org.mifosplatform.portfolio.fund.data.FundData; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; +import org.mifosplatform.portfolio.group.service.SearchParameters; import org.mifosplatform.portfolio.loanaccount.data.DisbursementData; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData; @@ -173,8 +174,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } @Override - public Page retrieveAll(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, - final String orderBy, final String sortOrder) { + public Page retrieveAll(final SearchParameters searchParameters) { StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); @@ -183,38 +183,32 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final Object[] objectArray = new Object[1]; int arrayPos = 0; - String sqlQueryCriteria = sqlSearch; + String sqlQueryCriteria = searchParameters.getSqlSearch(); if (StringUtils.isNotBlank(sqlQueryCriteria)) { sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no"); sqlBuilder.append(" where (").append(sqlQueryCriteria).append(")"); } - if (StringUtils.isNotBlank(externalId)) { + if (StringUtils.isNotBlank(searchParameters.getExternalId())) { sqlBuilder.append(" and l.external_id = ?"); - objectArray[arrayPos] = externalId; + objectArray[arrayPos] = searchParameters.getExternalId(); arrayPos = arrayPos + 1; } - if (StringUtils.isNotBlank(orderBy)) { - sqlBuilder.append(" order by ").append(orderBy); - if (StringUtils.isNotBlank(sortOrder)) { - sqlBuilder.append(' ').append(sortOrder); + if (searchParameters.isOrderByRequested()) { + sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()); + + if (searchParameters.isSortOrderProvided()) { + sqlBuilder.append(' ').append(searchParameters.getSortOrder()); } } - if (limit != null && limit > 0) { - Integer maxLimitAllowed = 200; - if (limit < maxLimitAllowed) { - maxLimitAllowed = limit; + if (searchParameters.isLimited()) { + sqlBuilder.append(" limit ").append(searchParameters.getLimit()); + if (searchParameters.isOffset()) { + sqlBuilder.append(" offset ").append(searchParameters.getOffset()); } - sqlBuilder.append(" limit ").append(maxLimitAllowed); - if (offset != null) { - sqlBuilder.append(" offset ").append(offset); - } - } else if (limit != null && limit == -1) { - ; - } else - sqlBuilder.append(" limit ").append(200); + } final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final String sqlCountRows = "SELECT FOUND_ROWS()";