org.mortbay.servlet.LLabsMultiPartFilter.java Source code

Java tutorial

Introduction

Here is the source code for org.mortbay.servlet.LLabsMultiPartFilter.java

Source

// ========================================================================
// Copyright 1996-2005 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at 
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
package org.mortbay.servlet;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.eclipse.jetty.util.MultiMap;
import org.eclipse.jetty.util.log.Log;

import com.liquidlabs.common.concurrent.ExecutorService;
import com.liquidlabs.common.concurrent.NamingThreadFactory;

public class LLabsMultiPartFilter implements Filter {
    Logger logger = Logger.getLogger(LLabsMultiPartFilter.class);
    private FileItemFactory fileItemfactory;
    private ServletFileUpload uploadHandler;
    private ScheduledExecutorService scheduler;

    /*
     * --------------------------------------------------------------------------
     * -----
     */
    /**
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("Initialised");
        System.out.println("Using MultiPartFilter:" + getClass().getName());
        fileItemfactory = new DiskFileItemFactory(10240, new File("."));
        uploadHandler = new ServletFileUpload(fileItemfactory);
        scheduler = ExecutorService.newScheduledThreadPool(1, new NamingThreadFactory("LLPartFilter"));

    }

    /*
     * --------------------------------------------------------------------------
     * -----
     */
    /**
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
     *      javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    @SuppressWarnings("unchecked")
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        logger.info("Received uploadRequest:" + request);
        if (Log.isDebugEnabled())
            Log.debug(getClass().getName() + ">>> Received Request");

        HttpServletRequest srequest = (HttpServletRequest) request;
        if (srequest.getContentType() == null || !srequest.getContentType().startsWith("multipart/form-data")) {
            chain.doFilter(request, response);
            return;
        }
        if (ServletFileUpload.isMultipartContent(srequest)) {
            // Parse the request

            List<File> tempFiles = new ArrayList<File>();
            try {

                MultiMap params = new MultiMap();

                logger.info("Parsing Request");

                List<DiskFileItem> fileItems = uploadHandler.parseRequest(srequest);

                logger.info("Done Parsing Request, got FileItems:" + fileItems);

                StringBuilder filenames = new StringBuilder();

                for (final DiskFileItem diskFileItem : fileItems) {
                    if (diskFileItem.getName() == null && diskFileItem.getFieldName() != null
                            && diskFileItem.getFieldName().length() > 0) {
                        params.put(diskFileItem.getFieldName(), diskFileItem.getString());
                        continue;
                    }
                    if (diskFileItem.getName() == null)
                        continue;
                    final File tempFile = File.createTempFile("upload" + diskFileItem.getName(), ".tmp");
                    tempFiles.add(tempFile);

                    diskFileItem.write(tempFile);
                    request.setAttribute(diskFileItem.getName(), tempFile);
                    filenames.append(diskFileItem.getName()).append(",");
                }
                params.put("Filenames", filenames.toString());
                logger.info("passing on filter");
                chain.doFilter(new Wrapper(srequest, params), response);

                for (final DiskFileItem diskFileItem : fileItems) {
                    diskFileItem.delete();
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
                Log.warn(getClass().getName() + "MPartRequest, ERROR:" + e.getMessage());
                logger.error("FileUpload Failed", e);
                writeResponse((HttpServletResponse) response, HttpServletResponse.SC_EXPECTATION_FAILED);
            } catch (Throwable e) {
                logger.error(e.getMessage(), e);
                Log.warn(getClass().getName() + "MPartRequest, ERROR:" + e.getMessage());
                e.printStackTrace();
                writeResponse((HttpServletResponse) response, HttpServletResponse.SC_EXPECTATION_FAILED);
            } finally {
                for (File tempFile : tempFiles) {
                    try {
                        tempFile.delete();
                    } catch (Throwable t) {
                    }
                }
            }
        }

    }

    /**
     * @see javax.servlet.Filter#destroy()
     */
    public void destroy() {
    }

    private static class Wrapper extends HttpServletRequestWrapper {
        String encoding = "UTF-8";
        MultiMap map;

        /**
         * Constructor.
         * 
         * @param request
         */
        public Wrapper(HttpServletRequest request, MultiMap map) {
            super(request);
            this.map = map;
        }

        /**
         * @see javax.servlet.ServletRequest#getContentLength()
         */
        public int getContentLength() {
            return 0;
        }

        /**
         * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
         */
        public String getParameter(String name) {
            Object o = map.get(name);
            if (o instanceof byte[]) {
                try {
                    String s = new String((byte[]) o, encoding);
                    return s;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (o instanceof String)
                return (String) o;
            return null;
        }

        /**
         * @see javax.servlet.ServletRequest#getParameterMap()
         */
        @SuppressWarnings("unchecked")
        public Map getParameterMap() {
            return map;
        }

        /**
         * @see javax.servlet.ServletRequest#getParameterNames()
         */
        @SuppressWarnings("unchecked")
        public Enumeration getParameterNames() {
            return Collections.enumeration(map.keySet());
        }

        /**
         * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
         */
        @SuppressWarnings("unchecked")
        public String[] getParameterValues(String name) {
            List l = map.getValues(name);
            if (l == null || l.size() == 0)
                return new String[0];
            String[] v = new String[l.size()];
            for (int i = 0; i < l.size(); i++) {
                Object o = l.get(i);
                if (o instanceof byte[]) {
                    try {
                        v[i] = new String((byte[]) o, encoding);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (o instanceof String)
                    v[i] = (String) o;
            }
            return v;
        }

        /**
         * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
         */
        public void setCharacterEncoding(String enc) throws UnsupportedEncodingException {
            encoding = enc;
        }
    }

    private void writeResponse(HttpServletResponse resp, int status) {
        resp.setContentType("text/html");
        try {
            OutputStreamWriter outputStream = new OutputStreamWriter(resp.getOutputStream());
            resp.setStatus(status);
            outputStream.close();
        } catch (IOException e) {
        }
    }
}