/* * Copyright (C) 2006 Erik Swenson - erik@oreports.com * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have reserved a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. * */ package org.efs.openreports.dispatcher; import java.io.File; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.efs.openreports.ORStatics; import org.efs.openreports.engine.output.ReportEngineOutput; import org.efs.openreports.objects.ReportUser; import org.efs.openreports.providers.DirectoryProvider; import org.efs.openreports.util.ORUtil; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** * Basic servlet for file delivery. Parses image or file name from RequestURI * and tries to load from the image, image temp, or report generation directory. * * @author Erik Swenson */ public class FileDispatcher extends HttpServlet { private static final long serialVersionUID = 1L; private static Logger log = Logger.getLogger(FileDispatcher.class.getName()); private DirectoryProvider directoryProvider; private String imageDirectory; private String imageTempDirectory; private String reportGenerationDirectory; public void init(ServletConfig servletConfig) throws ServletException { ApplicationContext appContext = WebApplicationContextUtils .getRequiredWebApplicationContext(servletConfig.getServletContext()); directoryProvider = (DirectoryProvider) appContext.getBean("directoryProvider", DirectoryProvider.class); imageDirectory = directoryProvider.getReportImageDirectory(); imageTempDirectory = directoryProvider.getTempDirectory(); reportGenerationDirectory = directoryProvider.getReportGenerationDirectory(); super.init(servletConfig); log.info("Started..."); } protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = ""; try { fileName = StringUtils.substringAfterLast(request.getRequestURI(), "/"); File file = new File(imageDirectory + fileName); if (!file.exists()) { file = new File(imageTempDirectory + fileName); } if (!file.exists()) { fileName = request.getParameter("fileName"); // report file delivery validates the filename against the username // of the user in session for security purposes. ReportUser user = (ReportUser) request.getSession().getAttribute(ORStatics.REPORT_USER); if (user == null || fileName.indexOf(user.getName()) < 0) { String message = "Not Authorized..."; response.getOutputStream().write(message.getBytes()); return; } file = new File(reportGenerationDirectory + fileName); } String contentType = ORUtil.getContentType(fileName); response.setContentType(contentType); if (contentType != ReportEngineOutput.CONTENT_TYPE_HTML) { response.setHeader("Content-disposition", "inline; filename=" + StringUtils.deleteWhitespace(fileName)); } byte[] content = FileUtils.readFileToByteArray(file); response.setContentLength(content.length); ServletOutputStream ouputStream = response.getOutputStream(); ouputStream.write(content, 0, content.length); ouputStream.flush(); ouputStream.close(); } catch (Exception e) { log.warn(e); String message = "Error Loading File..."; response.getOutputStream().write(message.getBytes()); } } public void setDirectoryProvider(DirectoryProvider directoryProvider) { this.directoryProvider = directoryProvider; } }