All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.portletmvc4spring.multipart.DefaultMultipartActionRequest Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2000-2020 the original author or authors.
 *
 * 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.liferay.portletmvc4spring.multipart;

import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.portlet.ActionRequest;
import javax.portlet.filter.ActionRequestWrapper;

import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import org.springframework.web.multipart.MultipartFile;


/**
 * Default implementation of the {@link MultipartActionRequest} interface. Provides management of pre-generated
 * parameter values.
 *
 * @author  Juergen Hoeller
 * @author  Arjen Poutsma
 * @since   2.0
 * @see     PortletMultipartResolver
 */
public class DefaultMultipartActionRequest extends ActionRequestWrapper implements MultipartActionRequest {

	private MultiValueMap multipartFiles;

	private Map multipartParameters;

	private Map multipartParameterContentTypes;

	/**
	 * Wrap the given Portlet ActionRequest in a MultipartActionRequest.
	 *
	 * @param  request   the request to wrap
	 * @param  mpFiles   a map of the multipart files
	 * @param  mpParams  a map of the parameters to expose, with Strings as keys and String arrays as values
	 */
	public DefaultMultipartActionRequest(ActionRequest request, MultiValueMap mpFiles,
		Map mpParams, Map mpParamContentTypes) {

		super(request);
		setMultipartFiles(mpFiles);
		setMultipartParameters(mpParams);
		setMultipartParameterContentTypes(mpParamContentTypes);
	}

	/**
	 * Wrap the given Portlet ActionRequest in a MultipartActionRequest.
	 *
	 * @param  request  the request to wrap
	 */
	protected DefaultMultipartActionRequest(ActionRequest request) {
		super(request);
	}

	@Override
	public MultipartFile getFile(String name) {
		return getMultipartFiles().getFirst(name);
	}

	@Override
	public Map getFileMap() {
		return getMultipartFiles().toSingleValueMap();
	}

	@Override
	public Iterator getFileNames() {
		return getMultipartFiles().keySet().iterator();
	}

	@Override
	public List getFiles(String name) {
		List multipartFiles = getMultipartFiles().get(name);

		if (multipartFiles != null) {
			return multipartFiles;
		}
		else {
			return Collections.emptyList();
		}
	}

	@Override
	public MultiValueMap getMultiFileMap() {
		return getMultipartFiles();
	}

	@Override
	public String getMultipartContentType(String paramOrFileName) {
		MultipartFile file = getFile(paramOrFileName);

		if (file != null) {
			return file.getContentType();
		}
		else {
			return getMultipartParameterContentTypes().get(paramOrFileName);
		}
	}

	@Override
	public String getParameter(String name) {
		String[] values = getMultipartParameters().get(name);

		if (values != null) {
			return ((values.length > 0) ? values[0] : null);
		}

		return super.getParameter(name);
	}

	@Override
	public Map getParameterMap() {
		Map paramMap = new HashMap();
		paramMap.putAll(super.getParameterMap());
		paramMap.putAll(getMultipartParameters());

		return paramMap;
	}

	@Override
	public Enumeration getParameterNames() {
		Set paramNames = new HashSet();
		Enumeration paramEnum = super.getParameterNames();

		while (paramEnum.hasMoreElements()) {
			paramNames.add(paramEnum.nextElement());
		}

		paramNames.addAll(getMultipartParameters().keySet());

		return Collections.enumeration(paramNames);
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] values = getMultipartParameters().get(name);

		if (values != null) {
			return values;
		}

		return super.getParameterValues(name);
	}

	/**
	 * Obtain the MultipartFile Map for retrieval, lazily initializing it if necessary.
	 *
	 * @see  #initializeMultipart()
	 */
	protected MultiValueMap getMultipartFiles() {

		if (this.multipartFiles == null) {
			initializeMultipart();
		}

		return this.multipartFiles;
	}

	/**
	 * Obtain the multipart parameter content type Map for retrieval, lazily initializing it if necessary.
	 *
	 * @see  #initializeMultipart()
	 */
	protected Map getMultipartParameterContentTypes() {

		if (this.multipartParameterContentTypes == null) {
			initializeMultipart();
		}

		return this.multipartParameterContentTypes;
	}

	/**
	 * Obtain the multipart parameter Map for retrieval, lazily initializing it if necessary.
	 *
	 * @see  #initializeMultipart()
	 */
	protected Map getMultipartParameters() {

		if (this.multipartParameters == null) {
			initializeMultipart();
		}

		return this.multipartParameters;
	}

	/**
	 * Lazily initialize the multipart request, if possible. Only called if not already eagerly initialized.
	 */
	protected void initializeMultipart() {
		throw new IllegalStateException("Multipart request not initialized");
	}

	/**
	 * Set a Map with parameter names as keys and list of MultipartFile objects as values. To be invoked by subclasses
	 * on initialization.
	 */
	protected final void setMultipartFiles(MultiValueMap multipartFiles) {
		this.multipartFiles = new LinkedMultiValueMap(Collections.unmodifiableMap(
					multipartFiles));
	}

	/**
	 * Set a Map with parameter names as keys and content type Strings as values. To be invoked by subclasses on
	 * initialization.
	 */
	protected final void setMultipartParameterContentTypes(Map multipartParameterContentTypes) {
		this.multipartParameterContentTypes = multipartParameterContentTypes;
	}

	/**
	 * Set a Map with parameter names as keys and String array objects as values. To be invoked by subclasses on
	 * initialization.
	 */
	protected final void setMultipartParameters(Map multipartParameters) {
		this.multipartParameters = multipartParameters;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy