edu.emory.cci.aiw.cvrg.eureka.servlet.JobSubmitServlet.java Source code

Java tutorial

Introduction

Here is the source code for edu.emory.cci.aiw.cvrg.eureka.servlet.JobSubmitServlet.java

Source

/*
 * #%L
 * Eureka WebApp
 * %%
 * Copyright (C) 2012 - 2013 Emory University
 * %%
 * This program is dual licensed under the Apache 2 and GPLv3 licenses.
 * 
 * Apache License, Version 2.0:
 * 
 * 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.
 * 
 * GNU General Public License version 3:
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 * #L%
 */
package edu.emory.cci.aiw.cvrg.eureka.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.Principal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.net.URI;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import com.google.inject.Inject;

import org.eurekaclinical.eureka.client.comm.JobSpec;
import org.eurekaclinical.common.comm.clients.ClientException;
import edu.emory.cci.aiw.cvrg.eureka.common.comm.clients.ServicesClient;

import java.io.PrintWriter;

import org.apache.commons.io.FilenameUtils;
import org.codehaus.jackson.map.ObjectMapper;

public class JobSubmitServlet extends HttpServlet {
    private static final ObjectMapper MAPPER = new ObjectMapper();

    static {
        MAPPER.setDateFormat(new SimpleDateFormat("MM/dd/yyyy"));
    }

    /**
     * Normal directory to save files to. TODO: set value
     */
    private File tmpDir;
    private final ServicesClient servicesClient;

    @Inject
    public JobSubmitServlet(ServicesClient inClient) {
        this.servicesClient = inClient;
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.tmpDir = FileUtils.getTempDirectory();
        if (!this.tmpDir.isDirectory()) {
            throw new ServletException(this.tmpDir.getAbsolutePath() + " is not a directory");
        }
    }

    private static final class SubmitJobResponse {

        private Long jobId;
        private int statusCode;
        private String errorThrown;
        private String message;

        public Long getJobId() {
            return jobId;
        }

        public void setJobId(Long jobId) {
            this.jobId = jobId;
        }

        public String getErrorThrown() {
            return errorThrown;
        }

        public void setErrorThrown(String errorThrown) {
            this.errorThrown = errorThrown;
        }

        public int getStatusCode() {
            return statusCode;
        }

        public void setStatusCode(int statusCode) {
            this.statusCode = statusCode;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Principal principal = request.getUserPrincipal();
        if (principal == null) {
            throw new ServletException("Spreadsheet upload attempt: no user associated with the request");
        }
        SubmitJobResponse jobResponse = new SubmitJobResponse();
        String value;
        try {
            Long jobId = submitJob(request, principal);
            jobResponse.setJobId(jobId);
        } catch (ParseException ex) {
            jobResponse.setMessage("The date range you specified is invalid.");
            jobResponse.setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
            jobResponse.setErrorThrown("Bad request");
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (ClientException | FileUploadException | IOException ex) {
            String msg = "Upload failed due to an internal error";
            jobResponse.setMessage(msg);
            jobResponse.setStatusCode(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            jobResponse.setErrorThrown("Internal server error");
            log("Upload failed for user " + principal.getName(), ex);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
        value = MAPPER.writeValueAsString(jobResponse);
        response.setContentLength(value.length());
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.println(value);
    }

    private Long submitJob(HttpServletRequest request, Principal principal)
            throws FileUploadException, IOException, ClientException, ParseException {

        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();

        /*
         *Set the size threshold, above which content will be stored on disk.
         */
        fileItemFactory.setSizeThreshold(5 * 1024 * 1024); //5 MB
        /*
         * Set the temporary directory to store the uploaded files of size above threshold.
         */
        fileItemFactory.setRepository(this.tmpDir);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        /*
         * Parse the request
         */
        List items = uploadHandler.parseRequest(request);
        Properties fields = new Properties();
        for (Iterator itr = items.iterator(); itr.hasNext();) {
            FileItem item = (FileItem) itr.next();
            /*
             * Handle Form Fields.
             */
            if (item.isFormField()) {
                fields.setProperty(item.getFieldName(), item.getString());
            }
        }

        JobSpec jobSpec = MAPPER.readValue(fields.getProperty("jobSpec"), JobSpec.class);

        for (Iterator itr = items.iterator(); itr.hasNext();) {
            FileItem item = (FileItem) itr.next();
            if (!item.isFormField()) {
                //Handle Uploaded files.
                log("Spreadsheet upload for user " + principal.getName() + ": Field Name = " + item.getFieldName()
                        + ", File Name = " + item.getName() + ", Content type = " + item.getContentType()
                        + ", File Size = " + item.getSize());
                if (item.getSize() > 0) {
                    InputStream is = item.getInputStream();
                    try {
                        this.servicesClient.upload(FilenameUtils.getName(item.getName()),
                                jobSpec.getSourceConfigId(), item.getFieldName(), is);
                        log("File '" + item.getName() + "' uploaded successfully");
                    } finally {
                        if (is != null) {
                            try {
                                is.close();
                            } catch (IOException ignore) {
                            }
                        }
                    }
                } else {
                    log("File '" + item.getName() + "' ignored because it was zero length");
                }
            }
        }

        URI uri = this.servicesClient.submitJob(jobSpec);
        String uriStr = uri.toString();
        Long jobId = Long.valueOf(uriStr.substring(uriStr.lastIndexOf("/") + 1));
        log("Job " + jobId + " submitted for user " + principal.getName());
        return jobId;
    }
}