Jump to: navigation, search

Difference between revisions of "Dynamic Report Servlet"

 
(Replacing page with '== Dynamic Report Servlet == Moved to the new examples area. Java - Dynamic Report Servlet (BIRT) Category:BIRT Category:BIRT Example OLD')
 
(6 intermediate revisions by 2 users not shown)
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 and executing the modified report.
+
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. [[http://wiki.eclipse.org/index.php/Servlet_Example]]
+
Add comments at the bottom of the example.
+
  
[[BIRT Design Engine API]] Return to the BIRT Design Engine API examples
 
  
== Source ==
+
[[Category:BIRT]]
===DynamicReport.java===
+
[[Category:BIRT Example OLD]]
+
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");
+
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 or template
+
design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );
+
ReportDesignHandle report = (ReportDesignHandle) design.getDesignHandle( );
+
buildReport( 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(ReportDesignHandle designHandle){
+
+
+
try{
+
ElementFactory designFactory = designHandle.getElementFactory( );
+
+
buildDataSource(designFactory, designHandle);
+
+
//Hook your dynamic code here
+
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.size() );
+
table.setWidth( "100%" );
+
table.setDataSet( designHandle.findDataSet( "ds" ) );
+
+
+
PropertyHandle computedSet = table.getColumnBindings( );
+
ComputedColumn  cs1 = null;
+
+
for( int i=0; i < cols.size(); i++){
+
cs1 = StructureFactory.createComputedColumn();
+
cs1.setName((String)cols.get(i));
+
cs1.setExpression("dataSetRow[\"" + (String)cols.get(i) + "\"]");
+
computedSet.addItem(cs1);
+
}
+
+
+
// table header
+
RowHandle tableheader = (RowHandle) table.getHeader( ).get( 0 );
+
+
+
for( int i=0; i < cols.size(); i++){
+
LabelHandle label1 = designFactory.newLabel( (String)cols.get(i) );
+
  label1.setText((String)cols.get(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.size(); i++){
+
CellHandle cell = (CellHandle) tabledetail.getCells( ).get( i );
+
DataItemHandle data = designFactory.newDataItem( "data_"+(String)cols.get(i) );
+
data.setResultSetColumn( (String)cols.get(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(ArrayList 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.size(); i++){
+
qry += " " + cols.get(i);
+
if( i != (cols.size() -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();
+
+
}
+
+
}
+
+
+
----
+
 
+
== Comments ==
+
Please enter comments below by selecting the edit icon to the right.
+
You will need a Bugzilla account to add comments.
+
 
+
----
+

Latest revision as of 12:12, 9 April 2007

Dynamic Report Servlet

Moved to the new examples area. Java - Dynamic Report Servlet (BIRT)