org.opentestsystem.authoring.testitembank.rest.ImportSetController.java Source code

Java tutorial

Introduction

Here is the source code for org.opentestsystem.authoring.testitembank.rest.ImportSetController.java

Source

/*******************************************************************************
 * Educational Online Test Delivery System 
 * Copyright (c) 2014 American Institutes for Research
 *   
 * Distributed under the AIR Open Source License, Version 1.0 
 * See accompanying file AIR-License-1_0.txt or at
 * http://www.smarterapp.org/documents/American_Institutes_for_Research_Open_Source_Software_License.pdf
 ******************************************************************************/
package org.opentestsystem.authoring.testitembank.rest;

import java.io.File;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.opentestsystem.authoring.testitembank.domain.ImportFile;
import org.opentestsystem.authoring.testitembank.domain.ImportSet;
import org.opentestsystem.authoring.testitembank.domain.ImportStatus;
import org.opentestsystem.authoring.testitembank.domain.ImportType;
import org.opentestsystem.authoring.testitembank.exception.TestItemBankException;
import org.opentestsystem.authoring.testitembank.service.ImportSetService;
import org.opentestsystem.shared.exception.RestException;
import org.opentestsystem.shared.web.AbstractRestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
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.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class ImportSetController extends AbstractRestController {

    /** logger. **/
    private static final Logger LOGGER = LoggerFactory.getLogger(ImportSetController.class);

    @Autowired
    private ImportSetService importSetService;

    // the colon is important to default to blank here. http://www.javacodegeeks.com/2013/01/spring-property-placeholder-configurer-a-few-not-so-obvious-options.html
    @Value(value = "${tib.file.pathname:}")
    private String tempFileDirectory;

    @RequestMapping(value = "/importSet/{importSetId}", method = RequestMethod.GET, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @ResponseBody
    @Secured({ "ROLE_Tib Read" })
    public ImportSet getImportSet(@PathVariable final String importSetId) {
        return importSetService.getImportSet(importSetId);
    }

    @ResponseStatus(HttpStatus.CREATED)
    @RequestMapping(value = "/sftpFileImport", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @ResponseBody
    @Secured({ "ROLE_Tib Import" })
    public ImportSet importFileFromSftp(@RequestBody @Valid final ImportSet importSet,
            final HttpServletResponse response) {
        ImportSet savedImportSet = null;
        if (importSet != null && !CollectionUtils.isEmpty(importSet.getImportFiles())) {
            importSet.setImportType(ImportType.SFTP);
            importSet.setImportStatus(ImportStatus.UNIMPORTED);
            importSet.setRequestTime(new DateTime());
            for (final ImportFile importFile : importSet.getImportFiles()) {
                importFile.setImportStatus(ImportStatus.UNIMPORTED);
            }
            savedImportSet = importSetService.saveImportSet(importSet);
            importSetService.importFileSet(savedImportSet);
            response.setHeader("Location", savedImportSet.getUrl());
        }
        LOGGER.debug("done with rest call");
        return savedImportSet;
    }

    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    @Secured({ "ROLE_Tib Import" })
    public ImportSet importUploadFile(@RequestParam("file") final MultipartFile apipFile,
            @RequestParam(required = true) final String tenantId,
            @RequestParam(required = true) final String itemBank, final HttpServletResponse response) {
        String path = tempFileDirectory;
        if (StringUtils.isEmpty(tempFileDirectory)) {
            final String userDir = System.getProperty("user.dir");
            LOGGER.info("The property 'tib.file.pathname' is not populated, defaulting to :" + userDir);
            path = userDir;
        }
        final String fileName = System.currentTimeMillis() + "_" + apipFile.getOriginalFilename();
        LOGGER.debug("TIB temp dir is: " + path + " file name: " + fileName);

        final File file = new File(path, fileName);
        ImportSet savedImportSet = null;
        final ImportSet importSet = new ImportSet();
        try {
            apipFile.transferTo(file);
            importSet.setTenantId(tenantId);
            importSet.setItemBank(itemBank);
            importSet.setImportType(ImportType.MULTIPART_REQUEST);
            importSet.setImportStatus(ImportStatus.UNIMPORTED);
            importSet.setRequestTime(new DateTime());
            if (file.exists()) {
                importSet.addFileToImport(file);
                savedImportSet = importSetService.saveImportSet(importSet);
                importSetService.importFileSet(importSet);
                savedImportSet = importSetService.getImportSet(importSet.getId());
            } else {
                importSet.setImportStatus(ImportStatus.FILE_NOT_FOUND);
                savedImportSet = importSetService.saveImportSet(importSet);
            }
            if (ImportStatus.IMPORT_COMPLETE.equals(importSet.getImportStatus())) {
                response.setStatus(HttpStatus.CREATED.value());
                response.setHeader("Location", savedImportSet.getUrl());
            } else {
                response.setStatus(HttpStatus.BAD_REQUEST.value());
            }

        } catch (final Exception e) {
            importSet.setImportStatus(ImportStatus.FAILED);
            savedImportSet = importSetService.saveImportSet(importSet);
            response.setStatus(HttpStatus.BAD_REQUEST.value());
            throw new RestException("upload.error", e);
        } finally {
            if (file != null) {
                try {
                    file.delete();
                } catch (final Exception e) {
                    throw new TestItemBankException("unexpected.error", e);
                }
            }
        }
        return savedImportSet;
    }

    @ResponseStatus(HttpStatus.CREATED)
    @RequestMapping(value = "/stagedFile", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @Secured({ "ROLE_Tib Import" })
    @ResponseBody
    public ImportSet importStagedFile(@RequestBody final ImportFile importFile,
            @RequestParam(required = true) final String tenantId,
            @RequestParam(required = true) final String itemBank, final HttpServletResponse response) {
        ImportSet importSet = null;
        if (StringUtils.isNotEmpty(importFile.getPathName())) {
            importSet = new ImportSet();
            importSet.setTenantId(tenantId);
            importSet.setItemBank(itemBank);
            importSet.setImportType(ImportType.STAGED_FILE);
            importSet.setImportStatus(ImportStatus.UNIMPORTED);
            importSet.setRequestTime(new DateTime());
            importSet.addFilePathToImport(importFile.getPathName());
            importSet = importSetService.saveImportSet(importSet);
            importSetService.importFileSet(importSet);
            response.setHeader("Location", importSet.getUrl());
        } else {
            response.setStatus(HttpStatus.BAD_REQUEST.value());
        }
        return importSet;
    }
}