001package org.kuali.ole.ingest.controller; 002 003import org.apache.commons.io.IOUtils; 004import org.apache.log4j.Logger; 005import org.kuali.ole.OLEConstants; 006import org.kuali.ole.deliver.bo.OlePatronIngestSummaryRecord; 007import org.kuali.ole.service.OlePatronConverterService; 008import org.kuali.ole.ingest.OlePatronXMLSchemaValidator; 009import org.kuali.ole.ingest.form.OlePatronRecordForm; 010import org.kuali.rice.core.api.config.property.ConfigContext; 011import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 012import org.kuali.rice.krad.service.KRADServiceLocator; 013import org.kuali.rice.krad.util.GlobalVariables; 014import org.kuali.rice.krad.web.controller.UifControllerBase; 015import org.kuali.rice.krad.web.form.UifFormBase; 016import org.springframework.beans.factory.annotation.Autowired; 017import org.springframework.context.ApplicationContext; 018import org.springframework.stereotype.Controller; 019import org.springframework.validation.BindingResult; 020import org.springframework.web.bind.annotation.ModelAttribute; 021import org.springframework.web.bind.annotation.RequestMapping; 022import org.springframework.web.multipart.MultipartFile; 023import org.springframework.web.servlet.ModelAndView; 024 025import javax.servlet.http.HttpServletRequest; 026import javax.servlet.http.HttpServletResponse; 027import java.io.File; 028import java.io.FileInputStream; 029import java.io.InputStream; 030 031/** 032 * OlePatronRecordController is the controller class for Patron Record Controller 033 */ 034@Controller 035@RequestMapping(value = "/patronrecordcontroller") 036public class OlePatronRecordController extends UifControllerBase { 037 /** 038 * @see org.kuali.rice.krad.web.controller.UifControllerBase#createInitialForm(javax.servlet.http.HttpServletRequest) 039 */ 040 private static final Logger LOG = Logger.getLogger(OlePatronRecordController.class); 041 042 /** 043 * This method will return new Instance of OlePatronRecordForm. 044 * @param request 045 * @return OlePatronRecordForm. 046 */ 047 @Override 048 protected OlePatronRecordForm createInitialForm(HttpServletRequest request) { 049 return new OlePatronRecordForm(); 050 } 051 052 /** 053 * This method takes the initial request when click on OlePatronRecord Screen. 054 * @param form 055 * @param result 056 * @param request 057 * @param response 058 * @return ModelAndView 059 */ 060 @Override 061 @RequestMapping(params = "methodToCall=start") 062 public ModelAndView start(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result, 063 HttpServletRequest request, HttpServletResponse response) { 064 LOG.debug("Start -- Start Method of OlePatronRecordForm"); 065 OlePatronRecordForm olePatronRecordForm = (OlePatronRecordForm) form; 066 return super.start(olePatronRecordForm, result, request, response); 067 } 068 069 /** 070 * This method persist the data from patronXml file into database after uploading the patronXml. 071 * @param form 072 * @param result 073 * @param request 074 * @param response 075 * @return ModelAndView 076 * @throws Exception 077 */ 078 @RequestMapping(params = "methodToCall=upload") 079 public ModelAndView upload(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result, 080 HttpServletRequest request, HttpServletResponse response) throws Exception { 081 LOG.debug("Start -- Upload Method of OlePatronRecordForm"); 082 OlePatronRecordForm olePatronRecordForm = (OlePatronRecordForm) form; 083 OlePatronConverterService olePatronRecordService = GlobalResourceLoader.getService(OLEConstants.PATRON_CONVERTER_SERVICE); 084 OlePatronXMLSchemaValidator olePatronXMLSchemaValidator = new OlePatronXMLSchemaValidator(); 085 OlePatronIngestSummaryRecord olePatronIngestSummaryRecord = new OlePatronIngestSummaryRecord(); 086 MultipartFile multipartFile = olePatronRecordForm.getPatronFile(); 087 String fileName = multipartFile.getOriginalFilename(); 088 if (validateFile(multipartFile.getOriginalFilename())) { 089 String fileContent = new String(multipartFile.getBytes()); 090 try { 091 boolean schemaFlag = olePatronXMLSchemaValidator.validateContentsAgainstSchema(multipartFile.getInputStream()); 092 if(!schemaFlag){ 093 olePatronRecordForm.setMessage(OLEConstants.PATRON_RECORD_INVALID_SCHEMA); 094 return super.start(olePatronRecordForm, result, request, response); 095 } 096 boolean addUnMatchedPatronFlag = olePatronRecordForm.isAddUnmatchedPatron(); 097 String principalName = GlobalVariables.getUserSession().getPrincipalName(); 098 olePatronRecordService.persistPatronFromFileContent(fileContent,addUnMatchedPatronFlag,fileName,olePatronIngestSummaryRecord,olePatronRecordForm.getPatronAddressSource(),principalName); 099 olePatronRecordForm.setMessage(olePatronRecordService.getUploadProcessMessage(olePatronIngestSummaryRecord)); 100 } catch (Exception patronRecordIngestException) { 101 olePatronRecordForm.setMessage(OLEConstants.PATRON_RECORD_FAILURE); 102 LOG.error("Failed to upload Patron record.", patronRecordIngestException); 103 } 104 } else { 105 olePatronRecordForm.setMessage(OLEConstants.PATRON_RECORD_SELECT_FILE); 106 } 107 return super.start(olePatronRecordForm, result, request, response); 108 } 109 110 /** 111 * This method validate the xml file type. 112 * @param inputFile 113 * @return boolean 114 */ 115 public boolean validateFile(String inputFile) { 116 return (inputFile.contains(".xml") ? true:false); 117 } 118 119 /** 120 * This method will download the Failure records as an attachment based on summaryId. 121 * @param form 122 * @param result 123 * @param request 124 * @param response 125 * @return null 126 * @throws Exception 127 */ 128 @RequestMapping(params = "methodToCall=downloadAttachment") 129 public ModelAndView downloadAttachment(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result, 130 HttpServletRequest request, HttpServletResponse response) throws Exception { 131 LOG.info("Start -- DownLoad Method of OlePatronRecordForm"); 132 String olePatronSummaryId=request.getParameter(OLEConstants.PATRON_SUMMARY_REPORT_ID); 133 OlePatronRecordForm olePatronRecordForm = (OlePatronRecordForm) form; 134 olePatronRecordForm.setOlePatronSummaryId(olePatronSummaryId); 135 String directory = ConfigContext.getCurrentContextConfig().getProperty(OLEConstants.STAGING_DIRECTORY)+ 136 OLEConstants.PATRON_FILE_DIRECTORY; 137 String homeDirectory = System.getProperty(OLEConstants.USER_HOME_DIRECTORY); 138 File file=new File(homeDirectory+directory+olePatronSummaryId+OLEConstants.FAILED_PATRON_RECORD_NAME); 139 response.setContentType("application/octet-stream"); 140 response.setHeader("Content-disposition", "attachment; filename=" + olePatronSummaryId+OLEConstants.FAILED_PATRON_RECORD_NAME); 141 response.setHeader("Expires", "0"); 142 response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 143 response.setHeader("Pragma", "public"); 144 response.setContentLength((int) file.length()); 145 InputStream fis = new FileInputStream(file); 146 IOUtils.copy(fis, response.getOutputStream()); 147 response.getOutputStream().flush(); 148 149 LOG.info("End -- DownLoad Method of AcquisitionBatchInputFileAction"); 150 return null; 151 } 152 153 154 155 156}