View Javadoc
1   /*
2    * Copyright 2007 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.ole.sys.web.struts;
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.InputStream;
20  import java.util.HashMap;
21  import java.util.Map;
22  
23  import javax.servlet.http.HttpServletRequest;
24  import javax.servlet.http.HttpServletResponse;
25  
26  import org.apache.commons.io.IOUtils;
27  import org.apache.struts.action.ActionForm;
28  import org.apache.struts.action.ActionForward;
29  import org.apache.struts.action.ActionMapping;
30  import org.apache.struts.upload.FormFile;
31  import org.kuali.ole.sys.OLEConstants;
32  import org.kuali.ole.sys.OLEKeyConstants;
33  import org.kuali.ole.sys.batch.BatchInputFileType;
34  import org.kuali.ole.sys.batch.BatchSpringContext;
35  import org.kuali.ole.sys.batch.service.BatchInputFileService;
36  import org.kuali.ole.sys.businessobject.BatchUpload;
37  import org.kuali.ole.sys.context.SpringContext;
38  import org.kuali.ole.sys.exception.FileStorageException;
39  import org.kuali.ole.sys.exception.ParseException;
40  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
41  import org.kuali.rice.kim.api.KimConstants;
42  import org.kuali.rice.kim.api.services.IdentityManagementService;
43  import org.kuali.rice.kns.util.KNSGlobalVariables;
44  import org.kuali.rice.kns.web.struts.action.KualiAction;
45  import org.kuali.rice.krad.exception.AuthorizationException;
46  import org.kuali.rice.krad.service.ModuleService;
47  import org.kuali.rice.krad.util.GlobalVariables;
48  import org.kuali.rice.krad.util.KRADConstants;
49  
50  /**
51   * Handles actions from the batch upload screen.
52   */
53  public class KualiBatchInputFileAction extends KualiAction {
54      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KualiBatchInputFileAction.class);
55      private static IdentityManagementService identityManagementService;
56      private IdentityManagementService getIdentityManagementService() {
57          if (identityManagementService == null) {
58              identityManagementService = SpringContext.getBean(IdentityManagementService.class);
59          }
60          return identityManagementService;
61      }
62  
63      /**
64       * @see org.kuali.rice.kns.web.struts.action.KualiAction#execute(org.apache.struts.action.ActionMapping,
65       *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
66       */
67      @Override
68      public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
69          ActionForward forward = super.execute(mapping, form, request, response);
70          setupForm((KualiBatchInputFileForm) form);
71          return forward;
72      }
73  
74      @Override
75      protected void checkAuthorization(ActionForm form, String methodToCall) throws AuthorizationException {
76          BatchUpload batchUpload = ((KualiBatchInputFileForm) form).getBatchUpload();
77          BatchInputFileType batchInputFileType = retrieveBatchInputFileTypeImpl(batchUpload.getBatchInputTypeName());
78          Map<String,String> permissionDetails = new HashMap<String,String>();
79          permissionDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, getNamespaceCode(batchInputFileType.getClass()));
80          permissionDetails.put(KimConstants.AttributeConstants.BEAN_NAME, batchUpload.getBatchInputTypeName());
81          if (!getIdentityManagementService().isAuthorizedByTemplateName(GlobalVariables.getUserSession().getPrincipalId(), KRADConstants.KNS_NAMESPACE, OLEConstants.PermissionTemplate.UPLOAD_BATCH_INPUT_FILES.name, permissionDetails, null)) {
82              throw new AuthorizationException(GlobalVariables.getUserSession().getPrincipalName(), methodToCall, batchUpload.getBatchInputTypeName());
83          }
84      }
85  
86      protected static String getNamespaceCode(Class<? extends Object> clazz) {
87          ModuleService moduleService = getKualiModuleService().getResponsibleModuleService(clazz);
88          if (moduleService == null) {
89              return KimConstants.KIM_TYPE_DEFAULT_NAMESPACE;
90          }
91          return moduleService.getModuleConfiguration().getNamespaceCode();
92      }
93  
94      /**
95       * Forwards to the batch upload JSP. Initial request.
96       */
97      public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
98          return mapping.findForward(OLEConstants.MAPPING_BASIC);
99      }
100 
101     /**
102      * Sends the uploaded file contents, requested file name, and batch type to the BatchInputTypeService for storage. If errors
103      * were encountered, messages will be in GlobalVariables.errorMap, which is checked and set for display by the request
104      * processor.
105      */
106     public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
107         BatchUpload batchUpload = ((KualiBatchInputFileForm) form).getBatchUpload();
108         if (LOG.isDebugEnabled()) {
109             LOG.debug("------------BatchInputTypeName---------->"+batchUpload.getBatchInputTypeName());
110         }
111         BatchInputFileType batchType = retrieveBatchInputFileTypeImpl(batchUpload.getBatchInputTypeName());
112 
113 
114         BatchInputFileService batchInputFileService = SpringContext.getBean(BatchInputFileService.class);
115         FormFile uploadedFile = ((KualiBatchInputFileForm) form).getUploadFile();
116 
117         StringBuffer fileName = new StringBuffer(uploadedFile.getFileName());
118 
119         int fileExtensionCount = fileName.indexOf(".");
120         String extension = fileName.substring(fileExtensionCount+1);
121 
122 
123 
124         if (uploadedFile == null || uploadedFile.getInputStream() == null || uploadedFile.getInputStream().available() == 0) {
125             GlobalVariables.getMessageMap().putError(OLEConstants.GLOBAL_ERRORS, OLEKeyConstants.ERROR_BATCH_UPLOAD_NO_FILE_SELECTED_SAVE, new String[] {});
126             return mapping.findForward(OLEConstants.MAPPING_BASIC);
127         }
128 
129         if (!batchInputFileService.isFileUserIdentifierProperlyFormatted(batchUpload.getFileUserIdentifer())) {
130             GlobalVariables.getMessageMap().putError(OLEConstants.GLOBAL_ERRORS, OLEKeyConstants.ERROR_BATCH_UPLOAD_FILE_USER_IDENTIFIER_BAD_FORMAT, new String[] {});
131             return mapping.findForward(OLEConstants.MAPPING_BASIC);
132         }
133 
134         InputStream fileContents = ((KualiBatchInputFileForm) form).getUploadFile().getInputStream();
135         byte[] fileByteContent = IOUtils.toByteArray(fileContents);
136 
137         Object parsedObject = null;
138         try {
139             parsedObject = batchInputFileService.parse(batchType, fileByteContent);
140         }
141         catch (ParseException e) {
142             LOG.error("errors parsing xml " + e.getMessage(), e);
143             GlobalVariables.getMessageMap().putError(OLEConstants.GLOBAL_ERRORS, OLEKeyConstants.ERROR_BATCH_UPLOAD_PARSING_XML, new String[] { e.getMessage() });
144         }
145 
146         if (parsedObject != null && GlobalVariables.getMessageMap().hasNoErrors()) {
147             boolean validateSuccessful = batchInputFileService.validate(batchType, parsedObject);
148 
149             if (validateSuccessful && GlobalVariables.getMessageMap().hasNoErrors()) {
150                 try {
151                     InputStream saveStream = new ByteArrayInputStream(fileByteContent);
152                     String savedFileName ="";
153                     if(batchUpload.getBatchInputTypeName().equalsIgnoreCase("marcInputFileType")){
154                         if(batchUpload  == null || batchUpload.getBatchDestinationFilePath() == null){
155                             GlobalVariables.getMessageMap().putError(OLEConstants.GLOBAL_ERRORS, OLEKeyConstants.ERROR_BATCH_UPLOAD_NO_FILE_PATH_SELECTED_SAVE, new String[] {});
156                             return mapping.findForward(OLEConstants.MAPPING_BASIC);
157                         }
158                         savedFileName = batchInputFileService.save(GlobalVariables.getUserSession().getPerson(), batchType, batchUpload.getFileUserIdentifer(), saveStream, parsedObject,batchUpload.getBatchDestinationFilePath(),extension);
159                     }else{
160                         savedFileName = batchInputFileService.save(GlobalVariables.getUserSession().getPerson(), batchType, batchUpload.getFileUserIdentifer(), saveStream, parsedObject);
161                     }
162                     KNSGlobalVariables.getMessageList().add(OLEKeyConstants.MESSAGE_BATCH_UPLOAD_SAVE_SUCCESSFUL);
163                 }
164                 catch (FileStorageException e1) {
165                     LOG.error("errors saving xml " + e1.getMessage(), e1);
166                     GlobalVariables.getMessageMap().putError(OLEConstants.GLOBAL_ERRORS, OLEKeyConstants.ERROR_BATCH_UPLOAD_SAVE, new String[] { e1.getMessage() });
167                 }
168             }
169         }
170 
171         return mapping.findForward(OLEConstants.MAPPING_BASIC);
172     }
173 
174     /**
175      * Retrieves a BatchInputFileType implementation from Spring based on the given name.
176      */
177     private BatchInputFileType retrieveBatchInputFileTypeImpl(String batchInputTypeName) {
178         BatchInputFileType batchInputType = BatchSpringContext.getBatchInputFileType(batchInputTypeName);
179         if (batchInputType == null) {
180             LOG.error("Batch input type implementation not found for id " + batchInputTypeName);
181             throw new RuntimeException(("Batch input type implementation not found for id " + batchInputTypeName));
182         }
183 
184         return batchInputType;
185     }
186 
187     /**
188      * Builds list of filenames that the user has permission to manage, and populates the form member. Sets the title key from the
189      * batch input type.
190      */
191     private void setupForm(KualiBatchInputFileForm form) {
192         BatchInputFileType batchInputFileType = retrieveBatchInputFileTypeImpl(form.getBatchUpload().getBatchInputTypeName());
193 
194         if (batchInputFileType == null) {
195             LOG.error("Batch input type implementation not found for id " + form.getBatchUpload().getBatchInputTypeName());
196             throw new RuntimeException(("Batch input type implementation not found for id " + form.getBatchUpload().getBatchInputTypeName()));
197         }
198         ParameterService parmeterService =  SpringContext.getBean(ParameterService.class);
199         String url = parmeterService.getSubParameterValueAsString(BatchUpload.class,OLEConstants.BATCH_UPLOAD_HELP_SYS_PARAM_NAME, batchInputFileType.getFileTypeIdentifer());
200         form.setUrl(url);
201           // set title key
202         form.setTitleKey(batchInputFileType.getTitleKey());
203     }
204 
205 }
206