org.akaza.openclinica.bean.rule.FileUploadHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.akaza.openclinica.bean.rule.FileUploadHelper.java

Source

/*
 * OpenClinica is distributed under the
 * GNU Lesser General Public License (GNU LGPL).
    
 * For details see: http://www.openclinica.org/license
 * copyright 2003-2010 Akaza Research
 */
package org.akaza.openclinica.bean.rule;

import org.akaza.openclinica.exception.OpenClinicaSystemException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

public class FileUploadHelper {

    protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
    FileProperties fileProperties;
    FileRenamePolicy fileRenamePolicy;

    public FileUploadHelper() {
        fileProperties = new FileProperties();
    }

    public FileUploadHelper(FileProperties fileProperties) {
        super();
        this.fileProperties = fileProperties;
    }

    public List<File> returnFiles(HttpServletRequest request, ServletContext context) {

        // Check that we have a file upload request
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        return isMultipart ? getFiles(request, context, null) : new ArrayList<File>();
    }

    public List<File> returnFiles(HttpServletRequest request, ServletContext context,
            FileRenamePolicy fileRenamePolicy) {

        // Check that we have a file upload request
        this.fileRenamePolicy = fileRenamePolicy;
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        return isMultipart ? getFiles(request, context, null) : new ArrayList<File>();
    }

    public List<File> returnFiles(HttpServletRequest request, ServletContext context,
            String dirToSaveUploadedFileIn, FileRenamePolicy fileRenamePolicy) {

        // Check that we have a file upload request
        this.fileRenamePolicy = fileRenamePolicy;
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        return isMultipart ? getFiles(request, context, createDirectoryIfDoesntExist(dirToSaveUploadedFileIn))
                : new ArrayList<File>();
    }

    public List<File> returnFiles(HttpServletRequest request, ServletContext context,
            String dirToSaveUploadedFileIn) {

        // Check that we have a file upload request
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        return isMultipart ? getFiles(request, context, createDirectoryIfDoesntExist(dirToSaveUploadedFileIn))
                : new ArrayList<File>();
    }

    @SuppressWarnings("unchecked")
    private List<File> getFiles(HttpServletRequest request, ServletContext context,
            String dirToSaveUploadedFileIn) {
        List<File> files = new ArrayList<File>();

        // FileCleaningTracker fileCleaningTracker =
        // FileCleanerCleanup.getFileCleaningTracker(context);

        // Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(getFileProperties().getFileSizeMax());
        try {
            // Parse the request
            List<FileItem> items = upload.parseRequest(request);
            // Process the uploaded items

            Iterator<FileItem> iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = iter.next();

                if (item.isFormField()) {
                    request.setAttribute(item.getFieldName(), item.getString());
                    // DO NOTHING , THIS SHOULD NOT BE Handled here
                } else {
                    getFileProperties().isValidExtension(item.getName());
                    files.add(processUploadedFile(item, dirToSaveUploadedFileIn));

                }
            }
            return files;
        } catch (FileSizeLimitExceededException slee) {
            throw new OpenClinicaSystemException("exceeds_permitted_file_size",
                    new Object[] { String.valueOf(getFileProperties().getFileSizeMaxInMb()) }, slee.getMessage());
        } catch (FileUploadException fue) {
            throw new OpenClinicaSystemException("file_upload_error_occured", new Object[] { fue.getMessage() },
                    fue.getMessage());
        }
    }

    private File processUploadedFile(FileItem item, String dirToSaveUploadedFileIn) {
        dirToSaveUploadedFileIn = dirToSaveUploadedFileIn == null ? System.getProperty("java.io.tmpdir")
                : dirToSaveUploadedFileIn;
        String fileName = item.getName();
        // Some browsers IE 6,7 getName returns the whole path
        int startIndex = fileName.lastIndexOf('\\');
        if (startIndex != -1) {
            fileName = fileName.substring(startIndex + 1, fileName.length());
        }

        File uploadedFile = new File(dirToSaveUploadedFileIn + File.separator + fileName);
        if (fileRenamePolicy != null) {
            try {
                uploadedFile = fileRenamePolicy.rename(uploadedFile, item.getInputStream());
            } catch (IOException e) {
                throw new OpenClinicaSystemException(e.getMessage());
            }
        }
        try {
            item.write(uploadedFile);
        } catch (Exception e) {
            throw new OpenClinicaSystemException(e.getMessage());
        }
        return uploadedFile;

    }

    private String createDirectoryIfDoesntExist(String theDir) {
        if (!new File(theDir).isDirectory()) {
            new File(theDir).mkdirs();
        }
        return new File(theDir).toString();
    }

    public FileProperties getFileProperties() {
        return fileProperties;
    }

    public void setFileProperties(FileProperties fileProperties) {
        this.fileProperties = fileProperties;
    }

}