/*
* Copyright 2008-2011 the original author or authors.
*
* 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 org.jdal.util.processor;
import java.awt.Desktop;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
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.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import org.apache.commons.io.FileUtils;
/**
* Process a jasper file using the connection in the system to retrieve the data.
*
* @author Jose A. Corbacho
* @since 1.0
*/
public class JasperReportFileProcessor implements FileProcessor {
private byte[] rawData;
// The connection used to fill the report
private Connection conn;
private JRDataSource service;
private Map<String, Object> parameters = new HashMap<String, Object>();
public JasperReportFileProcessor(){
}
public JasperReportFileProcessor(Connection conn){
this.conn = conn;
}
public void processFile(File file, String outputType, boolean hasQuery) {
try {
// Fill the report using the connection
JasperPrint print = null;
if (hasQuery) print = JasperFillManager.fillReport(
new FileInputStream(file), parameters, conn);
else print = JasperFillManager.fillReport(
new FileInputStream(file), parameters, service);
// Create a PDF exporter
// Configure the exporter (set output file name and print object)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// By default, PDF
JRExporter exporter = new JRPdfExporter();
if ("pdf".equals(outputType)){
exporter = new JRPdfExporter();
}
else if ("xls".equals(outputType)){
exporter = new JRXlsExporter();
}
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
setRawData(baos.toByteArray());
} catch (JRException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void processFile(byte[] rawData) {
// TODO Auto-generated method stub
}
public void setRawData(byte[] data) {
this.rawData = data;
}
public byte[] getRawData() {
return rawData;
}
public void setConnection(Connection conn) {
this.conn = conn;
}
public static void main(String[] args){
try {
JasperReport report = JasperCompileManager.compileReport("/home/jose/Projects/telmma/Documents/Code/testParameters.jrxml");
System.out.println("Query en el jasper: " + report.getQuery().getText());
for (JRParameter param : report.getParameters()){
if (!param.isSystemDefined())
System.out.println(param.getName());
}
Map<String, Object> parameters = new HashMap<String, Object>();
// TEST
parameters.put("NombreCiudad", "Huelva");
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, new JREmptyDataSource());
byte[] reportBin = JasperExportManager.exportReportToPdf(jasperPrint);
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
File outputFile;
try {
outputFile = File.createTempFile("simple_report", ".pdf");
//outputFile.deleteOnExit();
// Create the file with the raw data provided by the file processor
FileUtils.writeByteArrayToFile(outputFile, reportBin);
System.out.println("OutputFile -> " + outputFile.getName() + " " + outputFile.getTotalSpace());
desktop.open(outputFile);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void setService(JRDataSource service) {
this.service = service;
}
public void setParameters(Map<String, Object> parameters){
this.parameters = parameters;
}
}