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}