From e08b0044dafb16a9968c1f428798cebd9df4b89e Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Mon, 25 Feb 2013 17:18:28 +0000 Subject: [PATCH] fix prob with linefeeds on csv export & allow reports to have normal json output --- .../core/api/ApiParameterHelper.java | 4 +++ .../dataqueries/api/ReportsApiResource.java | 23 ++++++++++--- .../service/GenericDataServiceImpl.java | 34 +++++++++++++------ .../service/ReadReportingServiceImpl.java | 11 +++--- 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/ApiParameterHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/ApiParameterHelper.java index 1e78b6a32..f599aa603 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/ApiParameterHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/ApiParameterHelper.java @@ -125,6 +125,10 @@ public class ApiParameterHelper { return genericResultSet; } + public static boolean genericResultSetPassed(MultivaluedMap queryParams) { + return queryParams.getFirst("genericResultSet") != null; + } + public static String sqlEncodeString(String str) { String singleQuote = "'"; String twoSingleQuotes = "''"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/api/ReportsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/api/ReportsApiResource.java index 10f128956..48103a295 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/api/ReportsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/api/ReportsApiResource.java @@ -26,6 +26,7 @@ import javax.ws.rs.core.UriInfo; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; import org.mifosplatform.infrastructure.dataqueries.data.GenericResultsetData; +import org.mifosplatform.infrastructure.dataqueries.service.GenericDataService; import org.mifosplatform.infrastructure.dataqueries.service.ReadReportingService; import org.mifosplatform.infrastructure.security.exception.NoAuthorizationException; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; @@ -42,15 +43,16 @@ public class ReportsApiResource { private final PlatformSecurityContext context; private final ToApiJsonSerializer toApiJsonSerializer; private final ReadReportingService readExtraDataAndReportingService; + private final GenericDataService genericDataService; @Autowired public ReportsApiResource(final PlatformSecurityContext context, final ReadReportingService readExtraDataAndReportingService, - final ToApiJsonSerializer toApiJsonSerializer) { + final GenericDataService genericDataService, final ToApiJsonSerializer toApiJsonSerializer) { this.context = context; this.readExtraDataAndReportingService = readExtraDataAndReportingService; + this.genericDataService = genericDataService; this.toApiJsonSerializer = toApiJsonSerializer; } - @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON, "application/x-msdownload" }) @@ -130,11 +132,22 @@ public class ReportsApiResource { GenericResultsetData result = this.readExtraDataAndReportingService.retrieveGenericResultset(reportName, parameterTypeValue, reportParams); - final String json = this.toApiJsonSerializer.serializePretty(prettyPrint, result); - + String json = ""; + final boolean genericResultSetIsPassed = ApiParameterHelper.genericResultSetPassed(uriInfo.getQueryParameters()); + final boolean genericResultSet = ApiParameterHelper.genericResultSet(uriInfo.getQueryParameters()); + if (genericResultSetIsPassed) { + if (genericResultSet) { + json = this.toApiJsonSerializer.serializePretty(prettyPrint, result); + } else { + json = this.genericDataService.generateJsonFromGenericResultsetData(result); + } + } else { + json = this.toApiJsonSerializer.serializePretty(prettyPrint, result); + } + return Response.ok().entity(json).type(MediaType.APPLICATION_JSON).build(); } - + // CSV Export Map reportParams = getReportParams(queryParams, false); StreamingOutput result = this.readExtraDataAndReportingService.retrieveReportCSV(reportName, parameterTypeValue, reportParams); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/GenericDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/GenericDataServiceImpl.java index f4d526760..aaea2b9da 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/GenericDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/GenericDataServiceImpl.java @@ -185,35 +185,49 @@ public class GenericDataServiceImpl implements GenericDataService { writer.append(doubleQuote + columnHeaders.get(j).getColumnName() + doubleQuote + ": "); currColType = columnHeaders.get(j).getColumnDisplayType(); + final String colType = columnHeaders.get(j).getColumnType(); + if (currColType == null && colType.equalsIgnoreCase("INT")) { + currColType = "INTEGER"; + } + if (currColType == null && colType.equalsIgnoreCase("VARCHAR")) { + currColType = "VARCHAR"; + } + if (currColType == null && colType.equalsIgnoreCase("DATE")) { + currColType = "DATE"; + } currVal = row.get(j); - if (currVal != null) { - if (currColType.equals("DECIMAL") || currColType.equals("INTEGER")) + if (currVal != null && currColType != null) { + if (currColType.equals("DECIMAL") || currColType.equals("INTEGER")) { writer.append(currVal); - else { + } else { if (currColType.equals("DATE")) { LocalDate localDate = new LocalDate(currVal); writer.append("[" + localDate.getYear() + ", " + localDate.getMonthOfYear() + ", " + localDate.getDayOfMonth() + "]"); - } else - writer.append(doubleQuote + replace(currVal, doubleQuote, slashDoubleQuote) + doubleQuote); + } else { + + writer.append(doubleQuote + replace(currVal, doubleQuote,slashDoubleQuote) + doubleQuote); + } } - } else + } else { writer.append("null"); - + } if (j < (rSize - 1)) writer.append(",\n"); } - if (i < (data.size() - 1)) + if (i < (data.size() - 1)) { writer.append("},"); - else + } + else { writer.append("}"); + } } writer.append("\n]"); return writer.toString(); } - + private void dbClose(Statement db_statement, Connection db_connection) { // logger.debug("dbClose"); try { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index 51fc603a4..5508871fe 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -63,7 +63,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { private final static Logger logger = LoggerFactory.getLogger(ReadReportingServiceImpl.class); private Boolean noPentaho = false; - + @Autowired public ReadReportingServiceImpl(final PlatformSecurityContext context) { // kick off pentaho reports server @@ -108,7 +108,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { } - private static StringBuffer generateCsvFileBuffer(final GenericResultsetData result) { + private StringBuffer generateCsvFileBuffer(final GenericResultsetData result) { StringBuffer writer = new StringBuffer(); List columnHeaders = result.getColumnHeaders(); @@ -126,6 +126,8 @@ public class ReadReportingServiceImpl implements ReadReportingService { // String currCol; String currColType; String currVal; + String doubleQuote = "\""; + String twoDoubleQuotes = doubleQuote + doubleQuote; logger.info("NO. of Rows: " + data.size()); for (int i = 0; i < data.size(); i++) { row = data.get(i).getRow(); @@ -139,7 +141,8 @@ public class ReadReportingServiceImpl implements ReadReportingService { || currColType.equals("SMALLINT") || currColType.equals("INT")) writer.append(currVal); else - writer.append('"' + currVal + '"'); + writer.append('"' + genericDataService.replace(currVal, doubleQuote, twoDoubleQuotes) + '"'); + } if (j < (rSize - 1)) writer.append(","); } @@ -148,7 +151,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { return writer; } - + @Override public GenericResultsetData retrieveGenericResultset(final String name, final String type, final Map queryParams) {