net.nan21.dnet.core.web.controller.upload.FileUploadController.java Source code

Java tutorial

Introduction

Here is the source code for net.nan21.dnet.core.web.controller.upload.FileUploadController.java

Source

/** 
 * DNet eBusiness Suite
 * Copyright: 2013 Nan21 Electronics SRL. All rights reserved.
 * Use is subject to license terms.
 */
package net.nan21.dnet.core.web.controller.upload;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.nan21.dnet.core.api.Constants;
import net.nan21.dnet.core.api.descriptor.IUploadedFileDescriptor;
import net.nan21.dnet.core.api.service.IFileUploadService;
import net.nan21.dnet.core.api.service.IFileUploadServiceFactory;
import net.nan21.dnet.core.presenter.descriptor.UploadedFileDescriptor;
import net.nan21.dnet.core.web.controller.AbstractDnetController;

import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class FileUploadController extends AbstractDnetController {

    private List<IFileUploadServiceFactory> fileUploadServiceFactories;

    final static Logger logger = LoggerFactory.getLogger(FileUploadController.class);

    /**
     * Generic file upload. Expects an uploaded file and a handler alias to
     * delegate the uploaded file processing.
     * 
     * @param handler
     *            spring bean alias of the
     *            {@link net.nan21.dnet.core.api.service.IFileUploadService}
     *            which should process the uploaded file
     * @param file
     *            Uploaded file
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/{handler}", method = RequestMethod.POST)
    @ResponseBody
    public String fileUpload(@PathVariable("handler") String handler, @RequestParam("file") MultipartFile file,
            HttpServletRequest request, HttpServletResponse response) throws Exception {

        if (logger.isInfoEnabled()) {
            logger.info("Processing file upload request with-handler {} ", new String[] { handler });
        }

        if (file.isEmpty()) {
            throw new Exception("Upload was not succesful. Try again please.");
        }

        this.prepareRequest(request, response);

        IFileUploadService srv = this.getFileUploadService(handler);
        Map<String, String> paramValues = new HashMap<String, String>();

        for (String p : srv.getParamNames()) {
            paramValues.put(p, request.getParameter(p));
        }

        IUploadedFileDescriptor fileDescriptor = new UploadedFileDescriptor();
        fileDescriptor.setContentType(file.getContentType());
        fileDescriptor.setOriginalName(file.getOriginalFilename());
        fileDescriptor.setNewName(file.getName());
        fileDescriptor.setSize(file.getSize());
        Map<String, Object> result = srv.execute(fileDescriptor, file.getInputStream(), paramValues);

        this.finishRequest();
        result.put("success", true);
        ObjectMapper mapper = getJsonMapper();
        return mapper.writeValueAsString(result);
    }

    /**
     * Try to locate a file-upload service by its name (spring-bean alias)
     * 
     * @param dsName
     * @return
     * @throws Exception
     */
    protected IFileUploadService getFileUploadService(String name) throws Exception {
        IFileUploadService srv = null;
        for (IFileUploadServiceFactory sf : getFileUploadServiceFactories()) {
            try {
                srv = sf.create(name);
                if (srv != null) {
                    return srv;
                }
            } catch (NoSuchBeanDefinitionException e) {
                // service not found in this factory, ignore
            }
        }
        throw new Exception(name + "File upload service not found for name " + name + "!");
    }

    @SuppressWarnings("unchecked")
    public List<IFileUploadServiceFactory> getFileUploadServiceFactories() {
        if (this.fileUploadServiceFactories == null) {
            this.fileUploadServiceFactories = (List<IFileUploadServiceFactory>) this.getApplicationContext()
                    .getBean(Constants.SPRING_OSGI_FILE_UPLOAD_SERVICE_FACTORIES);
        }
        return this.fileUploadServiceFactories;
    }

    public void setFileUploadServiceFactories(List<IFileUploadServiceFactory> fileUploadServiceFactories) {

        this.fileUploadServiceFactories = fileUploadServiceFactories;
    }

}