/**
* Copyright (C) 2010 Andrew C. Love <drewncrew@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.dnc.cloak.framework.service.report;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
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.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import org.apache.log4j.Logger;
import com.dnc.cloak.framework.config.ConfigurationMgr;
import com.dnc.cloak.framework.context.IContext;
import com.dnc.cloak.framework.persistence.dao.FrameworkDAO;
import com.dnc.cloak.framework.report.ReportDefinition;
import com.dnc.cloak.framework.report.ReportRequest;
import com.dnc.cloak.framework.security.CloakSecurityException;
import com.dnc.cloak.framework.service.AbstractService;
import com.dnc.cloak.framework.service.ServiceException;
public class LocalReportService extends AbstractService implements IReportService {
private static final String PARM_FORMAT_EXCEL = "PARM_FORMAT_EXCEL";
private static final Logger logger = Logger.getLogger(LocalReportService.class.getName());
private String reportTemplateLocation = ConfigurationMgr.getInstance().getProperty(null, "report.template.location", "\\");
private String reportOutputLocation = ConfigurationMgr.getInstance().getProperty(null, "report.output.location", "\\");
private static Map<String,JasperReport> compiledReports = new TreeMap<String,JasperReport>();
public void requestReport(IContext context,List<ReportRequest> requests) throws ServiceException {
for(ReportRequest request : requests){
requestReport(context,request);
}
}
public void requestReport(IContext context,ReportRequest request) throws ServiceException {
FrameworkDAO dao = FrameworkDAO.getInstance();
try {
long begin = new Date().getTime();
logger.debug("Begin requestReport");
logger.debug(reportTemplateLocation + "/" + request.getReportTemplate());
String name = reportTemplateLocation + "/" + request.getReportTemplate();
JasperReport jreport = null;
if (compiledReports.containsKey(name)){
logger.debug("Report definition is cached" + name);
jreport = (JasperReport)compiledReports.get(name);
}
else {
logger.debug("Report definition is not cached" + name);
InputStream templateStream = getClass().getResourceAsStream(name);
jreport = JasperCompileManager.compileReport(templateStream);
compiledReports.put(name, jreport);
}
dao.getSqlMapper().startTransaction();
JasperPrint jasperPrint = JasperFillManager.fillReport(jreport, request.getParameters(),dao.getSqlMapper().getCurrentConnection());
if (request.getParameters().containsKey(PARM_FORMAT_EXCEL) &&
((Boolean)request.getParameters().get(PARM_FORMAT_EXCEL)).booleanValue() == true){
try {
String fileName = (request.getReportLocation() != null) ?
request.getReportLocation() + "/" + request.getReportName() + ".xls" :
reportOutputLocation + "/" + request.getReportName() + ".xls";
logger.debug("fileName:" + fileName);
File file = new File(fileName);
file.getParentFile().mkdirs();
JRXlsExporter exporter = new JRXlsExporter();
OutputStream ouputStream = new FileOutputStream(file);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.TRUE);
exporter.exportReport();
ouputStream.write(byteArrayOutputStream.toByteArray());
ouputStream.flush();
ouputStream.close();
}
catch (Exception e) {
throw new ServiceException(e);
}
catch (Throwable e) {
throw new ServiceException(e);
}
}
else {
String fileName = (request.getReportLocation() != null) ?
request.getReportLocation() + "/" + request.getReportName() + ".pdf" :
reportOutputLocation + "/" + request.getReportName() + ".pdf";
logger.debug("fileName:" + fileName);
File file = new File(fileName);
file.getParentFile().mkdirs();
JasperExportManager.exportReportToPdfFile(jasperPrint, fileName);
}
dao.getSqlMapper().commitTransaction();
long end = new Date().getTime();
logger.debug("End requestReport: duration= " + (end-begin));
}
catch (SQLException e) {
throw new ServiceException(e);
}
catch (JRException e) {
throw new ServiceException(e);
}
finally {
try {
dao.getSqlMapper().endTransaction();
}
catch (SQLException e) {
logger.error("requestReport",e);
}
}
}
public List<ReportDefinition> getReportDefinitions(IContext context)throws ServiceException {
FrameworkDAO dao = FrameworkDAO.getInstance();
try {
return dao.getReportDefinitions(context);
}
catch (SQLException sqlEx) {
throw new ServiceException(sqlEx);
}
catch (CloakSecurityException ex) {
throw new ServiceException(ex);
}
}
}
|