Relatórios com BIRT e Struts

Olá,

Estou tentando fazer um relatório utilizando BIRT e Struts.
Ao configurar o BirtEngine ele está dando o erro de “NullPointerException”. Se alguém puder me dar uma luz, agradeço.
Estou chamando a Action que irá montar o “reportHTML” que será jogado na sessão, e irá imprimir o relatório na página JSP, outra coisa que não estou encontrando ajuda na Web.

Action


import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderContext;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;

import br.com.sis.util.BirtEngine;


public class GraficoAction extends Action{

	   
	 private IReportEngine birtReportEngine = null;  
	   
     protected static Logger logger = Logger.getLogger("org.eclipse.birt");  
     
	  
	     /** 
	      * The html report action. <br /> 
	      * Gets the report's html output stream. 
	      * 
	      * @param actionMapping ActionMapping 
	      * @param actionForm ActionForm 
	      * @param request HttpServletRequest 
	      * @param response HttpServletResponse 
	      * @return ActionForward 
	      */  
	     public ActionForward execute(ActionMapping mapping, ActionForm form,
	    				HttpServletRequest request, HttpServletResponse response)
	    				throws Exception {
	    	 
	         ByteArrayOutputStream out = new ByteArrayOutputStream();  
	   
	         try {  
	        	 
	        	 if(mapping.getPath().equals("/graficos")){
	        		 out = renderReportPage(request);
	        		 request.setAttribute("reportHTML", out);  
	        		   
	    	        
	        	 }
	        	 
	         } catch (ServletException e) {  
	             logger.log(Level.SEVERE, e.getMessage(), e);  
	         }  
	         
	         return mapping.findForward("success");  
	     }  
	   
	     /** 
	      * Generates the html report. 
	      * 
	      * @param request HttpServletRequest 
	      * @return ByteArrayOutputStreamwith the report generated 
	      * @throws ServletException 
	      */  
	     private ByteArrayOutputStream renderReportPage(HttpServletRequest request) throws ServletException {  
	   
	         // get report name and launch the engine  
	         ByteArrayOutputStream out = new ByteArrayOutputStream();  
	         //String reportName = request.getParameter("ReportName");
	         String reportName = "Dados.rptdesign";
	         ServletContext sc = request.getSession().getServletContext();  
	         this.birtReportEngine = BirtEngine.getBirtEngine(sc);  
	   
	         // setup image directory  
	         HTMLRenderContext renderContext = new HTMLRenderContext();  
	         renderContext.setBaseImageURL(request.getContextPath() + "/images");  
	         renderContext.setImageDirectory(sc.getRealPath("/images"));  
	   
	         logger.log(Level.FINE, "image directory " + sc.getRealPath("/images"));  
	   
	         HashMap<String, HTMLRenderContext> contextMap = new HashMap<String, HTMLRenderContext>();  
	         contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);  
	   
	         IReportRunnable design;  
	         try {  
	             // Open report design  
	             design = birtReportEngine.openReportDesign(sc.getRealPath("/relatorios/sis/") + reportName);  
	             // create task to run and render report  
	             IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask(design);  
	             task.setAppContext(contextMap);  
	   
	             // set output options  
	             HTMLRenderOption options = new HTMLRenderOption();  
	             options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);  
	             options.setEmbeddable(true);  
	             options.setOutputStream(out);  
	             task.setRenderOption(options);  
	   
	             // run report  
	             task.run();  
	             task.close();  
	         } catch (Exception e) {  
	             logger.log(Level.SEVERE, e.getMessage(), e);  
	             throw new ServletException(e);  
	         }  
	         return out;  
	     }  
	     
}

BirtInitializationPlugin.java


import javax.servlet.ServletException;  

import org.apache.struts.action.ActionServlet;  
import org.apache.struts.action.PlugIn;  
import org.apache.struts.config.ModuleConfig;  
  
import br.com.sis.util.BirtEngine;

public class BirtInitializationPlugin implements PlugIn
{
	     public void init(ActionServlet servlet, ModuleConfig conf) throws ServletException {  
	         BirtEngine.initBirtConfig();  
	     }  
	   
	     public void destroy() {  
	         BirtEngine.destroyBirtEngine();  
	     }  
	   
}  

BirtEngine.java


import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;

import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import javax.servlet.*;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.core.framework.IPlatformContext;
import  org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;

public class BirtEngine {

private static IReportEngine birtEngine = null;

private static Properties configProps = new Properties();

private final static String configFile = "BirtConfig.properties"; // Não sei onde este arquivo de properties deve ficar

public static synchronized void initBirtConfig() {
 loadEngineProps();
}

public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
 if (birtEngine == null) 
 {
  EngineConfig config = new EngineConfig();
  if( configProps != null){
   String logLevel = configProps.getProperty("logLevel");

  // Level level = Level.OFF;
   Level level = Level.WARNING;
   if ("SEVERE".equalsIgnoreCase(logLevel)) 
   {
    level = Level.SEVERE;
   } else if ("WARNING".equalsIgnoreCase(logLevel))
   {
    level = Level.WARNING;
   } else if ("INFO".equalsIgnoreCase(logLevel)) 
   {
    level = Level.INFO;
   } else if ("CONFIG".equalsIgnoreCase(logLevel))
   {
    level = Level.CONFIG;
   } else if ("FINE".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINE;
   } else if ("FINER".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINER;
   } else if ("FINEST".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINEST;
   } else if ("OFF".equalsIgnoreCase(logLevel)) 
   {
    level = Level.OFF;
   }

   config.setLogConfig(configProps.getProperty("logDirectory"), level);
  }

  config.setEngineHome(sc.getRealPath("/WEB-INF/platform"));
  IPlatformContext context = new PlatformServletContext( sc );
  config.setPlatformContext( context );


  try
  {
   Platform.startup( config );  // Está dando erro aqui!!!
  }
  catch ( BirtException e )
  {
   e.printStackTrace( );
  }

  IReportEngineFactory factory = (IReportEngineFactory) Platform
  .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  birtEngine = factory.createReportEngine( config );


 }
 return birtEngine;
}

public static synchronized void destroyBirtEngine() {
 if (birtEngine == null) {
  return;
 }  
 birtEngine.shutdown();
 Platform.shutdown();
 birtEngine = null;
}

public Object clone() throws CloneNotSupportedException {
 throw new CloneNotSupportedException();
}

private static void loadEngineProps() {
 try {
  //Config File must be in classpath
  ClassLoader cl = Thread.currentThread ().getContextClassLoader();
  InputStream in = null;
  in = cl.getResourceAsStream (configFile);
  configProps.load(in);
  in.close();


 } catch (IOException e) {
  e.printStackTrace();
 }

}

}

Página jsp de teste

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/birt.tld" prefix="birt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>

<birt:report id="reportHTML" reportDesign="\relatorios\sis\Dados.rptdesign"
height="450"
width="700"
format="html">
</birt:report>

</body>
</html>

Alguém aí usa o BIRT pra me dar uma ajudinha?!

Alguém teria aí um exemplo de relatórios com o BIRT usando Struts? Já seria de grande ajuda…

:cry:

Agora tá dando esse erro aki:

Strack Trace:
13/08/2008 17:33:43 org.eclipse.birt.report.engine.api.impl.ReportEngineHelper openReportDesign

SEVERE: invalid design file C:\eclipse\workspace\gepla\relatorios\sci\DadosSCI.rptdesign

13/08/2008 17:33:47 br.com.gepla.action.SCIGraficoAction renderReportPage

SEVERE: The design file C:\eclipse\workspace\gepla\relatorios\sci\DadosSCI.rptdesign has error and can not be run.

org.eclipse.birt.report.engine.api.EngineException

: The design file C:\eclipse\workspace\gepla\relatorios\sci\DadosSCI.rptdesign has error and can not be run. 
at org.eclipse.birt.report.engine.api.impl.ReportEngineHelper.openReportDesign(

ReportEngineHelper.java:127) 
at org.eclipse.birt.report.engine.api.impl.ReportEngine.openReportDesign(

ReportEngine.java:220) 
at br.com.gepla.action.SCIGraficoAction.renderReportPage(

SCIGraficoAction.java:96) 
at br.com.gepla.action.SCIGraficoAction.execute(

SCIGraficoAction.java:54) 
at org.apache.struts.action.RequestProcessor.processActionPerform(

RequestProcessor.java:431) 
at org.apache.struts.action.RequestProcessor.process(

RequestProcessor.java:236) 
at org.apache.struts.action.ActionServlet.process(

ActionServlet.java:1196) 
at org.apache.struts.action.ActionServlet.doGet(

ActionServlet.java:414) 
at javax.servlet.http.HttpServlet.service(

HttpServlet.java:689) 
at javax.servlet.http.HttpServlet.service(

HttpServlet.java:802) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(

ApplicationFilterChain.java:237) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(

ApplicationFilterChain.java:157) 
at org.apache.catalina.core.StandardWrapperValve.invoke(

StandardWrapperValve.java:214) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardContextValve.invokeInternal(

StandardContextValve.java:198) 
at org.apache.catalina.core.StandardContextValve.invoke(

StandardContextValve.java:152) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardHostValve.invoke(

StandardHostValve.java:137) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.valves.ErrorReportValve.invoke(

ErrorReportValve.java:118) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:102) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardEngineValve.invoke(

StandardEngineValve.java:109) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.ContainerBase.invoke(

ContainerBase.java:929) 
at org.apache.coyote.tomcat5.CoyoteAdapter.service(

CoyoteAdapter.java:160) 
at org.apache.coyote.http11.Http11Processor.process(

Http11Processor.java:799) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(

Http11Protocol.java:705) 
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(

PoolTcpEndpoint.java:577) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(

ThreadPool.java:683) 
at java.lang.Thread.run(

Thread.java:595) 
Caused by: Error.DesignFileException.INVALID_XML - 1 errors found! 

1.) ( line = 0, tag = null) 

org.eclipse.birt.report.model.parser.DesignParserException (code = Error.DesignParserException.UNSUPPORTED_VERSION, message : The report file of version "3.2.15" is not supported.) 

at org.eclipse.birt.report.model.parser.ModuleReader.readModule(

ModuleReader.java:115) 
at org.eclipse.birt.report.model.parser.ModuleReader.readModule(

ModuleReader.java:203) 
at org.eclipse.birt.report.model.parser.DesignReader.read(

DesignReader.java:135) 
at org.eclipse.birt.report.model.core.DesignSession.openDesign(

DesignSession.java:208) 
at org.eclipse.birt.report.model.api.SessionHandle.openDesign(

SessionHandle.java:173) 
at org.eclipse.birt.report.engine.parser.ReportParser.getDesignHandle(

ReportParser.java:133) 
at org.eclipse.birt.report.engine.api.impl.ReportEngineHelper.openReportDesign(

ReportEngineHelper.java:121) 
... 33 more

13/08/2008 17:33:47 br.com.gepla.action.SCIGraficoAction execute

SEVERE: The design file C:\eclipse\workspace\gepla\relatorios\sci\DadosSCI.rptdesign has error and can not be run.

javax.servlet.ServletException

: The design file C:\eclipse\workspace\gepla\relatorios\sci\DadosSCI.rptdesign has error and can not be run. 
at br.com.gepla.action.SCIGraficoAction.renderReportPage(

SCIGraficoAction.java:113) 
at br.com.gepla.action.SCIGraficoAction.execute(

SCIGraficoAction.java:54) 
at org.apache.struts.action.RequestProcessor.processActionPerform(

RequestProcessor.java:431) 
at org.apache.struts.action.RequestProcessor.process(

RequestProcessor.java:236) 
at org.apache.struts.action.ActionServlet.process(

ActionServlet.java:1196) 
at org.apache.struts.action.ActionServlet.doGet(

ActionServlet.java:414) 
at javax.servlet.http.HttpServlet.service(

HttpServlet.java:689) 
at javax.servlet.http.HttpServlet.service(

HttpServlet.java:802) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(

ApplicationFilterChain.java:237) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(

ApplicationFilterChain.java:157) 
at org.apache.catalina.core.StandardWrapperValve.invoke(

StandardWrapperValve.java:214) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardContextValve.invokeInternal(

StandardContextValve.java:198) 
at org.apache.catalina.core.StandardContextValve.invoke(

StandardContextValve.java:152) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardHostValve.invoke(

StandardHostValve.java:137) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.valves.ErrorReportValve.invoke(

ErrorReportValve.java:118) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:102) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.StandardEngineValve.invoke(

StandardEngineValve.java:109) 
at org.apache.catalina.core.StandardValveContext.invokeNext(

StandardValveContext.java:104) 
at org.apache.catalina.core.StandardPipeline.invoke(

StandardPipeline.java:520) 
at org.apache.catalina.core.ContainerBase.invoke(

ContainerBase.java:929) 
at org.apache.coyote.tomcat5.CoyoteAdapter.service(

CoyoteAdapter.java:160) 
at org.apache.coyote.http11.Http11Processor.process(

Http11Processor.java:799) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(

Http11Protocol.java:705) 
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(

PoolTcpEndpoint.java:577) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(

ThreadPool.java:683) 
at java.lang.Thread.run(

Thread.java:595) 

Pelo que eu entendi, me parece ser um problema de versão do relatório (The report file of version “3.2.15” is not supported.) , mas não sei se poderia ser um problema nas bibliotecas que estariam desatualizadas (baixei diretamente no eclipse Europa)… Alguém aí já passou por isso!!!

:cry: