1 17 18 package org.efs.openreports.actions; 19 20 import java.io.File ; 21 import java.util.*; 22 23 import javax.servlet.ServletOutputStream ; 24 import javax.servlet.http.HttpServletRequest ; 25 import javax.servlet.http.HttpServletResponse ; 26 27 import com.opensymphony.webwork.ServletActionContext; 28 import com.opensymphony.xwork.ActionContext; 29 import com.opensymphony.xwork.ActionSupport; 30 31 import org.apache.commons.lang.StringUtils; 32 import org.apache.log4j.Logger; 33 import org.efs.openreports.ORStatics; 34 import org.efs.openreports.engine.ChartReportEngine; 35 import org.efs.openreports.engine.JasperReportEngine; 36 import org.efs.openreports.engine.ReportEngine; 37 import org.efs.openreports.engine.input.ReportEngineInput; 38 import org.efs.openreports.engine.output.ChartEngineOutput; 39 import org.efs.openreports.engine.output.ReportEngineOutput; 40 import org.efs.openreports.objects.*; 41 import org.efs.openreports.providers.*; 42 import org.efs.openreports.util.LocalStrings; 43 44 import net.sf.jasperreports.engine.JRParameter; 45 import net.sf.jasperreports.engine.JRVirtualizer; 46 import net.sf.jasperreports.engine.JasperPrint; 47 import net.sf.jasperreports.engine.fill.JRFileVirtualizer; 48 49 public class ReportRunAction 50 extends ActionSupport implements ReportLogProviderAware, 51 DirectoryProviderAware, DataSourceProviderAware, 52 PropertiesProviderAware 53 { 54 protected static Logger log = Logger.getLogger(ReportRunAction.class); 55 56 private ReportLogProvider reportLogProvider; 57 private DirectoryProvider directoryProvider; 58 private DataSourceProvider dataSourceProvider; 59 private PropertiesProvider propertiesProvider; 60 61 public String execute() 62 { 63 ReportUser user = 64 (ReportUser) ActionContext.getContext().getSession().get(ORStatics.REPORT_USER); 65 66 Report report = (Report) ActionContext.getContext().getSession().get(ORStatics.REPORT); 67 68 int exportType = 69 Integer.parseInt( 70 (String ) ActionContext.getContext().getSession().get(ORStatics.EXPORT_TYPE)); 71 72 Map reportParameters = getReportParameterMap(user, report, exportType); 73 Map imagesMap = getImagesMap(); 74 75 HttpServletRequest request = ServletActionContext.getRequest(); 76 HttpServletResponse response = ServletActionContext.getResponse(); 77 78 response.setHeader("Pragma", "public"); 80 response.setHeader("Cache-Control", "max-age=0"); 81 82 ReportLog reportLog = new ReportLog(user, report, new Date()); 83 84 JRVirtualizer virtualizer = null; 85 86 try 87 { 88 if (exportType == ReportEngine.EXPORT_PDF) 89 { 90 if ("contype".equals(request.getHeader("User-Agent"))) 92 { 93 response.setContentType("application/pdf"); 94 response.setContentLength(0); 95 96 ServletOutputStream outputStream = response.getOutputStream(); 97 outputStream.close(); 98 99 return NONE; 100 } 101 } 102 103 log.debug("Filling report: " + report.getName()); 104 105 reportLogProvider.insertReportLog(reportLog); 106 107 if (report.isVirtualizationEnabled() && exportType != ReportEngine.EXPORT_IMAGE) 108 { 109 log.debug("Virtualization Enabled"); 110 virtualizer = new JRFileVirtualizer(2, directoryProvider.getTempDirectory()); 111 reportParameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer); 112 } 113 114 ReportEngineInput reportInput = new ReportEngineInput(report, reportParameters); 115 reportInput.setExportType(exportType); 116 reportInput.setImagesMap(imagesMap); 117 118 if (report.getReportChart() != null) 120 { 121 log.debug("Adding chart: " + report.getReportChart().getName()); 122 123 ChartReportEngine chartEngine = new ChartReportEngine(dataSourceProvider, 124 directoryProvider, propertiesProvider); 125 126 ChartEngineOutput chartOutput = (ChartEngineOutput) chartEngine 127 .generateReport(reportInput); 128 129 reportParameters.put("ChartImage", chartOutput.getContent()); 130 } 131 132 ReportEngineOutput reportOutput = null; 133 JasperPrint jasperPrint = null; 134 135 if (report.isJasperReport()) 136 { 137 JasperReportEngine jasperEngine = new JasperReportEngine( 138 dataSourceProvider, directoryProvider, propertiesProvider); 139 140 jasperPrint = jasperEngine.fillReport(reportInput); 141 142 log.debug("Report filled - " + report.getName() + " : size = " 143 + jasperPrint.getPages().size()); 144 145 log.debug("Exporting report: " + report.getName()); 146 147 reportOutput = jasperEngine.exportReport(jasperPrint, exportType, report 148 .getReportExportOption(), imagesMap, false); 149 } 150 else 151 { 152 ReportEngine reportEngine = new ReportEngine(dataSourceProvider, directoryProvider, propertiesProvider); 153 reportOutput = reportEngine.generateReport(reportInput); 154 } 155 156 response.setContentType(reportOutput.getContentType()); 157 158 if (exportType != ReportEngine.EXPORT_HTML && exportType != ReportEngine.EXPORT_IMAGE) 159 { 160 response.setHeader("Content-disposition", "inline; filename=" 161 + StringUtils.deleteWhitespace(report.getName()) + reportOutput.getContentExtension()); 162 } 163 164 if (exportType == ReportEngine.EXPORT_IMAGE) 165 { 166 if (jasperPrint != null) 167 { 168 ActionContext.getContext().getSession().put(ORStatics.JASPERPRINT, jasperPrint); 169 } 170 } 171 else 172 { 173 byte[] content = reportOutput.getContent(); 174 175 response.setContentLength(content.length); 176 177 ServletOutputStream out = response.getOutputStream(); 178 out.write(content, 0, content.length); 179 out.flush(); 180 out.close(); 181 } 182 183 reportLog.setEndTime(new Date()); 184 reportLog.setStatus(ReportLog.STATUS_SUCCESS); 185 reportLogProvider.updateReportLog(reportLog); 186 187 log.debug("Finished report: " + report.getName()); 188 } 189 catch (Exception e) 190 { 191 if (e.getMessage() != null && e.getMessage().indexOf("Empty") > 0) 192 { 193 addActionError(LocalStrings.getString(LocalStrings.ERROR_REPORT_EMPTY)); 194 reportLog.setStatus(ReportLog.STATUS_EMPTY); 195 } 196 else 197 { 198 addActionError(e.getMessage()); 199 200 log.error(e.getMessage()); 201 202 reportLog.setMessage(e.getMessage()); 203 reportLog.setStatus(ReportLog.STATUS_FAILURE); 204 } 205 206 reportLog.setEndTime(new Date()); 207 208 try 209 { 210 reportLogProvider.updateReportLog(reportLog); 211 } 212 catch (Exception ex) 213 { 214 log.error("Unable to create ReportLog: " + ex.getMessage()); 215 } 216 217 return ERROR; 218 } 219 finally 220 { 221 if (virtualizer != null) 222 { 223 reportParameters.remove(JRParameter.REPORT_VIRTUALIZER); 224 virtualizer.cleanup(); 225 } 226 } 227 228 if (exportType == ReportEngine.EXPORT_IMAGE) return SUCCESS; 229 230 return NONE; 231 } 232 233 protected Map getReportParameterMap(ReportUser user, Report report, int exportType) 234 { 235 Map reportParameters = new HashMap(); 236 if (ActionContext.getContext().getSession().get(ORStatics.REPORT_PARAMETERS) != null) 237 { 238 reportParameters = 239 (Map) ActionContext.getContext().getSession().get(ORStatics.REPORT_PARAMETERS); 240 } 241 242 reportParameters.put(ORStatics.IMAGE_DIR, new File (directoryProvider.getReportImageDirectory())); 243 reportParameters.put(ORStatics.REPORT_DIR, new File (directoryProvider.getReportDirectory())); 244 reportParameters.put(ORStatics.EXPORT_TYPE_PARAM, new Integer (exportType)); 245 246 return reportParameters; 247 } 248 249 protected Map getImagesMap() 250 { 251 Map imagesMap = null; 254 if (ActionContext.getContext().getSession().get(ORStatics.IMAGES_MAP) != null) 255 { 256 imagesMap = (Map) ActionContext.getContext().getSession().get(ORStatics.IMAGES_MAP); 257 } 258 else 259 { 260 imagesMap = new HashMap(); 261 ActionContext.getContext().getSession().put(ORStatics.IMAGES_MAP, imagesMap); 262 } 263 264 return imagesMap; 265 } 266 267 public void setReportLogProvider(ReportLogProvider reportLogProvider) 268 { 269 this.reportLogProvider = reportLogProvider; 270 } 271 272 public void setDirectoryProvider(DirectoryProvider directoryProvider) 273 { 274 this.directoryProvider = directoryProvider; 275 } 276 277 public void setDataSourceProvider(DataSourceProvider dataSourceProvider) 278 { 279 this.dataSourceProvider = dataSourceProvider; 280 } 281 282 public void setPropertiesProvider(PropertiesProvider propertiesProvider) 283 { 284 this.propertiesProvider = propertiesProvider; 285 } 286 }
| Popular Tags
|