JasperReports PDF stream = null

Boa tarde amigos.

Estou com um grande problema.

Estou migrando um sistema e trocando a persistência dos dados utilizando hibernate. Até aí tudo bem!

No sistema antigo os relatórios saem redondo e sem erros!

Porém, no sistema novo ainda não consegui gerar nenhum relatório.

Ainda não estou pegando dados reais, gerei alguns fictícios pra tentar ver o PDF na tela mesmo…

A classe que gera relatórios, estou utilizando os mesmo métodos e estrutura do sistema antigo. As bibliotecas, estou usando as mesmas. Quando o programa chega numa linha em específico, acontece nullpointerexception. Esta linha é: JasperRunManager.runReportToPdfStream(stream, servletOutputStream,parametros, fonteDados);

Reparei que a variável ‘stream’ sempre fica nula! Eu não sei mais o que fazer. Já teste várias bibliotecas, inseri e retirei do build path estas bibliotecas… Alguém tem uma dica por favor???

Vou postar minha classe, caso alguém já tenha passado por isso ou tenha o conhecimento e possa me ajudar. ( Erro acontece no método emitirRelatorioPdf() na linha 303. A variável ‘stream’ deveria ser preenchida na linha 278.)

Muito obrigado à todos.

Atenciosamente,
Michell Hornung.

package lh.report.action;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.ValidationException;

import lh.report.controller.ReportController;
import lh.report.model.Report;
import lh.security.model.User;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 * Servlet reponsável por emitir todos os Relatórios em todos os formatos
 * suportados.
 */
@WebServlet("/PrintReportAction")
public class PrintReportAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unused")
	private HttpServletResponse response;
	private HttpServletRequest request;

	public PrintReportAction() {
		super();

	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		RequestDispatcher dispatcher = null;

		// Recupera os parametros
		Integer id = Integer.parseInt(request.getParameter("id"));
		String beginDateBR = request.getParameter("data_inicio");
		String endDateBR = request.getParameter("data_final");
		String interval = request.getParameter("interval");
		String description = request.getParameter("description");
		String orientationPage = request.getParameter("orientacao");
		String name = request.getParameter("name");
		String title = request.getParameter("title");
		String tipo = request.getParameter("tipo_arquivo");
		String cdApp = request.getParameter("cdApp");

		User user = (User) request.getSession().getAttribute("sessionUser");
		Report report = new ReportController().getReportByCod(cdApp);

		String[][] dados = null;
		String[][] legenda = null;

		if (user == null) {
			dispatcher = request.getRequestDispatcher("/report/logout.jsp");
			dispatcher.forward(request, response);
		} else {
			this.response = response;
			this.request = request;

			try {

				// Valida os parametros
				if (id.equals("") || id == null)
					throw new ValidationException(
							"Por favor, selecionar relatório!");
				if (interval.equals("") || interval == null)
					throw new ValidationException(
							"Por favor, informar intervalo!");
				if (beginDateBR.equals("") || beginDateBR == null)
					throw new ValidationException(
							"Por favor, informar data inicial!");

				// criar um vetor com valores ficiticios e somente depois emitir
				// os pdfs ou xls.
				legenda = new String[2][5];
				legenda[0][0] = "MNEMONICO";
				legenda[1][0] = "DESCRICAO";

				// inicia o contador auxiliar
				// e inicia o loop que deverá percorrer todos os itens da
				// legenda
				int posicaoLegenda = 1;
				while (posicaoLegenda < 5) {

					// Define os valores da legenda no array.
					legenda[0][posicaoLegenda] = "MNEMONICO" + posicaoLegenda;
					legenda[1][posicaoLegenda] = "DESCRICAO" + posicaoLegenda;

					// incrementa o contador de posição do array
					posicaoLegenda++;
				}

				dados = new String[25][5];
				dados[0][0] = "hora";
				dados[0][1] = "col1";
				dados[0][2] = "col2";
				dados[0][3] = "col3";
				dados[0][4] = "col4";

				for (int i = 1; i < 25; i++) {
					dados[i][0] = "" + i;
					dados[i][1] = "" + i;
					dados[i][2] = "" + i;
					dados[i][3] = "" + i;
					dados[i][4] = "" + i;
				}

				// Gera o relatório no formato .xls - Excel
				if ("xls".equals(tipo)) {
					this.emitirRelatorioExcel(dados, legenda, orientationPage,
							report.getNmLogo(), interval, title, description,
							beginDateBR, endDateBR);
				}
				// Gera o relatório no formato .pdf
				else if ("pdf".equals(tipo)) {
					this.emitirRelatorioPdf(dados, legenda, orientationPage,
							report.getNmLogo(), interval, title, description,
							beginDateBR, endDateBR);
				} else {
					System.out.println("Invalido: " + tipo);
				}

			} catch (Exception e) {
				request.setAttribute("error", e.getMessage());
				e.printStackTrace();
			}
		}

	}

	private void emitirRelatorioExcel(String[][] dados, String[][] legenda,
			String orientationPage, String string, String interval,
			String title, String description, String beginDateBR,
			String endDateBR) {
		// TODO Auto-generated method stub

	}

	private void emitirRelatorioPdf(String[][] dados, String[][] legenda,
			String orientationPage, String nmLogo, String interval,
			String title, String description, String beginDateBR,
			String endDateBR) throws JRException, IOException {

		// recupera o numero de colunas existente no segundo
		// parametro do campo data, esse valor deverá ser
		// considerado o numero de colunas do relatório
		int numeroDeColunas = dados[0].length - 1;

		// Define o background do relatório baseado na escolha
		// da orientação realizada pelo usuário.
		String path_background;
		if (orientationPage != null && orientationPage.equals("1")) {
			path_background = getServletContext().getRealPath(
					"/imagem/relatorios/topo_paisagem.jpg");
		} else {
			path_background = getServletContext().getRealPath(
					"/imagem/relatorios/topo_retrato.jpg");
		}

		// Define os parametros do relatório
		// Cria a instancia do HashMap de parametros do relatorio
		HashMap<String, String> parametros = new HashMap<String, String>();

		// Define os parametros basicos do relatório
		parametros.put("TITULO_REL", title);
		parametros.put("NOME_REL", description);
		parametros
				.put("DATA_INTERVALO",
						(beginDateBR.equals(endDateBR) || "".equals(endDateBR) ? beginDateBR
								: beginDateBR + " a " + endDateBR));
		parametros.put("DATA", dados[0][0]);
		parametros.put("LOGO", nmLogo);
		parametros.put("BACKGROUND_TOPO", path_background);

		// define os primeiros parametros do relatórios
		for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
			String nomeDaColuna = "";

			if (coluna < 10)
				nomeDaColuna = "COL0" + coluna;
			else
				nomeDaColuna = "COL" + coluna;

			parametros.put(nomeDaColuna, dados[0][coluna]);
		}

		 // define os primeiros parametros os parametros do relatórios
		for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
			String nomeDaColuna = "";

			if (coluna < 10)
				nomeDaColuna = "LEG0" + coluna;
			else
				nomeDaColuna = "LEG" + coluna;

			if (nomeDaColuna.length() == 4)
				nomeDaColuna = "0" + nomeDaColuna;
			parametros.put(nomeDaColuna, legenda[0][coluna] + " = "
					+ legenda[1][coluna]);

		}

		// Define a logo utilizada
		parametros.put("LOGO", nmLogo);

		// Define os dados do relatório
		// A logica abaixo é composta por 2 loops.
		// - O primeiro passa por todos os registros
		// - O segundo passa por todas as colunas
		ArrayList<HashMap><String, String>> dadosArrayList = new ArrayList<HashMap><String, String>>();
		for (int i = 1; i < dados.length; i++) {

			// HashMap responsável por armazenar temporáriamente
			// as informações da linha do relatório, ele será agregado
			// no final do loop ao array dados.
			HashMap<String, String> record = new HashMap<String, String>();

			// Define a data da linha do relatório
			if (dados[i][0].contains("Total:")) {
				record.put("DATA", dados[i][0].split(",")[1]);
			} else {
				if ("DD".equals(interval)) {
					record.put("DATA", dados[i][0].replaceAll("00:00:00", ""));
				} else {
					record.put("DATA", dados[i][0]);
				}
			}

			// Define os valores das colunas do relatório
			for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
				String nomeDaColuna = "";

				if (coluna < 10)
					nomeDaColuna = "COL0" + coluna;
				else
					nomeDaColuna = "COL" + coluna;

				if (nomeDaColuna.length() == 4)
					nomeDaColuna = "0" + nomeDaColuna;
				record.put(nomeDaColuna, dados[i][coluna]);
			}

			// Verifica se o periodo é diferente de dias
			// Caso sim, inicia o tratamento das informações para definir o
			// agrupamento das informações no relatório...

			if (!interval.equals("DD")) {

				if (dados[i][0].contains("Total:")) {
					record.put("GRUPO", dados[i][0].split(",")[0].trim());
				} else {
					record.put("GRUPO", dados[i][0].split(" ")[0]);
				}
			}

			dadosArrayList.add(record);
		}

		// Define qual o template deve ser utilizado
		String templatePath = getServletContext().getRealPath("/template/pdf");
		InputStream stream = getClass().getResourceAsStream(templatePath);

		// recupera o nome do relatório que será usado
		// usando como base a quantidade de colunas do relatório
		String parteNomeRelatorio = "";
		if (numeroDeColunas < 10)
			parteNomeRelatorio = "0" + numeroDeColunas;
		else
			parteNomeRelatorio = "" + numeroDeColunas;

		if (orientationPage != null && orientationPage.equals("0")) {
			stream = getServletContext().getResourceAsStream(templatePath + "/relatorio_" + parteNomeRelatorio + "col_retrato.jasper");
			System.out.println("stream" + stream);
		} else {
			stream = getServletContext().getResourceAsStream(templatePath + "/relatorio_" + parteNomeRelatorio + "col_paisagem.jasper");
			System.out.println("stream" + stream);
		}

		// Define o tipo de retorno no browser
		response.setContentType("application/pdf");

		// Inicia a geração do relatório
		JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(
				dadosArrayList);
		ServletOutputStream servletOutputStream = response.getOutputStream();
		JasperRunManager.runReportToPdfStream(stream, servletOutputStream,
				parametros, fonteDados);
		servletOutputStream.flush();
		servletOutputStream.close();
	}

}