package gcom.tarefa; import gcom.batch.ControladorBatchLocal; import gcom.batch.ControladorBatchLocalHome; import gcom.batch.FuncionalidadeIniciada; import gcom.batch.Relatorio; import gcom.batch.RelatorioGerado; import gcom.relatorio.ConstantesRelatorios; import gcom.relatorio.RelatorioDataSource; import gcom.relatorio.RelatorioVazioException; import gcom.seguranca.acesso.usuario.Usuario; import gcom.util.ConstantesJNDI; import gcom.util.ConstantesSistema; import gcom.util.ControladorException; import gcom.util.ControladorUtilLocal; import gcom.util.ControladorUtilLocalHome; import gcom.util.Internacionalizador; import gcom.util.IoUtil; import gcom.util.ServiceLocator; import gcom.util.ServiceLocatorException; import gcom.util.SistemaException; import gcom.util.Util; import gcom.util.ZipUtil; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Collection; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import java.util.zip.ZipOutputStream; import javax.ejb.CreateException; 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.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.JRRtfExporter; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; import net.sf.jasperreports.engine.util.JRLoader; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public abstract class TarefaRelatorio extends Tarefa { private static final long serialVersionUID = 1L; public static final int TIPO_PDF = 1; public static final int TIPO_RTF = 2; public static final int TIPO_XLS = 3; public static final int TIPO_HTML = 4; public static final int INDICADOR_EXIBE_MENSAGEM = 1; public static final int INDICADOR_NAO_EXIBE_MENSAGEM = 2; public static final String PARAMETRO_LOCALE_RELATORIO = "REPORT_LOCALE"; public static final String PARAMETRO_CAMINHO_PROPERTIES_RELATORIO = "REPORT_RESOURCE_BUNDLE"; public static final String VALOR_PARAMETRO_CAMINHO_PROPERTIES_RELATORIO = "gcom.properties.application"; protected String nomeRelatorio = null; public byte[] gerarRelatorio(String nomeRelatorio, Map parametrosRelatorio, RelatorioDataSource relatorioDataSource, int tipoSaidaRelatorio) throws RelatorioVazioException { // valor de retorno ByteArrayOutputStream retorno = new ByteArrayOutputStream(); byte[] retornoArray = null; // cria uma inst�ncia da classe JasperReport que vai conter o relat�rio // criado JasperReport jasperReport = null; InputStream stream = null; try { // carrega o arquivo do relat�rio (jasper) j� compilado stream = (ConstantesRelatorios.getURLRelatorio(nomeRelatorio)).openStream(); // carrega o relat�rio compilado jasperReport = (JasperReport) JRLoader.loadObject(stream); stream.close(); if(Internacionalizador.getLocale() != null){ parametrosRelatorio.put(PARAMETRO_CAMINHO_PROPERTIES_RELATORIO, ResourceBundle.getBundle(VALOR_PARAMETRO_CAMINHO_PROPERTIES_RELATORIO, Internacionalizador.getLocale())) ; parametrosRelatorio.put( PARAMETRO_LOCALE_RELATORIO, Internacionalizador.getLocale()); }else{ parametrosRelatorio.put(PARAMETRO_CAMINHO_PROPERTIES_RELATORIO, ResourceBundle.getBundle(VALOR_PARAMETRO_CAMINHO_PROPERTIES_RELATORIO, new Locale("pt","BR"))) ; parametrosRelatorio.put( PARAMETRO_LOCALE_RELATORIO, new Locale("pt","BR")); } JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametrosRelatorio, relatorioDataSource); // Verifica qual o tipo de relat�rio para definir a gera��o switch (tipoSaidaRelatorio) { case TIPO_PDF: JRPdfExporter exporterPDF = new JRPdfExporter(); exporterPDF.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporterPDF.setParameter(JRExporterParameter.OUTPUT_STREAM, retorno); exporterPDF.exportReport(); break; case TIPO_RTF: JRRtfExporter exporterRTF = new JRRtfExporter(); exporterRTF.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporterRTF.setParameter(JRExporterParameter.OUTPUT_STREAM, retorno); exporterRTF.exportReport(); break; case TIPO_XLS: JRXlsExporter exporterXLS = new JRXlsExporter(); nomeRelatorio = nomeRelatorio.replaceAll("/", ""); if (nomeRelatorio.length() > 31) { nomeRelatorio = nomeRelatorio.substring(0, 31); } jasperPrint.setName(nomeRelatorio); exporterXLS.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporterXLS.setParameter(JRExporterParameter.OUTPUT_STREAM, retorno); exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, true); exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false); exporterXLS.setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, true); exporterXLS.exportReport(); break; case TIPO_HTML: // Para evitar problemas de concorr�ncia, o nome do arquivo html // gerado possui um n�mero aleat�rio no nome int numeroNomeRelatorio = new Double((Math.random() * 10000)) .intValue(); JasperExportManager.exportReportToHtmlFile(jasperPrint, "relatorio" + numeroNomeRelatorio + ".html"); // pegar o arquivo, zipar pasta e arquivo e escrever no stream // criar o arquivo zip File arquivoZip = File.createTempFile("zipHtml" + numeroNomeRelatorio, ".zip"); ZipOutputStream zos = new ZipOutputStream( new FileOutputStream(arquivoZip)); // Pega o arquivo gerado do relat�rio File pagina = new File("relatorio" + numeroNomeRelatorio + ".html"); // Pega a pasta que acompanha o arquivo do relat�rio gerado File pastaDeImagens = new File("relatorio" + numeroNomeRelatorio + ".html_files"); ZipUtil.adicionarArquivo(zos, pagina); ZipUtil.adicionarPasta(pastaDeImagens, zos); // close the stream zos.close(); FileInputStream inputStream = new FileInputStream( arquivoZip); int INPUT_BUFFER_SIZE = 1024; byte[] temp = new byte[INPUT_BUFFER_SIZE]; int numBytesRead = 0; while ((numBytesRead = inputStream.read(temp, 0, INPUT_BUFFER_SIZE)) != -1) { retorno.write(temp, 0, numBytesRead); } inputStream.close(); inputStream = null; // Apaga todo o conte�do gerado pagina.delete(); IoUtil.deleteDir(pastaDeImagens); arquivoZip.delete(); break; default: throw new RelatorioVazioException( "Escolha um tipo de relat�rio"); } retornoArray = retorno.toByteArray(); } catch (Exception e) { e.printStackTrace(); throw new SistemaException(e, "Erro ao criar relat�rio"); }finally{ if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); throw new SistemaException(e, "Erro ao fechar relat�rio"); } } } return retornoArray; } public TarefaRelatorio(Usuario usuario, String nomeRelatorio) { super(usuario, ConstantesSistema.NUMERO_NAO_INFORMADO); this.nomeRelatorio = nomeRelatorio; } public abstract int calcularTotalRegistrosRelatorio(); public String getNomeRelatorio() { return nomeRelatorio; } public void persistirRelatorioConcluido(byte[] relatorioConcluido, int idRelatorio, int idFuncionalidadeIniciada) throws ControladorException { if (idFuncionalidadeIniciada != 0 && idFuncionalidadeIniciada != ConstantesSistema.NUMERO_NAO_INFORMADO) { RelatorioGerado relatorioGerado = new RelatorioGerado(); relatorioGerado.setArquivoRelatorio(relatorioConcluido); relatorioGerado.setNumeroPaginas(0); relatorioGerado.setUltimaAlteracao(new Date()); Relatorio relatorio = new Relatorio(); relatorio.setId(idRelatorio); relatorioGerado.setRelatorio(relatorio); FuncionalidadeIniciada funcionalidadeIniciada = new FuncionalidadeIniciada(); funcionalidadeIniciada.setId(idFuncionalidadeIniciada); relatorioGerado.setFuncionalidadeIniciada(funcionalidadeIniciada); getControladorUtil().inserir(relatorioGerado); } } public final void execute(JobExecutionContext arg0) throws JobExecutionException { Integer idFuncionalidadeIniciada = (Integer) arg0.getJobDetail() .getJobDataMap().get("idFuncionalidadeIniciada"); try { // ------------------------------------ // ------------------------------------ // Inicia a Funcionalidade Iniciada para execu��o do relat�rio // ------------------------------------ // ------------------------------------ if (idFuncionalidadeIniciada != null) { getControladorBatch().iniciarFuncionalidadeIniciadaRelatorio( idFuncionalidadeIniciada); } this.setIdFuncionalidadeIniciada(idFuncionalidadeIniciada); this.setUsuario((Usuario) arg0.getJobDetail().getJobDataMap().get( "usuario")); this.setParametroTarefa((Set) arg0.getJobDetail().getJobDataMap() .get("parametroTarefa")); this.executar(); // ------------------------------------ // ------------------------------------ // Encerra a Funcionalidade Iniciada // ------------------------------------ // ------------------------------------ if (idFuncionalidadeIniciada != null) { getControladorBatch().encerrarFuncionalidadeIniciadaRelatorio( idFuncionalidadeIniciada, false); } } catch (Exception e) { e.printStackTrace(); // ------------------------------------ // ------------------------------------ // Encerra a Funcionalidade Iniciada indicando erro // ------------------------------------ // ------------------------------------ if (idFuncionalidadeIniciada != null) { try { getControladorBatch() .encerrarFuncionalidadeIniciadaRelatorio( idFuncionalidadeIniciada, true); } catch (ControladorException e1) { e1.printStackTrace(); } } } } private ControladorUtilLocal getControladorUtil() { ControladorUtilLocalHome localHome = null; ControladorUtilLocal local = null; // pega a inst�ncia do ServiceLocator. ServiceLocator locator = null; try { locator = ServiceLocator.getInstancia(); localHome = (ControladorUtilLocalHome) locator .getLocalHome(ConstantesJNDI.CONTROLADOR_UTIL_SEJB); // guarda a referencia de um objeto capaz de fazer chamadas � // objetos remotamente local = localHome.create(); return local; } catch (CreateException e) { throw new SistemaException(e); } catch (ServiceLocatorException e) { throw new SistemaException(e); } } private ControladorBatchLocal getControladorBatch() { ControladorBatchLocalHome localHome = null; ControladorBatchLocal local = null; // pega a inst�ncia do ServiceLocator. ServiceLocator locator = null; try { locator = ServiceLocator.getInstancia(); localHome = (ControladorBatchLocalHome) locator .getLocalHome(ConstantesJNDI.CONTROLADOR_BATCH_SEJB); local = localHome.create(); return local; } catch (CreateException e) { throw new SistemaException(e); } catch (ServiceLocatorException e) { throw new SistemaException(e); } } public void exibirRelatorio(HttpServletResponse response, byte[] dados){ response.addHeader("Content-Disposition","attachment; filename=relatorio.pdf"); String mimeType = "application/pdf"; response.setContentType(mimeType); OutputStream out; try { out = response.getOutputStream(); out.write(dados); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }