Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "Portlet Example"

 
(Replacing page with 'Moved to Portlet Example (BIRT) 2.1')
 
Line 1: Line 1:
== Portlet Example ==
+
Moved to [[Portlet Example (BIRT) 2.1]]
 
+
This example shows how to deploy BIRT Report Engine in a portal. This is a basic example and shows how to deploy a BIRT report in a simple Apache Jetspeed-2 portlet. It is based on [[Servlet Example]] in BIRT Report Engine API Examples.
+
 
+
====  Web Application Setup ====
+
1. Create a directory webreport/WEB-INF/lib.
+
 
+
2. Copy all the jars in the birt-runtime-2_1_1/ReportEngine/lib directory from the Report Engine download into webreport/WEB-INF/lib directory.
+
 
+
3. Create a directory named platform in the WEB-INF folder.
+
 
+
4. Copy the birt-runtime-2_1_1/ReportEngine/plugins and birt-runtime-2_1_1/ReportEngine/configuration directories to the platform directory.
+
 
+
5. Copy iText.jar to the platform/plugins/com.lowagie.itext/lib directory. If the directory does not exist, create it.
+
 
+
6. Create directories Images and Reports in webreport folder.
+
 
+
====  Report Application ====
+
 
+
1. It consist of three files that are archived into webreport.jar. Copy the following three files to a folder.
+
 
+
* BirtConfig.properties - Configuration properties for the Engine.
+
* BirtEngine.java - Class used to initialize the Report Engine.
+
* WebReport.java - The portlet that handles report generation.
+
 
+
==== Source ====
+
 
+
'''BirtConfig.properties'''
+
logDirectory=c:/temp
+
logLevel=FINEST
+
 
+
'''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";
+
+
  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;
+
    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("");
+
  IPlatformContext context = new PlatformServletContext( sc );
+
  config.setPlatformContext( context );
+
+
+
  try
+
  {
+
  Platform.startup( config );
+
  }
+
  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();
+
}
+
+
}
+
+
}
+
 
+
'''WebReport.java'''
+
import java.util.HashMap;
+
import java.util.logging.Level;
+
import java.util.logging.Logger;
+
+
import javax.servlet.ServletContext;
+
import org.apache.pluto.core.impl.PortletContextImpl;
+
+
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.IReportRunnable;
+
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
+
import org.eclipse.birt.report.engine.api.IReportEngine;
+
+
public class WebReport extends javax.portlet.GenericPortlet {
+
+
/**
+
*
+
*/
+
private static final long serialVersionUID = 1L;
+
 
+
/**
+
* Constructor of the object.
+
*/
+
private IReportEngine birtReportEngine = null;
+
protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );
+
+
public WebReport() {
+
  super();
+
}
+
+
/**
+
* Destruction of the portlet.
+
*/
+
public void destroy() {
+
  super.destroy();
+
  BirtEngine.destroyBirtEngine();
+
}
+
+
public void doView(javax.portlet.RenderRequest req, javax.portlet.RenderResponse resp)
+
                throws javax.portlet.PortletException, java.io.IOException {
+
  resp.setContentType("text/html");
+
+
    // Name of your report
+
    String reportName = "simple_report.rptdesign";
+
    ServletContext sc = ((PortletContextImpl)req.getPortletSession().getPortletContext()).getServletContext();
+
  this.birtReportEngine = BirtEngine.getBirtEngine(sc);
+
+
    //setup image directory
+
    HTMLRenderContext renderContext = new HTMLRenderContext();
+
    renderContext.setBaseImageURL(req.getContextPath()+"/images");
+
    renderContext.setImageDirectory(sc.getRealPath("/images"));
+
+
    logger.log( Level.FINE, "image directory " + sc.getRealPath("/images"));
+
    System.out.println("stdout image directory " + sc.getRealPath("/images"));
+
+
    HashMap contextMap = new HashMap();
+
    contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext );
+
+
    IReportRunnable design;
+
    try
+
    {
+
    //Open report design
+
    design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+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.setOutputStream(resp.getPortletOutputStream());
+
    task.setRenderOption(options);
+
+
    //run report
+
    task.run();
+
    task.close();
+
    }catch (Exception e){
+
+
    e.printStackTrace();
+
    throw new javax.portlet.PortletException( e );
+
    }
+
}
+
+
+
/**
+
* Initialization of the portlet.
+
*
+
* @throws PortletException if an error occure
+
*/
+
public void init() throws javax.portlet.PortletException {
+
  BirtEngine.initBirtConfig();
+
}
+
+
}
+
 
+
2. Copy a report design file (e.g simple_report.rptdesign) to webreport/Reports directory. This is the report which will be deployed as a portlet. It can be an example report or any report designed previously. Make sure any dependent jar files (e.g driver jars) required by the report are copied to webreport/WEB-INF/lib. This report design file is referred in WebReport.java in the following line:
+
 
+
String reportName = "simple_report.rptdesign";
+
 
+
If using a report file with different name, modify WebReport.java accordingly.
+
 
+
3. Build the java classes. To build, add the following to the build path:
+
 
+
* All jars from birt-runtime-2_1_1/ReportEngine/lib
+
* portlet-api-1.0.jar and pluto-1.0.1.jar from $JETSPEED_HOME/shared/lib, where $JETSPEED_HOME is the directory where Jetspeed is installed.
+
* servlet.jar from the Tomcat Eclipse plug-in
+
 
+
4. Archive the .class files and BirtConfig.properties into webreport.jar.
+
 
+
5. Copy webreport.jar to webreport/WEB-INF/lib directory.
+
 
+
====  Deployment descriptors ====
+
 
+
1. Create the file portlet.xml in webreport/WEB-INF directory.
+
 
+
<?xml version="1.0" encoding="UTF-8"?>
+
<portlet-app id="webreport" version="1.0">
+
  <portlet id="WebReport">
+
    <portlet-name>WebReport</portlet-name>
+
    <display-name>Simple portal displaying a BIRT report</display-name>
+
    <portlet-class>WebReport</portlet-class>
+
    <supports>
+
      <mime-type>text/html</mime-type>
+
      <portlet-mode>VIEW</portlet-mode>
+
    </supports>
+
    <supported-locale>en</supported-locale>
+
    <portlet-info>
+
      <title>BIRT report</title>
+
      <short-title>BIRT report in a portal</short-title>
+
    </portlet-info>
+
  </portlet>
+
</portlet-app>
+
 
+
2. Create the file web.xml in webreport/WEB-INF directory.
+
 
+
<?xml version="1.0" encoding="UTF-8"?>
+
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+
<web-app>
+
  <display-name>WebReport</display-name>
+
  <description>BIRT report in a portal</description>
+
</web-app>
+
 
+
====  Deployment  ====
+
 
+
1. Create the WAR file. From the directory WebReport combine the files into a war file using the command: jar cvf ../webreport.war .
+
 
+
2. Deploy the WAR file. Copy the war file to $JETSPEED_HOME/webapps/jetspeed/WEB-INF/deploy. Jetspeed-2 will deploy the webapp.
+
 
+
3. Create a PSML file, webreport.psml, and copy it to the $JETSPEED_HOME/webapps/jetspeed/WEB-INF/pages directory of your Jetspeed Portal.
+
 
+
<?xml version="1.0" encoding="UTF-8"?>
+
<page>
+
  <defaults
+
    skin="orange"
+
    layout-decorator="tigris"
+
    portlet-decorator="tigris"
+
  />
+
  <title>The simplest portlet in the world</title>
+
  <metadata name="title" xml:lang="fr">La plus simple portlet du monde</metadata>
+
+
  <fragment id="webreport" type="layout" name="jetspeed-layouts::VelocityTwoColumns">
+
    <fragment id="webreport-1" type="portlet" name="webreport::WebReport">
+
      <property layout="TwoColumns" name="row" value="0" />
+
      <property layout="TwoColumns" name="column" value="0" />
+
    </fragment>
+
  </fragment>
+
+
  <security-constraints>
+
    <security-constraints-ref>public-view</security-constraints-ref>
+
  </security-constraints>
+
</page>
+
+
4. Test the portlet using http://localhost:8080/jetspeed/portal/webreport.psml in a browser.
+

Latest revision as of 15:29, 4 October 2007

Moved to Portlet Example (BIRT) 2.1

Back to the top