|
|
Line 1: |
Line 1: |
| == Dynamic Report Servlet == | | == Dynamic Report Servlet == |
| | | |
− | This example demonstrate using the DE API to add a table to an existing report or template while running it within a servlet.
| + | Moved to the new examples area. [[Java - Dynamic Report Servlet (BIRT)]] |
− | This example should be setup as described in the Report Engine API [[Servlet Example]]. This class should replace the WebReport class.
| + | |
− | Add comments at the bottom of the example.
| + | |
| | | |
− | [[BIRT Design Engine API]] Return to the BIRT Design Engine API examples
| |
| | | |
− | == Source ==
| + | [[Category:BIRT]] |
− | ===Dynamic.html===
| + | [[Category:BIRT Example OLD]] |
− | Place this file in the webapps/DynamicReport directory.
| + | |
− | <html>
| + | |
− | <head>
| + | |
− | </head>
| + | |
− | <body>
| + | |
− | The Query that is used for this example is Select * From OFFICES
| + | |
− | <form id="form1" method="get" action="http://localhost:8080/DynamicReport/run">
| + | |
− | <select name="dyna1" multiple size="8" >
| + | |
− | <option value="COUNTRY">COUNTRY</option>
| + | |
− | <option value="CITY">CITY</option>
| + | |
− | <option value="STATE">STATE</option>
| + | |
− | <option value="OFFICECODE">OFFICECODE</option>
| + | |
− | <option value="ADDRESSLINE1">ADDRESSLINE1</option>
| + | |
− | <option value="ADDRESSLINE2">ADDRESSLINE2</option>
| + | |
− | <option value="POSTALCODE">POSTALCODE</option>
| + | |
− | <option value="TERRITORY">TERRITORY</option>
| + | |
− | </select><br>
| + | |
− | <INPUT TYPE="SUBMIT" VALUE="Run Dynamic Report">
| + | |
− | <INPUT TYPE="HIDDEN" NAME="ReportName" Value="DynamicTableExample.rpttemplate">
| + | |
− | </form>
| + | |
− | </body>
| + | |
− | </html>
| + | |
− | ===DynamicReport.java===
| + | |
− |
| + | |
− | import java.io.IOException;
| + | |
− | import java.io.PrintWriter;
| + | |
− | import java.util.ArrayList;
| + | |
− | 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.HttpServlet;
| + | |
− | import javax.servlet.http.HttpServletRequest;
| + | |
− | import javax.servlet.http.HttpServletResponse;
| + | |
− |
| + | |
− | 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;
| + | |
− | import org.eclipse.birt.report.model.api.CellHandle;
| + | |
− | import org.eclipse.birt.report.model.api.DataItemHandle;
| + | |
− | import org.eclipse.birt.report.model.api.ElementFactory;
| + | |
− | import org.eclipse.birt.report.model.api.LabelHandle;
| + | |
− | import org.eclipse.birt.report.model.api.OdaDataSetHandle;
| + | |
− | import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
| + | |
− | import org.eclipse.birt.report.model.api.PropertyHandle;
| + | |
− | import org.eclipse.birt.report.model.api.ReportDesignHandle;
| + | |
− | import org.eclipse.birt.report.model.api.RowHandle;
| + | |
− | import org.eclipse.birt.report.model.api.StructureFactory;
| + | |
− | import org.eclipse.birt.report.model.api.TableHandle;
| + | |
− | import org.eclipse.birt.report.model.api.activity.SemanticException;
| + | |
− | import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
| + | |
− |
| + | |
− |
| + | |
− | public class DynamicReport extends HttpServlet {
| + | |
− |
| + | |
− | /**
| + | |
− | *
| + | |
− | */
| + | |
− | private static final long serialVersionUID = 1L;
| + | |
− | /**
| + | |
− | * Constructor of the object.
| + | |
− | */
| + | |
− | private IReportEngine birtReportEngine = null;
| + | |
− | protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );
| + | |
− |
| + | |
− | public DynamicReport() {
| + | |
− | super();
| + | |
− | }
| + | |
− |
| + | |
− | /**
| + | |
− | * Destruction of the servlet. <br>
| + | |
− | */
| + | |
− | public void destroy() {
| + | |
− | super.destroy();
| + | |
− | BirtEngine.destroyBirtEngine();
| + | |
− | }
| + | |
− |
| + | |
− |
| + | |
− | /**
| + | |
− | * The doGet method of the servlet. <br>
| + | |
− | *
| + | |
− | */
| + | |
− | public void doGet(HttpServletRequest req, HttpServletResponse resp)
| + | |
− | throws ServletException, IOException {
| + | |
− |
| + | |
− | //get report name and launch the engine
| + | |
− | resp.setContentType("text/html");
| + | |
− | //resp.setContentType( "application/pdf" );
| + | |
− | //resp.setHeader ("Content-Disposition","inline; filename=test.pdf");
| + | |
− | String reportName = req.getParameter("ReportName");
| + | |
− | String[] cols = (String[])req.getParameterMap().get("dyna1");
| + | |
− | ServletContext sc = req.getSession().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 );
| + | |
− | ReportDesignHandle report = (ReportDesignHandle) design.getDesignHandle( );
| + | |
− | buildReport( cols, report );
| + | |
− |
| + | |
− | //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.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
| + | |
− | options.setOutputStream(resp.getOutputStream());
| + | |
− | task.setRenderOption(options);
| + | |
− |
| + | |
− | //run report
| + | |
− | task.run();
| + | |
− | task.close();
| + | |
− | }catch (Exception e){
| + | |
− |
| + | |
− | e.printStackTrace();
| + | |
− | throw new ServletException( e );
| + | |
− | }
| + | |
− | }
| + | |
− |
| + | |
− | public void buildReport(String[] cols, ReportDesignHandle designHandle){
| + | |
− |
| + | |
− |
| + | |
− | try{
| + | |
− | ElementFactory designFactory = designHandle.getElementFactory( );
| + | |
− |
| + | |
− | buildDataSource(designFactory, designHandle);
| + | |
− |
| + | |
− |
| + | |
− | //ArrayList cols = new ArrayList();
| + | |
− | //cols.add("OFFICECODE");
| + | |
− | //cols.add("CITY");
| + | |
− | //cols.add("COUNTRY");
| + | |
− |
| + | |
− | buildDataSet(cols, "From Offices", designFactory, designHandle);
| + | |
− |
| + | |
− | TableHandle table = designFactory.newTableItem( "table", cols.length );
| + | |
− | table.setWidth( "100%" );
| + | |
− | table.setDataSet( designHandle.findDataSet( "ds" ) );
| + | |
− |
| + | |
− |
| + | |
− | PropertyHandle computedSet = table.getColumnBindings( );
| + | |
− | ComputedColumn cs1 = null;
| + | |
− |
| + | |
− | for( int i=0; i < cols.length; i++){
| + | |
− | cs1 = StructureFactory.createComputedColumn();
| + | |
− | cs1.setName((String)cols[i]);
| + | |
− | cs1.setExpression("dataSetRow[\"" + (String)cols[i] + "\"]");
| + | |
− | computedSet.addItem(cs1);
| + | |
− | }
| + | |
− |
| + | |
− |
| + | |
− | // table header
| + | |
− | RowHandle tableheader = (RowHandle) table.getHeader( ).get( 0 );
| + | |
− |
| + | |
− |
| + | |
− | for( int i=0; i < cols.length; i++){
| + | |
− | LabelHandle label1 = designFactory.newLabel( (String)cols[i] );
| + | |
− | label1.setText((String)cols[i]);
| + | |
− | CellHandle cell = (CellHandle) tableheader.getCells( ).get( i );
| + | |
− | cell.getContent( ).add( label1 );
| + | |
− | }
| + | |
− |
| + | |
− | // table detail
| + | |
− | RowHandle tabledetail = (RowHandle) table.getDetail( ).get( 0 );
| + | |
− | for( int i=0; i < cols.length; i++){
| + | |
− | CellHandle cell = (CellHandle) tabledetail.getCells( ).get( i );
| + | |
− | DataItemHandle data = designFactory.newDataItem( "data_"+(String)cols[i] );
| + | |
− | data.setResultSetColumn( (String)cols[i]);
| + | |
− | cell.getContent( ).add( data );
| + | |
− | }
| + | |
− |
| + | |
− |
| + | |
− |
| + | |
− | designHandle.getBody( ).add( table );
| + | |
− | }catch(Exception e){
| + | |
− | e.printStackTrace();
| + | |
− | }
| + | |
− |
| + | |
− | }
| + | |
− |
| + | |
− | void buildDataSource( ElementFactory designFactory, ReportDesignHandle designHandle ) throws SemanticException
| + | |
− | {
| + | |
− |
| + | |
− | OdaDataSourceHandle dsHandle = designFactory.newOdaDataSource(
| + | |
− | "Data Source", "org.eclipse.birt.report.data.oda.jdbc" );
| + | |
− | dsHandle.setProperty( "odaDriverClass",
| + | |
− | "org.eclipse.birt.report.data.oda.sampledb.Driver" );
| + | |
− | dsHandle.setProperty( "odaURL", "jdbc:classicmodels:sampledb" );
| + | |
− | dsHandle.setProperty( "odaUser", "ClassicModels" );
| + | |
− | dsHandle.setProperty( "odaPassword", "" );
| + | |
− |
| + | |
− | designHandle.getDataSources( ).add( dsHandle );
| + | |
− |
| + | |
− | }
| + | |
− |
| + | |
− | void buildDataSet(String[] cols, String fromClause, ElementFactory designFactory, ReportDesignHandle designHandle ) throws SemanticException
| + | |
− | {
| + | |
− |
| + | |
− | OdaDataSetHandle dsHandle = designFactory.newOdaDataSet( "ds",
| + | |
− | "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
| + | |
− | dsHandle.setDataSource( "Data Source" );
| + | |
− | String qry = "Select ";
| + | |
− | for( int i=0; i < cols.length; i++){
| + | |
− | qry += " " + cols[i];
| + | |
− | if( i != (cols.length -1) ){
| + | |
− | qry += ",";
| + | |
− | }
| + | |
− |
| + | |
− | }
| + | |
− | qry += " " + fromClause;
| + | |
− |
| + | |
− | dsHandle.setQueryText( qry );
| + | |
− |
| + | |
− | designHandle.getDataSets( ).add( dsHandle );
| + | |
− |
| + | |
− |
| + | |
− | }
| + | |
− | /**
| + | |
− | * The doPost method of the servlet. <br>
| + | |
− | *
| + | |
− | */
| + | |
− | public void doPost(HttpServletRequest request, HttpServletResponse response)
| + | |
− | throws ServletException, IOException {
| + | |
− |
| + | |
− | response.setContentType("text/html");
| + | |
− | PrintWriter out = response.getWriter();
| + | |
− | out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
| + | |
− | out.println("<HTML>");
| + | |
− | out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
| + | |
− | out.println(" <BODY>");
| + | |
− | out.println(" Post Not Supported");
| + | |
− | out.println(" </BODY>");
| + | |
− | out.println("</HTML>");
| + | |
− | out.flush();
| + | |
− | out.close();
| + | |
− | }
| + | |
− |
| + | |
− | /**
| + | |
− | * Initialization of the servlet. <br>
| + | |
− | *
| + | |
− | * @throws ServletException if an error occure
| + | |
− | */
| + | |
− | public void init() throws ServletException {
| + | |
− | BirtEngine.initBirtConfig();
| + | |
− |
| + | |
− | }
| + | |
− |
| + | |
− | }
| + | |
− |
| + | |
− | ===web.xml===
| + | |
− | <?xml version="1.0" encoding="utf-8"?>
| + | |
− | <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
| + | |
− | "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
| + | |
− | <web-app>
| + | |
− |
| + | |
− | <display-name>DynamicReport</display-name>
| + | |
− |
| + | |
− |
| + | |
− | <servlet>
| + | |
− | <servlet-name>DynamicReport</servlet-name>
| + | |
− | <servlet-class>DynamicReport</servlet-class>
| + | |
− | </servlet>
| + | |
− |
| + | |
− | <servlet-mapping>
| + | |
− | <servlet-name>DynamicReport</servlet-name>
| + | |
− | <url-pattern>/run</url-pattern>
| + | |
− | </servlet-mapping>
| + | |
− |
| + | |
− |
| + | |
− | </web-app>
| + | |
− | ----
| + | |
− | ===Example Report Template===
| + | |
− | [http://download.eclipse.org/birt/downloads/examples/integrating/servlet/DynamicTableExample.rpttemplate Example Report Template]
| + | |
− | | + | |
− | ===Entire Web Application Example===
| + | |
− | [http://download.eclipse.org/birt/downloads/examples/integrating/servlet/DynamicReport.zip Entire Web Appliation]
| + | |
− | | + | |
− | == Comments ==
| + | |
− | Please enter comments below by selecting the edit icon to the right.
| + | |
− | You will need a Bugzilla account to add comments.
| + | |
− | | + | |
− | ----
| + | |
− | | + | |
− | The code uses the class BirtEngine (e.g. in the destroy() method), but its not imported - where is it from?
| + | |