From e085bfa39c0bc4141f8920cf7a89a9d51c58ce68 Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Mon, 14 May 2012 09:43:24 +1000 Subject: [PATCH] ExportCSVController.java talk --- .../WEB-INF/views/reports/flexireport.jsp | 3 +- .../platform/api/ExportCSVController.java | 171 ++++++++++++++++++ .../api/FlexibleReportingApiResource.java | 2 +- 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/ExportCSVController.java diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/reports/flexireport.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/reports/flexireport.jsp index 32967cd58..2d028a36e 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/reports/flexireport.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/reports/flexireport.jsp @@ -94,7 +94,8 @@ var reportingParams = { //old link RESTUrl: "${baseUrl}api/protected/reporting/flexireport", RESTUrl: "${baseUrl}api/v1/flexiblereporting", pentahoUrl: "${baseUrl}pentahoreport", - exportUrl: "${rootContext}/exportcsv", + //old link exportUrl: "${rootContext}exportcsv", + exportUrl: "${baseUrl}exportcsv", bundleDir: "${resValue}/stretchyreporting/mifosngbundle/", reportsListDiv: "myListOfReports", runReportDiv: "myRunReportButton", diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/ExportCSVController.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/ExportCSVController.java new file mode 100644 index 000000000..33448988c --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/ExportCSVController.java @@ -0,0 +1,171 @@ +package org.mifosng.platform.api; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.ServletContext; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.mifosng.data.reports.GenericResultset; +import org.mifosng.data.reports.ResultsetColumnHeader; +import org.mifosng.data.reports.ResultsetDataRow; +import org.mifosng.platform.ReadExtraDataAndReportingService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.context.ServletContextAware; + +@Controller +public class ExportCSVController implements ServletContextAware { + + private final static Logger logger = LoggerFactory + .getLogger(ExportCSVController.class); + + private final ReadExtraDataAndReportingService readExtraDataAndReportingService; + + @Autowired + public ExportCSVController( + final ReadExtraDataAndReportingService readExtraDataAndReportingService) { + logger.info("ExportCSVController started"); + this.readExtraDataAndReportingService = readExtraDataAndReportingService; + } + + @ExceptionHandler(AccessDeniedException.class) + public String accessDeniedException() { + return "unAuthorizedAction"; + } + + /* + * @ExceptionHandler(ClientValidationException.class) public @ResponseBody + * Collection validationException(ClientValidationException + * ex, HttpServletResponse response) { + * + * response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + * response.setContentType("application/json"); + * + * return ex.getValidationErrors(); } + */ + @RequestMapping(value = "/exportcsv", method = RequestMethod.GET) + public void handleExportCSV(final HttpServletRequest request, + HttpServletResponse response) throws IOException { + logger.info("handleExportCSV started"); + @SuppressWarnings("unchecked") + Map queryParams = request.getParameterMap(); + + String rptDB = queryParams.get("MRP_rptDB")[0]; + String name = queryParams.get("MRP_Name")[0]; + String type = queryParams.get("MRP_Type")[0]; + + Set keys = queryParams.keySet(); + Map extractedQueryParams = new HashMap(); + String pKey; + String pValue; + for (String k : keys) { + + if (k.startsWith("MRP_")) { + pKey = "${" + k.substring(4) + "}"; + pValue = queryParams.get(k)[0]; + // logger.info(name + ": " + pKey + ": " + pValue); + extractedQueryParams.put(pKey, pValue); + } + } + + // if (extractedQueryParams.size() > 3) { + // throw new + // UnsupportedOperationException("Not able to support this report for export to CSV right now."); + // } + + GenericResultset result = this.readExtraDataAndReportingService + .retrieveGenericResultset(rptDB, name, type, + extractedQueryParams); + + // response.setContentType("application/octet-stream"); + response.setContentType("application/x-msdownload"); + + response.setHeader("Content-Disposition", + "attachment;filename=" + name.replaceAll(" ", "") + ".csv"); + + ServletOutputStream out = response.getOutputStream(); + StringBuffer sb = generateCsvFileBuffer(result); + + InputStream in = new ByteArrayInputStream(sb.toString().getBytes( + "UTF-8")); + + byte[] outputByte = new byte[4096]; + Integer readLen = in.read(outputByte, 0, 4096); + + while (readLen != -1) { + out.write(outputByte, 0, readLen); + readLen = in.read(outputByte, 0, 4096); + } + in.close(); + out.flush(); + out.close(); + + } + + private static StringBuffer generateCsvFileBuffer(GenericResultset result) { + StringBuffer writer = new StringBuffer(); + + List columnHeaders = result.getColumnHeaders(); + logger.info("NO. of Columns: " + columnHeaders.size()); + Integer chSize = columnHeaders.size(); + for (int i = 0; i < chSize; i++) { + writer.append('"' + columnHeaders.get(i).getColumnName() + '"'); + if (i < (chSize - 1)) + writer.append(","); + } + writer.append('\n'); + + List data = result.getData(); + List row; + Integer rSize; + // String currCol; + String currColType; + String currVal; + logger.info("NO. of Rows: " + data.size()); + for (int i = 0; i < data.size(); i++) { + row = data.get(i).getRow(); + rSize = row.size(); + for (int j = 0; j < rSize; j++) { + // currCol = columnHeaders.get(j).getColumnName(); + currColType = columnHeaders.get(j).getColumnType(); + currVal = row.get(j); + if (currVal != null) { + if (currColType.equals("DECIMAL") + || currColType.equals("DOUBLE") + || currColType.equals("BIGINT") + || currColType.equals("SMALLINT") + || currColType.equals("INT")) + writer.append(currVal); + else + writer.append('"' + currVal + '"'); + } + if (j < (rSize - 1)) + writer.append(","); + } + writer.append('\n'); + } + + return writer; + } + + @Override + public void setServletContext(ServletContext servletContext) { + // TODO Auto-generated method stub + + } + +} \ 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 73253272d..65fb9eb4d 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 @@ -76,7 +76,7 @@ public class FlexibleReportingApiResource { @GET @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({ MediaType.APPLICATION_JSON}) public Response retrieveReport(@Context UriInfo uriInfo, @Context HttpServletResponse httpServletResponse) { MultivaluedMap queryParams = uriInfo.getQueryParameters();