package com.globant.katari.report.domain;
import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.Map;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.apache.commons.lang.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Service class that generates jasper reports.
*
* @author sergio.sobek
*
*/
public final class JasperReportGenerator {
/** The class logger. */
private static Logger log = LoggerFactory.getLogger(JasperReportGenerator.class);
/** The report repository. It cannot be null. */
private JasperReportRepository repository;
/**
* Constructor.
*
* @param theRepository the jasper report repository. It cannot be null.
*/
protected JasperReportGenerator(final JasperReportRepository theRepository) {
Validate.notNull(theRepository, "The the repository cannot be null");
repository = theRepository;
}
/**
* Generate the output report.
*
* @param reportId the id of the report definition. It must be greater than 0.
* @param parameters map of the values of the report's parameters. It cannot
* be null.
* @param theReportType with the type of output for the report. It cannot be
* null.
* @param theOutputStream (output parameter) The output stream where the
* generated report is written to. It cannot be null.
* @param connection to the database.
*
* @return OutputStream - An output stream with the generated report.
*/
public OutputStream generate(final long reportId,
final Map<String, Object> parameters, final ReportType theReportType,
final OutputStream theOutputStream, final Connection connection) {
Validate.isTrue(reportId > 0, "The reportId must be greater than 0");
Validate.notNull(parameters, "The parameters map cannot be null.");
Validate.notNull(theReportType, "The reportType cannot be null.");
Validate.notNull(theOutputStream, "The outputStream cannot be null.");
ReportDefinition rt = repository.findReportDefinitionById(reportId);
try {
log.trace("Loading report...");
JasperDesign jasperDesign = JRXmlLoader.load(new ByteArrayInputStream(rt
.getReportContent()));
log.trace("Compiling report...");
JasperReport jasperReport = JasperCompileManager
.compileReport(jasperDesign);
jasperReport.setWhenNoDataType(
JasperReport.WHEN_NO_DATA_TYPE_ALL_SECTIONS_NO_DETAIL);
log.trace("Filling report...");
JasperPrint filledReport;
if (connection == null) {
filledReport = JasperFillManager.fillReport(jasperReport, parameters,
new JREmptyDataSource());
} else {
filledReport = JasperFillManager.fillReport(jasperReport, parameters,
connection);
}
if (ReportType.PDF.equals(theReportType)) {
JasperExportManager.exportReportToPdfStream(filledReport,
theOutputStream);
} else if (ReportType.XML.equals(theReportType)) {
JasperExportManager.exportReportToXmlStream(filledReport,
theOutputStream);
} else if (ReportType.EXCEL.equals(theReportType)) {
JRXlsExporter xlsExporter = new JRXlsExporter();
xlsExporter
.setParameter(JRExporterParameter.JASPER_PRINT, filledReport);
xlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
theOutputStream);
xlsExporter.exportReport();
} else if (ReportType.HTML.equals(theReportType)) {
JRHtmlExporter htmlExporter = new JRHtmlExporter();
htmlExporter.setParameter(
JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT,
filledReport);
htmlExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
theOutputStream);
htmlExporter.exportReport();
}
} catch (JRException e) {
throw new RuntimeException("Oops: reports engine exception", e);
} catch (Exception e) {
throw new RuntimeException("Oops: General Reports Engine exception", e);
}
return theOutputStream;
}
}