com.aplos.core.listeners.MultipartRequest.java Source code

Java tutorial

Introduction

Here is the source code for com.aplos.core.listeners.MultipartRequest.java

Source

/*
 * Copyright 2009-2011 Prime Technology.
 *
 * 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 com.aplos.core.listeners;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.aplos.common.AplosRequestContext;
import com.aplos.common.appconstants.AplosScopedBindings;

public class MultipartRequest extends HttpServletRequestWrapper {

    private static final Logger logger = Logger.getLogger(MultipartRequest.class.getName());

    private Map<String, List<String>> formParams;

    private Map<String, List<FileItem>> fileParams;

    private Map<String, String[]> parameterMap;

    private String encoding;

    public MultipartRequest(HttpServletRequest request, ServletFileUpload servletFileUpload) throws IOException {
        super(request);
        formParams = new LinkedHashMap<String, List<String>>();
        fileParams = new LinkedHashMap<String, List<FileItem>>();

        encoding = request.getCharacterEncoding();

        parseRequest(request, servletFileUpload);
    }

    @SuppressWarnings("unchecked")
    private void parseRequest(HttpServletRequest request, ServletFileUpload servletFileUpload) throws IOException {
        try {
            AplosRequestContext aplosRequestContext = (AplosRequestContext) request
                    .getAttribute(AplosScopedBindings.APLOS_REQUEST_CONTEXT);
            if (!(aplosRequestContext != null && aplosRequestContext.getDynamicViewEl() != null
                    && !aplosRequestContext.isDynamicViewProcessed())) {
                List<FileItem> fileItems = servletFileUpload.parseRequest(request);

                for (FileItem item : fileItems) {
                    if (item.isFormField()) {
                        addFormParam(item);
                    } else {
                        addFileParam(item);
                    }
                }
            }
        } catch (FileUploadException e) {
            logger.severe("Error in parsing fileupload request");

            throw new IOException(e.getMessage());
        }
    }

    private void addFileParam(FileItem item) {
        if (fileParams.containsKey(item.getFieldName())) {
            fileParams.get(item.getFieldName()).add(item);
        } else {
            List<FileItem> items = new ArrayList<FileItem>();
            items.add(item);
            fileParams.put(item.getFieldName(), items);
        }
    }

    private void addFormParam(FileItem item) {
        String value;
        if (encoding == null) {
            value = item.getString();
        } else {
            try {
                value = item.getString(encoding);
            } catch (UnsupportedEncodingException e) {
                value = item.getString();
            }
        }
        if (formParams.containsKey(item.getFieldName())) {
            formParams.get(item.getFieldName()).add(value);
        } else {
            List<String> items = new ArrayList<String>();
            items.add(value);
            formParams.put(item.getFieldName(), items);
        }
    }

    @Override
    public String getParameter(String name) {
        if (formParams.containsKey(name)) {
            List<String> values = formParams.get(name);
            if (values.isEmpty()) {
                return "";
            } else {
                return values.get(0);
            }
        } else {
            return super.getParameter(name);
        }
    }

    @Override
    public Map getParameterMap() {
        if (parameterMap == null) {
            Map<String, String[]> map = new LinkedHashMap<String, String[]>();

            for (String formParam : formParams.keySet()) {
                map.put(formParam, formParams.get(formParam).toArray(new String[0]));
            }

            map.putAll(super.getParameterMap());

            parameterMap = Collections.unmodifiableMap(map);
        }

        return parameterMap;
    }

    @Override
    public Enumeration getParameterNames() {
        Set<String> paramNames = new LinkedHashSet<String>();
        paramNames.addAll(formParams.keySet());

        Enumeration<String> original = super.getParameterNames();
        while (original.hasMoreElements()) {
            paramNames.add(original.nextElement());
        }

        return Collections.enumeration(paramNames);
    }

    @Override
    public String[] getParameterValues(String name) {
        if (formParams.containsKey(name)) {
            List<String> values = formParams.get(name);
            if (values.isEmpty()) {
                return new String[0];
            } else {
                return values.toArray(new String[values.size()]);
            }
        } else {
            return super.getParameterValues(name);
        }
    }

    public FileItem getFileItem(String name) {
        if (fileParams.containsKey(name)) {
            List<FileItem> items = fileParams.get(name);

            return items.get(0);
        } else {
            return null;
        }
    }
}