1 22 23 package org.efs.openreports.engine; 24 25 import java.io.ByteArrayOutputStream ; 26 import java.util.HashMap ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import java.util.Map ; 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 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 73 public ReportEngineOutput generateReport(ReportEngineInput input) 74 throws ProviderException 75 { 76 Report report = input.getReport(); 77 Map parameters = input.getParameters(); 78 79 ReportEngineOutput output = new ReportEngineOutput(); 80 ByteArrayOutputStream out = new ByteArrayOutputStream (); 81 82 IReportEngine engine = BirtProvider 83 .getBirtEngine(directoryProvider.getReportDirectory() + "platform"); 84 85 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 contextMap = new HashMap (); 94 contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext); 95 96 try 97 { 98 String 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 e) 138 { 139 log.error("generateReport Exception", e); 140 throw new ProviderException(e.toString()); 141 } 142 143 return output; 144 } 145 146 152 private void handleDataSourceOverrides(IReportRunnable design) 153 { 154 ReportDesignHandle reportDH = (ReportDesignHandle) design.getDesignHandle(); 155 156 List birtDataSources = reportDH.getAllDataSources(); 157 158 if (birtDataSources == null) return; 159 160 Iterator 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 |