/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.evasion.common.inputfile;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.*;
import java.io.File;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author sebastien.glon
*/
public class UploadFilter implements Filter {
String repositoryPath;
@Override
public void init(FilterConfig config) throws ServletException {
setRepositoryPath(config);
}
@SuppressWarnings("unchecked")
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if ((request instanceof HttpServletRequest)) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (ServletFileUpload.isMultipartContent(httpRequest)) {
//-----------------------------------------------------
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(repositoryPath));
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = (List<FileItem>) upload.parseRequest(httpRequest);
final Map<String, String[]> map = new HashMap<String, String[]>();
for (FileItem item : items) {
if (item.isFormField()) {
processFormField(item, map);
} else {
processFileField(item, httpRequest);
}
}
request = UploadFilter.wrapRequest(httpRequest, map);
} catch (FileUploadException ex) {
ServletException servletEx = new ServletException();
servletEx.initCause(ex);
throw servletEx;
}
}
}
chain.doFilter(request, response);
}
private static HttpServletRequest wrapRequest(HttpServletRequest request,
final Map<String, String[]> parameterMap) {
return new HttpServletRequestWrapper(request) {
// inner methods passed as parameters
@Override
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
@Override
public String[] getParameterValues(String name) {
return (String[]) parameterMap.get(name);
}
@Override
public String getParameter(String name) {
String[] params = getParameterValues(name);
if (params == null) {
return null;
}
return params[0];
}
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(parameterMap.keySet());
}
};
}
private void processFormField(FileItem formField,
Map<String, String[]> parameterMap) {
String name = formField.getFieldName();
String value = formField.getString();
String[] values = parameterMap.get(name);
if (values == null) {
// Not in parameter map yet, so add as new value.
parameterMap.put(name, new String[]{value});
} else {
// Multiple field values, so add new value to existing array.
int length = values.length;
String[] newValues = new String[length + 1];
System.arraycopy(values, 0, newValues, 0, length);
newValues[length] = value;
parameterMap.put(name, newValues);
}
}
private void processFileField(FileItem fileField, HttpServletRequest request) {
request.setAttribute(fileField.getFieldName(), fileField);
}
/**
* Method for retrieving the temporary directory for storing uploaded file
* By default the system's temporary directory will be used if no reposistory path is configure in the web.xml
* @param config
*/
private void setRepositoryPath(FilterConfig config) {
String repositoryPath = config.getInitParameter("org.idc.sis.UploadFilter.repositoryPath");
if (repositoryPath == null || repositoryPath.isEmpty()) {
repositoryPath = System.getProperty("java.io.tmpdir");
}
if (!repositoryPath.endsWith("/")) {
repositoryPath += "/";
}
this.repositoryPath = repositoryPath;
}
@Override
public void destroy() {
}
}