/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package relatorio;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
import exception.relatorio.RelatorioException;
public class RelatorioHtml {
private String caminhoRelatorioHTML;
public RelatorioHtml() {
}
public RelatorioHtml(String pathRelatorioHTML) {
this.caminhoRelatorioHTML = pathRelatorioHTML;
}
/**
* metodo responsavel pelo preenchimento do relatorio, a partir do arquivo jasper compilado, do nome do arquivo html,
* e considerando os dados sob a forma de List e os par�metros
*
* @param nomeArquivo
* @param streamRelatorio
* @param parametros
* @param dados
* @throws RelatorioException
*/
public void download(String nomeArquivo, InputStream streamRelatorio, Map parametros, List dados) throws RelatorioException {
String caminhoRelatorio = caminhoRelatorioHTML + nomeArquivo;
System.out.println("CAMINHO RELAT�RIO: " + caminhoRelatorio);
File relatorio = new File(caminhoRelatorio);
byte[] buffer = null;
try {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getResponse();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=\"" + nomeArquivo + "\"");
if (parametros == null) {
parametros = new HashMap();
}
//Neste ponto, a nossa lista preenchida com o modelo � entregue ao Jasper, que cria um DataSource com ela
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dados);
//Aqui � onde ocorre de fato o preenchimento do relat�rio, com os par�metros e DataSource passados
JasperPrint impressao = JasperFillManager.fillReport(streamRelatorio, parametros, dataSource);
//Ponto onde o relat�rio com os dados montados � exportado para o formato HTML
JasperExportManager.exportReportToHtmlFile(impressao, caminhoRelatorio);
FileInputStream fis = new FileInputStream(relatorio);
OutputStream os = response.getOutputStream();
response.setContentType("text/html");
JRHtmlExporter htmlExporter = new JRHtmlExporter();
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, impressao);
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, impressao);
htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER, os);
htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/gesplan/image?image=");
htmlExporter.exportReport();
int read = 0;
buffer = new byte[1024];
while ((read = fis.read(buffer)) != -1) {
os.write(buffer, 0, read);
}
os.flush();
os.close();
fis.close();
FacesContext.getCurrentInstance().responseComplete();
} catch (Throwable ex) {
ex.printStackTrace();
throw new RelatorioException(ex);
} finally {
buffer = null;
}
}
}