KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > engine > BirtReportEngine


1 /*
2  * Copyright (C) 2006 by Open Source Software Solutions, LLC and Contributors
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16  * Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  * Original Author : Roberto Nibali - rnibali@pyx.ch
19  * Contributor(s) : Erik Swenson - erik@oreports.com
20  *
21  */

22
23 package org.efs.openreports.engine;
24
25 import java.io.ByteArrayOutputStream JavaDoc;
26 import java.util.HashMap JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Map JavaDoc;
30
31 import org.apache.log4j.Logger;
32 import org.eclipse.birt.report.engine.api.EngineConstants;
33 import org.eclipse.birt.report.engine.api.HTMLRenderContext;
34 import org.eclipse.birt.report.engine.api.HTMLRenderOption;
35 import org.eclipse.birt.report.engine.api.IReportEngine;
36 import org.eclipse.birt.report.engine.api.IReportRunnable;
37 import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
38 import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
39 import org.eclipse.birt.report.model.api.ReportDesignHandle;
40 import org.eclipse.birt.report.model.api.activity.SemanticException;
41 import org.efs.openreports.engine.input.ReportEngineInput;
42 import org.efs.openreports.engine.output.ReportEngineOutput;
43 import org.efs.openreports.objects.Report;
44 import org.efs.openreports.objects.ReportDataSource;
45 import org.efs.openreports.providers.BirtProvider;
46 import org.efs.openreports.providers.DataSourceProvider;
47 import org.efs.openreports.providers.DirectoryProvider;
48 import org.efs.openreports.providers.PropertiesProvider;
49 import org.efs.openreports.providers.ProviderException;
50
51 /**
52  * Eclipse BIRT ReportEngine implementation. This implementation sets the
53  * BIRTHome directory to the 'platform' directory underneath the 'reports'
54  * directory. All images created during report generation are stored in the
55  * 'reports/images/temp' directory.
56  *
57  * @author Roberto Nibali
58  *
59  */

60 public class BirtReportEngine extends org.efs.openreports.engine.ReportEngine
61 {
62     protected static Logger log = Logger.getLogger(BirtReportEngine.class);
63     
64     public BirtReportEngine(DataSourceProvider dataSourceProvider,
65             DirectoryProvider directoryProvider, PropertiesProvider propertiesProvider)
66     {
67         super(dataSourceProvider, directoryProvider, propertiesProvider);
68     }
69
70     /**
71      * Generates a report from a BIRT report design.
72      */

73     public ReportEngineOutput generateReport(ReportEngineInput input)
74             throws ProviderException
75     {
76         Report report = input.getReport();
77         Map JavaDoc parameters = input.getParameters();
78         
79         ReportEngineOutput output = new ReportEngineOutput();
80         ByteArrayOutputStream JavaDoc out = new ByteArrayOutputStream JavaDoc();
81
82         IReportEngine engine = BirtProvider
83                 .getBirtEngine(directoryProvider.getReportDirectory() + "platform");
84
85         // Set options for task
86
HTMLRenderOption options = new HTMLRenderOption();
87         options.setOutputStream(out);
88                
89         HTMLRenderContext renderContext = new HTMLRenderContext();
90         renderContext.setImageDirectory(directoryProvider.getReportImageTempDirectory());
91         renderContext.setBaseImageURL("report-images");
92          
93         HashMap JavaDoc contextMap = new HashMap JavaDoc();
94         contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);
95                 
96         try
97         {
98             String JavaDoc designFile = directoryProvider.getReportDirectory() + report.getFile();
99             
100             log.info("Loading BIRT report design: " + report.getFile());
101             
102             IReportRunnable design = engine.openReportDesign(designFile);
103             
104             IRunAndRenderTask task = engine.createRunAndRenderTask(design);
105             task.setAppContext(contextMap);
106             
107             handleDataSourceOverrides(design);
108             
109             if (input.getExportType() == ReportEngine.EXPORT_PDF)
110             {
111                 output.setContentType(ReportEngineOutput.CONTENT_TYPE_PDF);
112                 options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
113             }
114             else if (input.getExportType() == ReportEngine.EXPORT_HTML)
115             {
116                 output.setContentType(ReportEngineOutput.CONTENT_TYPE_HTML);
117                 options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
118             }
119             else
120             {
121                 log.error("Export type not yet implemented: " + input.getExportType());
122             }
123             
124             task.setRenderOption(options);
125             task.setParameterValues(parameters);
126             task.validateParameters();
127             
128             log.info("Generating BIRT report: " + report.getName());
129             
130             task.run();
131             task.close();
132             
133             log.info("Finished Generating BIRT report: " + report.getName());
134             
135             output.setContent(out.toByteArray());
136         }
137         catch (Throwable JavaDoc e)
138         {
139             log.error("generateReport Exception", e);
140             throw new ProviderException(e.toString());
141         }
142         
143         return output;
144     }
145     
146     /*
147      * Overrides BIRT DataSources with OpenReports DataSources. In order
148      * for DataSources to be overriden, the name of the DataSource in the
149      * BIRT rptdesign file must match the name of an existing OpenReports
150      * DataSource.
151      */

152     private void handleDataSourceOverrides(IReportRunnable design)
153     {
154         ReportDesignHandle reportDH = (ReportDesignHandle) design.getDesignHandle();
155         
156         List JavaDoc birtDataSources = reportDH.getAllDataSources();
157         
158         if (birtDataSources == null) return;
159         
160         Iterator JavaDoc iterator = birtDataSources.iterator();
161         while (iterator.hasNext())
162         {
163             OdaDataSourceHandle dataSH = (OdaDataSourceHandle) iterator.next();
164
165             try
166             {
167                 ReportDataSource reportDataSource = dataSourceProvider
168                         .getDataSource(dataSH.getName());
169
170                 if (reportDataSource != null)
171                 {
172                     log.info("Overriding BIRT DataSource: " + dataSH.getName());
173                     
174                     log.debug("Original connection properties for: " + dataSH.getName());
175                     log.debug("URL: " + dataSH.getStringProperty("odaURL"));
176                     log.debug("DRIVER: " + dataSH.getStringProperty("odaDriverClass"));
177                     log.debug("USER: " + dataSH.getStringProperty("odaUser"));
178
179                     try
180                     {
181                         dataSH.setStringProperty("odaURL", reportDataSource.getUrl());
182                         dataSH.setStringProperty("odaDriverClass", reportDataSource.getDriverClassName());
183                         dataSH.setStringProperty("odaUser", reportDataSource.getUsername());
184                         dataSH.setStringProperty("odaPassword", reportDataSource.getPassword());
185                     }
186                     catch (SemanticException e)
187                     {
188                         log.error("SemanticException", e);
189                     }
190                     
191                     log.debug("New connection properties for: " + dataSH.getName());
192                     log.debug("URL: " + dataSH.getStringProperty("odaURL"));
193                     log.debug("DRIVER: " + dataSH.getStringProperty("odaDriverClass"));
194                     log.debug("USER: " + dataSH.getStringProperty("odaUser"));
195                 }
196                 else
197                 {
198                     log.info("Unknown data source: " + dataSH.getName());
199                 }
200             }
201             catch (ProviderException pe)
202             {
203                 log.error("ProviderException", pe);
204             }
205         }
206         
207         design.setDesignHandle(reportDH);
208     }
209 }
210
Popular Tags