Java tutorial
/******************************************************************************* * 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; } }