/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.tem.report.service.impl;
import static net.sf.jasperreports.engine.JRExporterParameter.JASPER_PRINT_LIST;
import static net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_STREAM;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
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.JRPdfExporter;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.tem.report.DetailedReport;
import org.kuali.kfs.module.tem.report.annotations.ReportStyle;
import org.kuali.kfs.module.tem.report.service.TravelReportFactoryService;
import org.kuali.kfs.module.tem.report.service.TravelReportService;
import org.kuali.kfs.sys.report.ReportInfo;
import org.kuali.kfs.sys.service.ReportGenerationService;
import org.springframework.transaction.annotation.Transactional;
/**
* Service interface for travel reports.
*
*/
@Transactional
public class TravelReportServiceImpl implements TravelReportService {
public static Logger LOG = Logger.getLogger(TravelReportServiceImpl.class);
protected ReportGenerationService reportGenerationService;
protected TravelReportFactoryService reportFactoryService;
/**
*
* @param report
* @param ByteArrayOutputStream
*/
@Override
public ByteArrayOutputStream buildReport(final ReportInfo report) throws Exception {
final Collection reportSet = new ArrayList(); // Empty data set. The report is essentially subreports
final Map<String, Object> reportData = new HashMap<String, Object>();
reportData.put("report", report);
final Collection<JasperPrint> printObjs = new ArrayList<JasperPrint>();
final Collection<Field> subreportFields = getReportFactoryService().getSubreportFieldsFrom(report);
if (subreportFields.size() > 0) {
LOG.info("######################################################################");
LOG.info("# BEGINNING PROCESSING SUBREPORTS #");
LOG.info("######################################################################");
}
for (final Field subreportField : subreportFields) {
subreportField.setAccessible(true);
final JasperReport reportObj = getReportFactoryService().processReportForField(report, subreportField);
if (reportObj != null) {
reportObj.setWhenNoDataType(JasperReport.WHEN_NO_DATA_TYPE_NO_DATA_SECTION);
printObjs.add(JasperFillManager.fillReport(reportObj, reportData, (JRDataSource) subreportField.get(report)));
}
}
if (subreportFields.size() > 0) {
LOG.info("######################################################################");
LOG.info("# FINISHED PROCESSING SUBREPORTS #");
LOG.info("######################################################################");
}
boolean addMoreReports = true;
int i = 0;
while (addMoreReports) {
final JasperDesign designObj = getReportFactoryService().designReport(report, i);
if (designObj != null) {
final JasperReport reportObj = JasperCompileManager.compileReport(designObj);
reportObj.setWhenNoDataType(JasperReport.WHEN_NO_DATA_TYPE_NO_DATA_SECTION);
if (report instanceof DetailedReport) {
printObjs.add(JasperFillManager.fillReport(reportObj, reportData, ((DetailedReport) report).getData()));
}
}
else {
addMoreReports = false;
}
i++;
}
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JASPER_PRINT_LIST, printObjs);
exporter.setParameter(OUTPUT_STREAM, baos);
try {
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
finally {
LOG.info("######################################################################");
LOG.info("# FINISHED PROCESSING REPORT #");
LOG.info("######################################################################");
}
return baos;
}
public void setReportGenerationService(final ReportGenerationService reportGenerationService) {
this.reportGenerationService = reportGenerationService;
}
public ReportGenerationService getReportGenerationService() {
return reportGenerationService;
}
protected boolean isCrosstabReport(final ReportInfo report) {
return isCrosstabReport(report.getClass());
}
protected boolean isCrosstabReport(final Class reportClass) {
if (reportClass.getAnnotation(ReportStyle.class) != null) {
}
return true;
}
/**
* Gets the reportFactoryService property.
* @return Returns the reportFactoryService.
*/
public TravelReportFactoryService getReportFactoryService() {
return reportFactoryService;
}
/**
* Sets the reportFactoryService property value.
* @param reportFactoryService The reportFactoryService to set.
*/
public void setReportFactoryService(final TravelReportFactoryService reportFactoryService) {
this.reportFactoryService = reportFactoryService;
}
}