From 71f21f05587815be803e618e069044e98619b8bc Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Sat, 12 May 2012 11:43:09 +1000 Subject: [PATCH] refactored reporting/export code out of core class into own --- .../ReadExtraDataAndReportingService.java | 4 + .../ReadExtraDataAndReportingServiceImpl.java | 228 +++++++++++- .../mifosng/platform/ReadPlatformService.java | 6 - .../platform/ReadPlatformServiceImpl.java | 348 ++++-------------- .../api/FlexibleReportingApiResource.java | 10 +- 5 files changed, 301 insertions(+), 295 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java index 4b68e3055..43ba96b01 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java @@ -7,6 +7,10 @@ import org.mifosng.data.reports.GenericResultset; public interface ReadExtraDataAndReportingService { + //@PreAuthorize(value = "hasAnyRole('REPORTING_SUPER_USER_ROLE')") + GenericResultset retrieveGenericResultset(String rptDB, String name, + String type, Map extractedQueryParams); + ExtraDatasets retrieveExtraDatasetNames(String datasetType); GenericResultset retrieveExtraData(String datasetType, String datasetName, diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java index 4f1da3f88..de3d5e641 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java @@ -2,6 +2,7 @@ package org.mifosng.platform; import java.sql.Connection; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; @@ -25,7 +26,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndReportingService { +public class ReadExtraDataAndReportingServiceImpl implements + ReadExtraDataAndReportingService { private final static Logger logger = LoggerFactory .getLogger(ReadExtraDataAndReportingServiceImpl.class); @@ -37,6 +39,200 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep this.dataSource = dataSource; } + @Override + public GenericResultset retrieveGenericResultset(final String rptDB, + final String name, final String type, + final Map queryParams) { + + if (name == null) { + logger.info("Report Name not Found"); + return null; + } + + long startTime = System.currentTimeMillis(); + logger.info("STARTING REPORT: " + name + " Type: " + type); + + // AppUser currentUser = extractAuthenticatedUser(); + // Collection permissions = + // currentUser.getAuthorities(); + /* + * AppUser currentUser = extractAuthenticatedUser(); Boolean validUser = + * verifyUserDetails(currentUser); + * + * if (!validUser) { return null; } + * + * String orgId = currentUser.getOrganisation().getId().toString(); put + * back in later + */ + String orgId = "1"; + + String sql; + try { + sql = getSQLtoRun(rptDB, name, type, orgId, queryParams); + } catch (SQLException e) { + logger.info(name + ": Failed in getSQLtoRun"); + throw new WebApplicationException(Response + .status(Status.BAD_REQUEST).entity(e.getMessage()).build()); + } + // logger.info(name + ": RUNNING SQL"); + + GenericResultset result = null; + try { + result = fillReportingGenericResultSet(sql); + } catch (SQLException e) { + logger.info("Error - SQL: " + sql); + throw new WebApplicationException(Response + .status(Status.BAD_REQUEST).entity(e.getMessage()).build()); + } + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING Report/Request Name: " + name + " - " + type + + " Elapsed Time: " + elapsed); + return result; + } + + private GenericResultset fillReportingGenericResultSet(final String sql) + throws SQLException { + + GenericResultset result = new GenericResultset(); + + Connection db_connection = dataSource.getConnection(); + Statement db_statement = db_connection.createStatement(); + ResultSet rs = db_statement.executeQuery(sql); + + ResultSetMetaData rsmd = rs.getMetaData(); + String columnName = null; + String columnValue = null; + List columnHeaders = new ArrayList(); + for (int i = 0; i < rsmd.getColumnCount(); i++) { + ResultsetColumnHeader rsch = new ResultsetColumnHeader(); + rsch.setColumnName(rsmd.getColumnName(i + 1)); + rsch.setColumnType(rsmd.getColumnTypeName(i + 1)); + columnHeaders.add(rsch); + } + result.setColumnHeaders(columnHeaders); + + List resultsetDataRows = new ArrayList(); + ResultsetDataRow resultsetDataRow; + while (rs.next()) { + resultsetDataRow = new ResultsetDataRow(); + List columnValues = new ArrayList(); + for (int i = 0; i < rsmd.getColumnCount(); i++) { + columnName = rsmd.getColumnName(i + 1); + columnValue = rs.getString(columnName); + columnValues.add(columnValue); + } + resultsetDataRow.setRow(columnValues); + resultsetDataRows.add(resultsetDataRow); + } + result.setData(resultsetDataRows); + + db_statement.close(); + db_statement = null; + db_connection.close(); + db_connection = null; + + return result; + + } + + private String getSQLtoRun(final String rptDB, final String name, + final String type, final String orgId, + final Map queryParams) throws SQLException { + String sql = null; + + if (type.equals("report")) { + sql = getReportSql(rptDB, name); + } else { + // todo - dont need to check for orgID if special parameter sql (but + // prob need to check restrictions + sql = getParameterSql(rptDB, name); + } + + sql = replace(sql, "${orgId}", orgId); + + Set keys = queryParams.keySet(); + for (String key : keys) { + String pValue = queryParams.get(key); + // logger.info("(" + key + " : " + pValue + ")"); + sql = replace(sql, key, pValue); + } + + // wrap sql to prevent JDBC sql errors and also prevent malicious sql + sql = "select x.* from (" + sql + ") x"; + + return sql; + + } + + // private Boolean verifyUserDetails(AppUser usr) { + // + // // some logs to be taken out after testing + // String idDetails = usr.getId() + ", " + usr.getLastname() + ", " + // + usr.getFirstname(); + // logger.info("Id: " + idDetails + " Organisation: " + // + usr.getOrganisation().getId() + " Office: " + // + usr.getOffice().getId() + " Role Names: " + // + usr.getRoleNames()); + // String otherDetails = "Head Officer User? " + usr.isHeadOfficeUser() + // + " Enabled: " + usr.isEnabled(); + // logger.info(otherDetails); + // if (usr.getAuthorities() != null) { + // // for (GrantedAuthority grantedAuthority : usr.getAuthorities()) { + // // logger.info("Granted Authority: " + + // // grantedAuthority.getAuthority()); + // // } + // } + // logger.info(""); + // + // // some checks + // if (usr.getOrganisation().getId() == null) { + // logger.info("Organisation ID not Found"); + // return false; + // } + // + // return true; + // } + + private String getReportSql(String rptDB, String reportName) + throws SQLException { + String sql = "select report_sql as the_sql from " + rptDB + + ".stretchy_report where report_name = '" + reportName + "'"; + // logger.info("Report SQL: " + sql); + + return getSql(sql); + } + + private String getParameterSql(String rptDB, String parameterName) + throws SQLException { + String sql = "select parameter_sql as the_sql from " + rptDB + + ".stretchy_parameter where parameter_name = '" + + parameterName + "'"; + // logger.info("Parameter SQL: " + sql); + + return getSql(sql); + } + + private String getSql(String inputSql) throws SQLException { + + Connection db_connection = dataSource.getConnection(); + Statement db_statement = db_connection.createStatement(); + ResultSet rs = db_statement.executeQuery(inputSql); + + String sql = null; + + while (rs.next()) { + sql = rs.getString("the_sql"); + } + + db_statement.close(); + db_statement = null; + db_connection.close(); + db_connection = null; + + return sql; + } + @Override public ExtraDatasets retrieveExtraDatasetNames(String type) { @@ -58,7 +254,10 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep ResultSet rs = db_statement.executeQuery(sql); while (rs.next()) { - extraDatasetRows.add(new ExtraDatasetRow(rs.getInt("id"), rs.getString("datasetName"), rs.getString("datasetType"))); + extraDatasetRows + .add(new ExtraDatasetRow(rs.getInt("id"), rs + .getString("datasetName"), rs + .getString("datasetType"))); } db_statement.close(); @@ -124,7 +323,7 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep + datasetType + "' order by f.id"; - //logger.info("specific: " + sql); + // logger.info("specific: " + sql); ResultSet rsmd = db_statement1.executeQuery(sql); List columnHeaders = new ArrayList(); @@ -142,14 +341,16 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep } else { selectFieldSeparator = ", "; } - selectFieldList += selectFieldSeparator + "`" + rsch.getColumnName() + "`"; + selectFieldList += selectFieldSeparator + "`" + + rsch.getColumnName() + "`"; rsch.setColumnType(rsmd.getString("data_type")); rsch.setColumnLength(rsmd.getInt("data_length")); rsch.setColumnDisplayType(rsmd.getString("display_type")); allowedListId = rsmd.getInt("allowed_list_id"); if (allowedListId != null) { - sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " + allowedListId + " order by id"; + sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " + + allowedListId + " order by id"; ResultSet rsValues = db_statement2.executeQuery(sql); while (rsValues.next()) { rsch.getColumnValues().add(rsValues.getString("name")); @@ -199,7 +400,7 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep return datasetType + "_extra_" + datasetName; } - static String replace(String str, String pattern, String replace) { + private static String replace(String str, String pattern, String replace) { int s = 0; int e = 0; StringBuffer result = new StringBuffer(); @@ -223,14 +424,13 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep logger.info("startjpw: "); Set keys = queryParams.keySet(); String pValue = ""; - for (String key : keys) { - pValue = queryParams.get(key); - logger.info("jpw: " + key + " - " + pValue); - } + for (String key : keys) { + pValue = queryParams.get(key); + logger.info("jpw: " + key + " - " + pValue); + } + + logger.info("endjpw: "); - logger.info("endjpw: "); - - String fullDatasetName = getFullDatasetName(datasetType, datasetName); String saveSql = getSaveSql(fullDatasetName, datasetPKValue, queryParams); @@ -323,7 +523,7 @@ public class ReadExtraDataAndReportingServiceImpl implements ReadExtraDataAndRep + insertColumns + ")" + " select " + datasetPKValue + " as id" + selectColumns; } - //logger.info("Save SQL: " + saveSql); + // logger.info("Save SQL: " + saveSql); return saveSql; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformService.java index 7231a9e1a..f6fdd92d6 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformService.java @@ -2,7 +2,6 @@ package org.mifosng.platform; import java.util.Collection; import java.util.List; -import java.util.Map; import org.mifosng.data.AppUserData; import org.mifosng.data.ClientData; @@ -16,7 +15,6 @@ import org.mifosng.data.NoteData; import org.mifosng.data.OrganisationReadModel; import org.mifosng.data.PermissionData; import org.mifosng.data.RoleData; -import org.mifosng.data.reports.GenericResultset; public interface ReadPlatformService { @@ -58,10 +56,6 @@ public interface ReadPlatformService { Collection retrieveAllPermissions(); - //@PreAuthorize(value = "hasAnyRole('REPORTING_SUPER_USER_ROLE')") - GenericResultset retrieveGenericResultset(String rptDB, String name, - String type, Map extractedQueryParams); - ClientData retrieveNewClientDetails(); Collection retrieveAllClientNotes(Long clientId); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformServiceImpl.java index 9bcae97be..5b57a3552 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadPlatformServiceImpl.java @@ -5,22 +5,15 @@ import static org.mifosng.platform.Specifications.loanTransactionsThatMatch; import static org.mifosng.platform.Specifications.loansThatMatch; import static org.mifosng.platform.Specifications.usersThatMatch; -import java.sql.Connection; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Set; import javax.sql.DataSource; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; @@ -41,9 +34,6 @@ import org.mifosng.data.OfficeData; import org.mifosng.data.OrganisationReadModel; import org.mifosng.data.PermissionData; import org.mifosng.data.RoleData; -import org.mifosng.data.reports.GenericResultset; -import org.mifosng.data.reports.ResultsetColumnHeader; -import org.mifosng.data.reports.ResultsetDataRow; import org.mifosng.platform.client.domain.Client; import org.mifosng.platform.client.domain.ClientRepository; import org.mifosng.platform.currency.domain.ApplicationCurrency; @@ -62,8 +52,6 @@ import org.mifosng.platform.user.domain.AppUserRepository; import org.mifosng.platform.user.domain.PermissionGroup; import org.mifosng.platform.user.domain.Role; import org.mifosng.platform.user.domain.RoleRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.RowMapper; @@ -76,22 +64,19 @@ import org.springframework.stereotype.Service; @Service public class ReadPlatformServiceImpl implements ReadPlatformService { - private final static Logger logger = LoggerFactory - .getLogger(ReadPlatformServiceImpl.class); - private final SimpleJdbcTemplate jdbcTemplate; private final ClientRepository clientRepository; private final LoanRepository loanRepository; private final LoanTransactionRepository loanTransactionRepository; private final ApplicationCurrencyRepository applicationCurrencyRepository; - private final DataSource dataSource; private final AppUserRepository appUserRepository; private final RoleRepository roleRepository; private final LoanProductReadPlatformService loanProductReadPlatformService; @Autowired - public ReadPlatformServiceImpl(final LoanProductReadPlatformService loanProductReadPlatformService, + public ReadPlatformServiceImpl( + final LoanProductReadPlatformService loanProductReadPlatformService, final DataSource dataSource, final ClientRepository clientRepository, final LoanRepository loanRepository, @@ -107,7 +92,6 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { this.jdbcTemplate = new SimpleJdbcTemplate(dataSource); this.clientRepository = clientRepository; this.loanRepository = loanRepository; - this.dataSource = dataSource; } private AppUser extractAuthenticatedUser() { @@ -157,23 +141,25 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { public Collection retrieveAllIndividualClients() { AppUser currentUser = extractAuthenticatedUser(); - + List offices = retrieveOffices(); String officeIdsList = generateOfficeIdInClause(offices); - ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation()); + ClientMapper rm = new ClientMapper(offices, + currentUser.getOrganisation()); - String sql = "select " - + rm.clientSchema() - + " where c.org_id = ? and c.office_id in (" + officeIdsList + ") order by c.lastname ASC, c.firstname ASC"; + String sql = "select " + rm.clientSchema() + + " where c.org_id = ? and c.office_id in (" + officeIdsList + + ") order by c.lastname ASC, c.firstname ASC"; - return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser.getOrganisation().getId()}); + return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser + .getOrganisation().getId() }); } private String generateOfficeIdInClause(List offices) { String officeIdsList = ""; - for (int i=0; i < offices.size(); i++) { + for (int i = 0; i < offices.size(); i++) { Long id = offices.get(i).getId(); - if (i==0) { + if (i == 0) { officeIdsList = id.toString(); } else { officeIdsList += "," + id.toString(); @@ -199,7 +185,9 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { new Object[] { currentUser.getOrganisation().getId(), clientId, noteId }); } catch (EmptyResultDataAccessException e) { - throw new PlatformResourceNotFoundException("error.msg.client.id.invalid", "Client with identifier {0} does not exist", clientId); + throw new PlatformResourceNotFoundException( + "error.msg.client.id.invalid", + "Client with identifier {0} does not exist", clientId); } } @@ -278,7 +266,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { private final List offices; private final Organisation organisation; - public ClientMapper(final List offices, Organisation organisation) { + public ClientMapper(final List offices, + Organisation organisation) { this.offices = offices; this.organisation = organisation; } @@ -303,13 +292,14 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { LocalDate joinedDate = new LocalDate(rs.getDate("joinedDate")); String officeName = fromOfficeList(this.offices, officeId); - + String orgname = ""; if (organisation.getId().equals(orgId)) { orgname = organisation.getName(); } - return new ClientData(orgId, orgname, officeId, officeName, id, firstname, lastname, externalId, joinedDate); + return new ClientData(orgId, orgname, officeId, officeName, id, + firstname, lastname, externalId, joinedDate); } private String fromOfficeList(final List officeList, @@ -328,14 +318,17 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { private List retrieveOffices() { AppUser currentUser = extractAuthenticatedUser(); - + String hierarchy = currentUser.getOffice().getHierarchy(); String hierarchySearchString = hierarchy + "%"; - - OfficeMapper rm = new OfficeMapper(); - String sql = "select " + rm.officeSchema() + "where o.org_id = ? and o.hierarchy like ? order by o.hierarchy"; - return this.jdbcTemplate.query(sql, rm, new Object[] {currentUser.getOrganisation().getId(), hierarchySearchString}); + OfficeMapper rm = new OfficeMapper(); + String sql = "select " + + rm.officeSchema() + + "where o.org_id = ? and o.hierarchy like ? order by o.hierarchy"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { + currentUser.getOrganisation().getId(), hierarchySearchString }); } protected static final class OfficeMapper implements RowMapper { @@ -357,7 +350,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { Long parentId = rs.getLong("parentId"); String parentName = rs.getString("parentName"); - return new OfficeData(id, name, externalId, openingDate, hierarchy, parentId, parentName); + return new OfficeData(id, name, externalId, openingDate, hierarchy, + parentId, parentName); } } @@ -368,7 +362,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { AppUser currentUser = extractAuthenticatedUser(); List offices = retrieveOffices(); - ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation()); + ClientMapper rm = new ClientMapper(offices, + currentUser.getOrganisation()); String sql = "select " + rm.clientSchema() + " where c.id = ? and c.org_id = ?"; @@ -376,7 +371,9 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { clientId, currentUser.getOrganisation().getId() }); } catch (EmptyResultDataAccessException e) { - throw new PlatformResourceNotFoundException("error.msg.client.id.invalid", "Client with identifier {0} does not exist", clientId); + throw new PlatformResourceNotFoundException( + "error.msg.client.id.invalid", + "Client with identifier {0} does not exist", clientId); } } @@ -522,8 +519,9 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { } @Override - public NewLoanWorkflowStepOneData retrieveClientAndProductDetails(final Long clientId, final Long productId) { - + public NewLoanWorkflowStepOneData retrieveClientAndProductDetails( + final Long clientId, final Long productId) { + AppUser currentUser = extractAuthenticatedUser(); NewLoanWorkflowStepOneData workflowData = new NewLoanWorkflowStepOneData(); @@ -531,19 +529,23 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { workflowData.setOrganisationName(currentUser.getOrganisation() .getName()); - Collection loanProducts = this.loanProductReadPlatformService.retrieveAllLoanProducts(); + Collection loanProducts = this.loanProductReadPlatformService + .retrieveAllLoanProducts(); workflowData.setAllowedProducts(new ArrayList( loanProducts)); if (loanProducts.size() == 1) { - LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(workflowData.getAllowedProducts().get(0).getId()); - + LoanProductData selectedProduct = this.loanProductReadPlatformService + .retrieveLoanProduct(workflowData.getAllowedProducts() + .get(0).getId()); + workflowData.setProductId(selectedProduct.getId()); workflowData.setProductName(selectedProduct.getName()); workflowData.setSelectedProduct(selectedProduct); } else { - LoanProductData selectedProduct = findLoanProductById(loanProducts, productId); - + LoanProductData selectedProduct = findLoanProductById(loanProducts, + productId); + workflowData.setProductId(selectedProduct.getId()); workflowData.setProductName(selectedProduct.getName()); workflowData.setSelectedProduct(selectedProduct); @@ -555,12 +557,15 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { return workflowData; } - - private LoanProductData findLoanProductById(Collection loanProducts, Long productId) { - LoanProductData match = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); + + private LoanProductData findLoanProductById( + Collection loanProducts, Long productId) { + LoanProductData match = this.loanProductReadPlatformService + .retrieveNewLoanProductDetails(); for (LoanProductData loanProductData : loanProducts) { if (loanProductData.getId().equals(productId)) { - match = this.loanProductReadPlatformService.retrieveLoanProduct(loanProductData.getId()); + match = this.loanProductReadPlatformService + .retrieveLoanProduct(loanProductData.getId()); break; } } @@ -590,7 +595,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { return loanData; } - private LoanAccountData convertToData(final Loan realLoan, CurrencyData currencyData) { + private LoanAccountData convertToData(final Loan realLoan, + CurrencyData currencyData) { DerivedLoanData loanData = realLoan.deriveLoanData(currencyData); @@ -602,13 +608,16 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { Money loanPrincipal = realLoan.getLoanRepaymentScheduleDetail() .getPrincipal(); - MoneyData principal = MoneyData.of(currencyData, loanPrincipal.getAmount()); + MoneyData principal = MoneyData.of(currencyData, + loanPrincipal.getAmount()); Money loanArrearsTolerance = realLoan.getInArrearsTolerance(); - MoneyData tolerance = MoneyData.of(currencyData, loanArrearsTolerance.getAmount()); + MoneyData tolerance = MoneyData.of(currencyData, + loanArrearsTolerance.getAmount()); Money interestRebate = realLoan.getInterestRebateOwed(); - MoneyData interestRebateOwed = MoneyData.of(currencyData, interestRebate.getAmount()); + MoneyData interestRebateOwed = MoneyData.of(currencyData, + interestRebate.getAmount()); boolean interestRebateOutstanding = false; // realLoan.isInterestRebateOutstanding(), @@ -642,10 +651,14 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { realLoan.getLoanProduct().getName(), realLoan.getClosedOnDate(), realLoan.getSubmittedOnDate(), realLoan.getApprovedOnDate(), expectedDisbursementDate, - realLoan.getDisbursedOnDate(), realLoan.getExpectedMaturityDate(), realLoan.getExpectedFirstRepaymentOnDate(), realLoan.getInterestCalculatedFromDate(), - principal, - realLoan.getLoanRepaymentScheduleDetail().getAnnualNominalInterestRate(), - realLoan.getLoanRepaymentScheduleDetail().getNominalInterestRatePerPeriod(), realLoan + realLoan.getDisbursedOnDate(), + realLoan.getExpectedMaturityDate(), + realLoan.getExpectedFirstRepaymentOnDate(), + realLoan.getInterestCalculatedFromDate(), principal, realLoan + .getLoanRepaymentScheduleDetail() + .getAnnualNominalInterestRate(), realLoan + .getLoanRepaymentScheduleDetail() + .getNominalInterestRatePerPeriod(), realLoan .getLoanRepaymentScheduleDetail() .getInterestPeriodFrequencyType().getValue(), realLoan .getLoanRepaymentScheduleDetail() @@ -707,7 +720,7 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { nameCode); } } - + @Override public Collection retrieveAllUsers() { @@ -717,7 +730,9 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { String officeIdsList = generateOfficeIdInClause(offices); AppUserMapper mapper = new AppUserMapper(offices); - String sql = "select " + mapper.schema() + " where u.org_id = ? and u.office_id in (" + officeIdsList + ")"; + String sql = "select " + mapper.schema() + + " where u.org_id = ? and u.office_id in (" + officeIdsList + + ")"; return this.jdbcTemplate.query(sql, mapper, new Object[] { currentUser .getOrganisation().getId() }); @@ -728,7 +743,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { List offices = retrieveOffices(); - List availableRoles = new ArrayList(retrieveAllRoles()); + List availableRoles = new ArrayList( + retrieveAllRoles()); AppUserData userData = new AppUserData(); userData.setAllowedOffices(offices); @@ -778,7 +794,8 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { List offices = retrieveOffices(); - List availableRoles = new ArrayList(retrieveAllRoles()); + List availableRoles = new ArrayList( + retrieveAllRoles()); AppUser user = this.appUserRepository.findOne(usersThatMatch( currentUser.getOrganisation(), currentUser.getId())); @@ -959,213 +976,4 @@ public class ReadPlatformServiceImpl implements ReadPlatformService { } } - @Override - public GenericResultset retrieveGenericResultset(final String rptDB, - final String name, final String type, - final Map queryParams) { - - if (name == null) { - logger.info("Report Name not Found"); - return null; - } - - long startTime = System.currentTimeMillis(); - logger.info("STARTING REPORT: " + name + " Type: " + type); - -// AppUser currentUser = extractAuthenticatedUser(); -// Collection permissions = currentUser.getAuthorities(); - /* - * AppUser currentUser = extractAuthenticatedUser(); Boolean validUser = - * verifyUserDetails(currentUser); - * - * if (!validUser) { return null; } - * - * String orgId = currentUser.getOrganisation().getId().toString(); put - * back in later - */ - String orgId = "1"; - - String sql; - try { - sql = getSQLtoRun(rptDB, name, type, orgId, queryParams); - } catch (SQLException e) { - logger.info(name + ": Failed in getSQLtoRun"); - throw new WebApplicationException(Response - .status(Status.BAD_REQUEST).entity(e.getMessage()).build()); - } - //logger.info(name + ": RUNNING SQL"); - - GenericResultset result = null; - try { - result = fillReportingGenericResultSet(sql); - } catch (SQLException e) { - logger.info("Error - SQL: " + sql); - throw new WebApplicationException(Response - .status(Status.BAD_REQUEST).entity(e.getMessage()).build()); - } - - long elapsed = System.currentTimeMillis() - startTime; - logger.info("FINISHING Report/Request Name: " + name + " - " + type - + " Elapsed Time: " + elapsed); - return result; - } - - - private GenericResultset fillReportingGenericResultSet(final String sql) - throws SQLException { - - GenericResultset result = new GenericResultset(); - - Connection db_connection = dataSource.getConnection(); - Statement db_statement = db_connection.createStatement(); - ResultSet rs = db_statement.executeQuery(sql); - - ResultSetMetaData rsmd = rs.getMetaData(); - String columnName = null; - String columnValue = null; - List columnHeaders = new ArrayList(); - for (int i = 0; i < rsmd.getColumnCount(); i++) { - ResultsetColumnHeader rsch = new ResultsetColumnHeader(); - rsch.setColumnName(rsmd.getColumnName(i + 1)); - rsch.setColumnType(rsmd.getColumnTypeName(i + 1)); - columnHeaders.add(rsch); - } - result.setColumnHeaders(columnHeaders); - - List resultsetDataRows = new ArrayList(); - ResultsetDataRow resultsetDataRow; - while (rs.next()) { - resultsetDataRow = new ResultsetDataRow(); - List columnValues = new ArrayList(); - for (int i = 0; i < rsmd.getColumnCount(); i++) { - columnName = rsmd.getColumnName(i + 1); - columnValue = rs.getString(columnName); - columnValues.add(columnValue); - } - resultsetDataRow.setRow(columnValues); - resultsetDataRows.add(resultsetDataRow); - } - result.setData(resultsetDataRows); - - db_statement.close(); - db_statement = null; - db_connection.close(); - db_connection = null; - - return result; - - } - - private String getSQLtoRun(final String rptDB, final String name, - final String type, final String orgId, - final Map queryParams) throws SQLException { - String sql = null; - - if (type.equals("report")) { - sql = getReportSql(rptDB, name); - } else { - // todo - dont need to check for orgID if special parameter sql (but - // prob need to check restrictions - sql = getParameterSql(rptDB, name); - } - - sql = replace(sql, "${orgId}", orgId); - - Set keys = queryParams.keySet(); - for (String key : keys) { - String pValue = queryParams.get(key); - // logger.info("(" + key + " : " + pValue + ")"); - sql = replace(sql, key, pValue); - } - - // wrap sql to prevent JDBC sql errors and also prevent malicious sql - sql = "select x.* from (" + sql + ") x"; - - return sql; - - } - -// private Boolean verifyUserDetails(AppUser usr) { -// -// // some logs to be taken out after testing -// String idDetails = usr.getId() + ", " + usr.getLastname() + ", " -// + usr.getFirstname(); -// logger.info("Id: " + idDetails + " Organisation: " -// + usr.getOrganisation().getId() + " Office: " -// + usr.getOffice().getId() + " Role Names: " -// + usr.getRoleNames()); -// String otherDetails = "Head Officer User? " + usr.isHeadOfficeUser() -// + " Enabled: " + usr.isEnabled(); -// logger.info(otherDetails); -// if (usr.getAuthorities() != null) { -//// for (GrantedAuthority grantedAuthority : usr.getAuthorities()) { -// // logger.info("Granted Authority: " + -// // grantedAuthority.getAuthority()); -//// } -// } -// logger.info(""); -// -// // some checks -// if (usr.getOrganisation().getId() == null) { -// logger.info("Organisation ID not Found"); -// return false; -// } -// -// return true; -// } - - private String getReportSql(String rptDB, String reportName) - throws SQLException { - String sql = "select report_sql as the_sql from " + rptDB - + ".stretchy_report where report_name = '" + reportName + "'"; - // logger.info("Report SQL: " + sql); - - return getSql(sql); - } - - private String getParameterSql(String rptDB, String parameterName) - throws SQLException { - String sql = "select parameter_sql as the_sql from " + rptDB - + ".stretchy_parameter where parameter_name = '" - + parameterName + "'"; - // logger.info("Parameter SQL: " + sql); - - return getSql(sql); - } - - private String getSql(String inputSql) throws SQLException { - - Connection db_connection = dataSource.getConnection(); - Statement db_statement = db_connection.createStatement(); - ResultSet rs = db_statement.executeQuery(inputSql); - - String sql = null; - - while (rs.next()) { - sql = rs.getString("the_sql"); - } - - db_statement.close(); - db_statement = null; - db_connection.close(); - db_connection = null; - - return sql; - } - - static String replace(String str, String pattern, String replace) { - int s = 0; - int e = 0; - StringBuffer result = new StringBuffer(); - - while ((e = str.indexOf(pattern, s)) >= 0) { - result.append(str.substring(s, e)); - result.append(replace); - s = e + pattern.length(); - } - result.append(str.substring(s)); - return result.toString(); - } - - } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/FlexibleReportingApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/FlexibleReportingApiResource.java index 78639cb0f..73253272d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/FlexibleReportingApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/FlexibleReportingApiResource.java @@ -26,10 +26,10 @@ import javax.ws.rs.core.UriInfo; import org.mifosng.data.ErrorResponse; import org.mifosng.data.ErrorResponseList; import org.mifosng.data.reports.GenericResultset; -import org.mifosng.platform.ReadPlatformService; +import org.mifosng.platform.ReadExtraDataAndReportingService; import org.mifosng.platform.exceptions.ApplicationDomainRuleException; -import org.mifosng.platform.exceptions.UnAuthenticatedUserException; import org.mifosng.platform.exceptions.NewDataValidationException; +import org.mifosng.platform.exceptions.UnAuthenticatedUserException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -45,7 +45,7 @@ public class FlexibleReportingApiResource { private final static Logger logger = LoggerFactory.getLogger(FlexibleReportingApiResource.class); @Autowired - private ReadPlatformService readPlatformService; + private ReadExtraDataAndReportingService ReadExtraDataAndReportingService; private String _corsHeaders; @@ -100,7 +100,7 @@ public class FlexibleReportingApiResource { } } logger.info("BEGINNING REQUEST FOR: " + name); - GenericResultset result = this.readPlatformService.retrieveGenericResultset(rptDB, name, type, extractedQueryParams); + GenericResultset result = this.ReadExtraDataAndReportingService.retrieveGenericResultset(rptDB, name, type, extractedQueryParams); // JSONWithPadding paddedResult = new JSONWithPadding(result, // callbackName); @@ -129,7 +129,7 @@ public class FlexibleReportingApiResource { extractedQueryParams.put("${currencyId}", currencyId.toString()); } - GenericResultset result = this.readPlatformService.retrieveGenericResultset(rptDB, name, type, extractedQueryParams); + GenericResultset result = this.ReadExtraDataAndReportingService.retrieveGenericResultset(rptDB, name, type, extractedQueryParams); return Response.ok().entity(result).build(); } catch (UnAuthenticatedUserException e) {