From: Patrick Schmitz Date: Wed, 16 Jan 2013 23:27:56 +0000 (-0800) Subject: CSPACE-5305 Made output report form respect the mime type requested in the invocation... X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=77033df623f46effedc353dd0e223e9eb88b81fe;p=tmp%2Fjakarta-migration.git CSPACE-5305 Made output report form respect the mime type requested in the invocationContext. Added support for PDF, HTML, XML, CSV, and TSV. Added support to pass the correct mime type back, although TSV is mapped to the more common CSV on return. Also added support to set response headers to a reasonable filename for the returned report (it matches the report filename, plus the typical file extension for the mime type). --- diff --git a/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java b/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java index db2976f13..59490726b 100644 --- a/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java +++ b/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java @@ -40,6 +40,10 @@ public class ReportClient extends AbstractCommonListPoxServiceClientImpl { String invocationMode = invContext.getMode(); String modeProperty = null; + String outputMimeType = ReportClient.DEFAULT_REPORT_OUTPUT_MIME; HashMap params = new HashMap(); params.put(REPORTS_STD_TENANTID_PARAM, ctx.getTenantId()); boolean checkDocType = true; @@ -126,6 +140,7 @@ public class ReportDocumentModelHandler extends DocHandlerBase { +invocationMode); } + RepositoryJavaClientImpl repoClient = (RepositoryJavaClientImpl)this.getRepositoryClient(ctx); repoSession = this.getRepositorySession(); if (repoSession == null) { @@ -155,6 +170,10 @@ public class ReportDocumentModelHandler extends DocHandlerBase { } } reportFileName = (String)docModel.getPropertyValue(ReportJAXBSchema.FILENAME); + String reportOutputMime = (String)docModel.getPropertyValue(ReportJAXBSchema.OUTPUT_MIME); + if(!Tools.isEmpty(reportOutputMime)) { + outputMimeType = reportOutputMime; + } } catch (PropertyException pe) { if (logger.isDebugEnabled()) { logger.debug("Property exception getting batch values: ", pe); @@ -175,11 +194,12 @@ public class ReportDocumentModelHandler extends DocHandlerBase { repoClient.releaseRepositorySession(ctx, repoSession); } } - return buildReportResponse(csid, params, reportFileName); + return buildReportResponse(csid, params, reportFileName, outputMimeType); } - private Response buildReportResponse(String reportCSID, HashMap params, String reportFileName) + private Response buildReportResponse(String reportCSID, + HashMap params, String reportFileName, String outputMimeType) throws Exception { Connection conn = null; Response response = null; @@ -192,18 +212,61 @@ public class ReportDocumentModelHandler extends DocHandlerBase { conn = getConnection(); if (logger.isTraceEnabled()) { - logger.trace("ReportResource for Report csid=" + reportCSID - +" opening report file: "+fullPath); + logger.trace("ReportResource for csid=" + reportCSID + +" output as "+outputMimeType+" using report file: "+fullPath); } FileInputStream fileStream = new FileInputStream(fullPath); - // fill the report - JasperPrint jasperprint = JasperFillManager.fillReport(fileStream, params,conn); // export report to pdf and build a response with the bytes - byte[] pdfasbytes = JasperExportManager.exportReportToPdf(jasperprint); + //JasperExportManager.exportReportToPdf(jasperprint); + // Report will be to a byte output array. + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + JRExporter exporter = null; + // Strip extension from report filename. + String outputFilename = reportFileName; + // Strip extension from report filename. + int idx = outputFilename.lastIndexOf("."); + if(idx>0) + outputFilename = outputFilename.substring(0, idx); + // Strip any sub-dir from report filename. + idx = outputFilename.lastIndexOf(File.separator); + if(idx>0) + outputFilename = outputFilename.substring(idx+1); + if(outputMimeType.equals(MediaType.APPLICATION_XML)) { + params.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE); + exporter = new JRXmlExporter(); + outputFilename = outputFilename+".xml"; + } else if(outputMimeType.equals(MediaType.TEXT_HTML)) { + exporter = new JRHtmlExporter(); + outputFilename = outputFilename+".html"; + } else if(outputMimeType.equals(ReportClient.PDF_MIME_TYPE)) { + exporter = new JRPdfExporter(); + outputFilename = outputFilename+".pdf"; + } else if(outputMimeType.equals(ReportClient.CSV_MIME_TYPE)) { + params.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE); + exporter = new JRCsvExporter(); + exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER, ","); + outputFilename = outputFilename+".csv"; + } else if(outputMimeType.equals(ReportClient.TSV_MIME_TYPE)) { + params.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE); + exporter = new JRCsvExporter(); + exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER, "\t"); + outputFilename = outputFilename+".csv"; + } + // fill the report + JasperPrint jasperPrint = JasperFillManager.fillReport(fileStream, params,conn); + + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); + exporter.exportReport(); + byte[] reportAsBytes = baos.toByteArray(); + // Need to set response type for what is requested... - response = Response.ok(pdfasbytes, "application/pdf").build(); + ResponseBuilder builder = Response.ok(reportAsBytes, outputMimeType); + builder = builder.header("Content-Disposition","inline;filename=\""+outputFilename+"\""); + response = builder.build(); return response; } catch (SQLException sqle) {