/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.xmlui.cocoon.servlet.multipart; import org.apache.cocoon.configuration.Settings; import org.apache.cocoon.servlet.RequestUtil; import org.apache.cocoon.servlet.ServletSettings; import org.apache.cocoon.servlet.multipart.MultipartConfigurationHelper; import org.apache.cocoon.servlet.multipart.MultipartHttpServletRequest; import org.apache.cocoon.util.AbstractLogEnabled; import org.springframework.beans.factory.BeanFactory; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; /** * Servlet filter for handling multi part MIME uploads * * @version $Id: MultipartFilter.java 588803 2007-10-26 23:40:14Z vgritsenko $ */ public class DSpaceMultipartFilter extends AbstractLogEnabled implements Filter{ /** * The RequestFactory is responsible for wrapping multipart-encoded * forms and for handing the file payload of incoming requests */ protected DSpaceRequestFactory requestFactory; /** Root Cocoon Bean Factory. */ protected BeanFactory cocoonBeanFactory; /** The root settings. */ protected Settings settings; /** The special servlet settings. */ protected ServletSettings servletSettings; /** The servlet context. */ protected ServletContext servletContext; /** * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig config) throws ServletException { this.servletContext = config.getServletContext(); } /** * @see javax.servlet.Filter#destroy() */ public void destroy() { // nothing to do } protected synchronized void configure() { if (this.cocoonBeanFactory == null) { this.cocoonBeanFactory = WebApplicationContextUtils.getRequiredWebApplicationContext(this.servletContext); this.settings = (Settings) this.cocoonBeanFactory.getBean(Settings.ROLE); this.servletSettings = new ServletSettings(this.settings); String containerEncoding; final String encoding = this.settings.getContainerEncoding(); if (encoding == null) { containerEncoding = "ISO-8859-1"; } else { containerEncoding = encoding; } final MultipartConfigurationHelper config = new MultipartConfigurationHelper(); config.configure(this.settings, getLogger()); this.requestFactory = new DSpaceRequestFactory(config.isAutosaveUploads(), new File(config.getUploadDirectory()), config.isAllowOverwrite(), config.isSilentlyRename(), config.getMaxUploadSize(), containerEncoding); } } /** * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { if (this.cocoonBeanFactory == null) { this.configure(); } // get the request (wrapped if contains multipart-form data) HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try{ try { request = this.requestFactory.getServletRequest(request); } catch (Exception e) { if (getLogger().isErrorEnabled()) { getLogger().error("Problem in multipart filter. Unable to create request.", e); } RequestUtil.manageException(request, response, null, null, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Problem in creating the Request", null, null, e, this.servletSettings, getLogger(), this); } filterChain.doFilter(request, response); } finally { try { if (request instanceof MultipartHttpServletRequest) { if (getLogger().isDebugEnabled()) { getLogger().debug("Deleting uploaded file(s)."); } ((MultipartHttpServletRequest) request).cleanup(); } } catch (IOException e) { getLogger().error("MultipartFilter got an exception while trying to cleanup the uploaded files.", e); } } } }