1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.kns.web.struts.action;
17  
18  import org.apache.commons.collections.CollectionUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.apache.struts.action.ActionForm;
21  import org.apache.struts.action.ActionForward;
22  import org.apache.struts.action.ActionMapping;
23  import org.apache.struts.action.RedirectingActionForward;
24  import org.kuali.rice.core.api.util.RiceConstants;
25  import org.kuali.rice.core.api.util.RiceKeyConstants;
26  import org.kuali.rice.kim.api.KimConstants;
27  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
28  import org.kuali.rice.kns.inquiry.Inquirable;
29  import org.kuali.rice.kns.util.WebUtils;
30  import org.kuali.rice.kns.web.struts.form.InquiryForm;
31  import org.kuali.rice.kns.web.ui.Field;
32  import org.kuali.rice.kns.web.ui.Row;
33  import org.kuali.rice.kns.web.ui.Section;
34  import org.kuali.rice.krad.bo.Attachment;
35  import org.kuali.rice.krad.bo.BusinessObject;
36  import org.kuali.rice.krad.bo.Exporter;
37  import org.kuali.rice.krad.bo.Note;
38  import org.kuali.rice.krad.bo.PersistableAttachment;
39  import org.kuali.rice.krad.bo.PersistableAttachmentList;
40  import org.kuali.rice.krad.datadictionary.BusinessObjectEntry;
41  import org.kuali.rice.krad.exception.AuthorizationException;
42  import org.kuali.rice.krad.service.KRADServiceLocator;
43  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
44  import org.kuali.rice.krad.service.ModuleService;
45  import org.kuali.rice.krad.service.NoteService;
46  import org.kuali.rice.krad.util.GlobalVariables;
47  import org.kuali.rice.krad.util.KRADConstants;
48  import org.kuali.rice.krad.util.KRADUtils;
49  
50  import javax.servlet.http.HttpServletRequest;
51  import javax.servlet.http.HttpServletResponse;
52  import java.io.ByteArrayOutputStream;
53  import java.io.IOException;
54  import java.lang.reflect.Method;
55  import java.util.Collections;
56  import java.util.List;
57  import java.util.Map;
58  
59  
60  
61  
62  
63  
64  @Deprecated
65  public class KualiInquiryAction extends KualiAction {
66      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KualiInquiryAction.class);
67      private NoteService noteService;
68  
69      @Override
70      protected void checkAuthorization(ActionForm form, String methodToCall) throws AuthorizationException {
71          if (!(form instanceof InquiryForm)) {
72              super.checkAuthorization(form, methodToCall);
73          } else {
74              try {
75              	if(!KRADConstants.DOWNLOAD_BO_ATTACHMENT_METHOD.equals(methodToCall)){
76              		Class businessObjectClass = Class.forName(((InquiryForm) form).getBusinessObjectClassName());
77              		if (!KimApiServiceLocator.getPermissionService().isAuthorizedByTemplate(
78                              GlobalVariables.getUserSession().getPrincipalId(), KRADConstants.KNS_NAMESPACE,
79                              KimConstants.PermissionTemplateNames.INQUIRE_INTO_RECORDS,
80                              KRADUtils.getNamespaceAndComponentSimpleName(businessObjectClass),
81                              Collections.<String, String>emptyMap())) {
82  
83              			throw new AuthorizationException(GlobalVariables.getUserSession().getPerson().getPrincipalName(), 
84                      		"inquire",
85                      		businessObjectClass.getSimpleName());
86              		}
87              	}
88              }
89              catch (ClassNotFoundException e) {
90              	LOG.warn("Unable to load BusinessObject class: " + ((InquiryForm) form).getBusinessObjectClassName(), e);
91                  super.checkAuthorization(form, methodToCall);
92              }
93          }
94      }
95  
96      @Override
97  	protected Map<String, String> getRoleQualification(ActionForm form,
98  			String methodToCall) {
99  		Map<String, String> roleQualification = super.getRoleQualification(
100 				form, methodToCall);
101 		if (form instanceof InquiryForm) {
102 			Map<String, String> primaryKeys = ((InquiryForm) form)
103 					.getInquiryPrimaryKeys();
104 			if (primaryKeys != null) {
105 				for (String keyName : primaryKeys.keySet()) {
106 					roleQualification.put(keyName, primaryKeys.get(keyName));					
107 				}
108 			}
109 		}
110 		return roleQualification;
111 	}
112 
113 	@Override
114     public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
115         request.setAttribute(KRADConstants.PARAM_MAINTENANCE_VIEW_MODE, KRADConstants.PARAM_MAINTENANCE_VIEW_MODE_INQUIRY);
116         return super.execute(mapping, form, request, response);
117     }
118 
119     
120 
121 
122 
123     public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
124         InquiryForm inquiryForm = (InquiryForm) form;
125         if (inquiryForm.getBusinessObjectClassName() == null) {
126             LOG.error("Business object name not given.");
127             throw new RuntimeException("Business object name not given.");
128         }
129         
130         Class boClass = Class.forName(inquiryForm.getBusinessObjectClassName());
131         ModuleService responsibleModuleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(boClass);
132 		if(responsibleModuleService!=null && responsibleModuleService.isExternalizable(boClass)){
133 			String redirectUrl = responsibleModuleService.getExternalizableBusinessObjectInquiryUrl(boClass, (Map<String, String[]>) request.getParameterMap());
134 			ActionForward redirectingActionForward = new RedirectingActionForward(redirectUrl);
135 			redirectingActionForward.setModule("/");
136 			return redirectingActionForward;
137 		}
138 
139 		return continueWithInquiry(mapping, form, request, response);
140     }
141 
142 
143     
144 
145 
146 
147 
148 
149 
150 
151 
152 
153     public ActionForward downloadAttachment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
154         InquiryForm inquiryForm = (InquiryForm) form;
155         int line = getSelectedLine(request);
156 
157         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
158         if (line < 0) {
159             if (bo instanceof PersistableAttachment) {
160                 PersistableAttachment attachment = (PersistableAttachment)bo;
161                 if (StringUtils.isNotBlank(attachment.getFileName())
162                         && attachment.getAttachmentContent() != null) {
163                     streamToResponse(attachment.getAttachmentContent(), attachment.getFileName(), attachment.getContentType(), response);
164                 }
165             }
166         } else {
167             if (bo instanceof PersistableAttachmentList) {
168                 PersistableAttachmentList<PersistableAttachment> attachmentsBo = (PersistableAttachmentList<PersistableAttachment>)bo;
169                 if (CollectionUtils.isEmpty(attachmentsBo.getAttachments())) {
170                     return null;
171                 }
172 
173                 List<? extends PersistableAttachment> attachments = attachmentsBo.getAttachments();
174                 if (CollectionUtils.isNotEmpty(attachments)
175                         && attachments.size() > line) {
176                     PersistableAttachment attachment = (PersistableAttachment)attachmentsBo.getAttachments().get(line);
177                     streamToResponse(attachment.getAttachmentContent(), attachment.getFileName(), attachment.getContentType(), response);
178                 }
179             }
180         }
181         return null;
182     }
183 
184     public ActionForward downloadCustomBOAttachment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
185     	String fileName = request.getParameter(KRADConstants.BO_ATTACHMENT_FILE_NAME);
186 		String contentType = request.getParameter(KRADConstants.BO_ATTACHMENT_FILE_CONTENT_TYPE);
187 		String fileContentBoField = request.getParameter(KRADConstants.BO_ATTACHMENT_FILE_CONTENT_FIELD);
188     	
189     	if (fileName != null
190     			&& contentType != null
191     			&& fileContentBoField != null) {
192     		
193     		checkAuthorization(form, findMethodToCall(form, request));
194     		
195     		fileName = StringUtils.replace(fileName, " ", "_");
196     		
197     		InquiryForm inquiryForm = (InquiryForm) form;
198         	BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
199     		checkBO(bo);
200     		
201     		Class clazz = (bo.getClass());
202     		Method method = clazz.getMethod("get"+StringUtils.capitalize(fileContentBoField));
203     		byte[] fileContents = (byte[]) method.invoke(bo);
204     		streamToResponse(fileContents, fileName, contentType,response);
205     	} else {
206     		if (fileName == null) {
207     			LOG.error("Request Parameter \""+ KRADConstants.BO_ATTACHMENT_FILE_NAME + "\" not provided.");
208     		}
209     		if (contentType == null) {
210     			LOG.error("Request Parameter \""+ KRADConstants.BO_ATTACHMENT_FILE_CONTENT_TYPE + "\" not provided.");
211     		}
212     		if (fileContentBoField == null) {
213     			LOG.error("Request Parameter \""+ KRADConstants.BO_ATTACHMENT_FILE_CONTENT_FIELD + "\" not provided.");
214     		}
215     	}
216     	return null;
217     }
218     
219     
220     
221 
222 
223 
224 
225 
226 
227 
228 
229 
230     public ActionForward downloadBOAttachment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
231         Long noteIdentifier = Long.valueOf(request.getParameter(KRADConstants.NOTE_IDENTIFIER));
232 
233         Note note = this.getNoteService().getNoteByNoteId(noteIdentifier);
234         if(note != null){
235         	Attachment attachment = note.getAttachment();
236         	if(attachment != null){
237         		
238         		attachment.setNote(note);
239         		WebUtils.saveMimeInputStreamAsFile(response, attachment.getAttachmentMimeTypeCode(), attachment.getAttachmentContents(), attachment.getAttachmentFileName(), attachment.getAttachmentFileSize().intValue());
240         	}
241         	return null;
242         }
243         
244         return mapping.findForward(RiceConstants.MAPPING_BASIC);
245     }
246     
247     public ActionForward continueWithInquiry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
248     	InquiryForm inquiryForm = (InquiryForm) form;
249     	
250     	if (inquiryForm.getBusinessObjectClassName() == null) {
251     		LOG.error("Business object name not given.");
252     		throw new RuntimeException("Business object name not given.");
253     	}
254     	
255         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
256         checkBO(bo);
257         
258         populateSections(mapping, request, inquiryForm, bo);
259         
260         return mapping.findForward(RiceConstants.MAPPING_BASIC);
261     }
262     
263     
264 
265 
266     public ActionForward toggleInactiveRecordDisplay(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
267         InquiryForm inquiryForm = (InquiryForm) form;
268         if (inquiryForm.getBusinessObjectClassName() == null) {
269             LOG.error("Business object name not given.");
270             throw new RuntimeException("Business object name not given.");
271         }
272         
273         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
274         checkBO(bo);
275         
276         Inquirable kualiInquirable = inquiryForm.getInquirable();
277         
278         String collectionName = extractCollectionName(request, KRADConstants.TOGGLE_INACTIVE_METHOD);
279         if (collectionName == null) {
280             LOG.error("Unable to get find collection name in request.");
281             throw new RuntimeException("Unable to get find collection class in request.");
282         }  
283         String parameterName = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE);
284         boolean showInactive = Boolean.parseBoolean(StringUtils.substringBetween(parameterName, KRADConstants.METHOD_TO_CALL_BOPARM_LEFT_DEL, "."));
285         kualiInquirable.setShowInactiveRecords(collectionName, showInactive);
286         
287         
288         populateSections(mapping, request, inquiryForm, bo);
289 
290         
291         if (showInactive) {
292         	WebUtils.reopenInactiveRecords(inquiryForm.getSections(), inquiryForm.getTabStates(), collectionName);
293         }
294         
295         return mapping.findForward(RiceConstants.MAPPING_BASIC);
296     }
297 
298     @Override
299     public ActionForward toggleTab(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
300         InquiryForm inquiryForm = (InquiryForm) form;
301         if (inquiryForm.getBusinessObjectClassName() == null) {
302             LOG.error("Business object name not given.");
303             throw new RuntimeException("Business object name not given.");
304         }
305         
306         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
307         checkBO(bo);
308         
309         populateSections(mapping, request, inquiryForm, bo);
310         
311         Inquirable kualiInquirable = inquiryForm.getInquirable();
312         
313         return super.toggleTab(mapping, form, request, response);
314     }
315     
316     
317     
318     
319 
320 
321 	@Override
322 	public ActionForward hideAllTabs(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
323         
324 		InquiryForm inquiryForm = (InquiryForm) form;
325         if (inquiryForm.getBusinessObjectClassName() == null) {
326             LOG.error("Business object name not given.");
327             throw new RuntimeException("Business object name not given.");
328         }
329         
330         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
331         checkBO(bo);
332         
333         populateSections(mapping, request, inquiryForm, bo);
334 		
335 		return super.hideAllTabs(mapping, form, request, response);
336 	}
337 
338 	
339 
340 
341 	@Override
342 	public ActionForward showAllTabs(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
343         
344 		InquiryForm inquiryForm = (InquiryForm) form;
345         if (inquiryForm.getBusinessObjectClassName() == null) {
346             LOG.error("Business object name not given.");
347             throw new RuntimeException("Business object name not given.");
348         }
349         
350         BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
351         checkBO(bo);
352         
353         populateSections(mapping, request, inquiryForm, bo);
354 		
355 		return super.showAllTabs(mapping, form, request, response);
356 	}
357 
358 	
359 
360 
361     public ActionForward export(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
362     	InquiryForm inquiryForm = (InquiryForm) form;
363     	if (inquiryForm.isCanExport()) {
364     		BusinessObject bo = retrieveBOFromInquirable(inquiryForm);
365     		checkBO(bo);
366     		if (bo != null) {
367 	    		BusinessObjectEntry businessObjectEntry = KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(inquiryForm.getBusinessObjectClassName());
368 	    		Class<? extends Exporter> exporterClass = businessObjectEntry.getExporterClass();
369 	    		if (exporterClass != null) {
370 	    			Exporter exporter = exporterClass.newInstance();
371 	        		response.setContentType(KRADConstants.XML_MIME_TYPE);
372 	        		response.setHeader("Content-disposition", "attachment; filename=export.xml");
373 	        		exporter.export(businessObjectEntry.getBusinessObjectClass(), Collections.singletonList(bo), KRADConstants.XML_FORMAT, response.getOutputStream());
374 	        	}
375     		} else {
376     			
377     			populateSections(mapping, request, inquiryForm, bo);
378     			return mapping.findForward(RiceConstants.MAPPING_BASIC); 
379     		}
380         }
381         
382         return null;
383     }
384 
385     
386 
387 
388 
389 
390     protected String extractCollectionName(HttpServletRequest request, String methodToCall) {
391         
392         String parameterName = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE);
393         String collectionName = null;
394         if (StringUtils.isNotBlank(parameterName)) {
395             collectionName = StringUtils.substringBetween(parameterName, methodToCall + ".", ".(");
396         }
397         return collectionName;
398     }
399     
400     protected BusinessObject retrieveBOFromInquirable(InquiryForm inquiryForm) {
401     	Inquirable kualiInquirable = inquiryForm.getInquirable();
402         
403         BusinessObject bo = kualiInquirable.getBusinessObject(inquiryForm.retrieveInquiryDecryptedPrimaryKeys());
404         if (bo == null) {
405             LOG.error("No records found in inquiry action.");
406             GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, RiceKeyConstants.ERROR_INQUIRY);
407         }
408         return bo;
409     }
410     
411     protected void populateSections(ActionMapping mapping, HttpServletRequest request, InquiryForm inquiryForm, BusinessObject bo) {
412     	Inquirable kualiInquirable = inquiryForm.getInquirable();
413     	
414     	if (bo != null) {
415     		
416     		List<Section> sections = kualiInquirable.getSections(bo);
417         	inquiryForm.setSections(sections);
418         	kualiInquirable.addAdditionalSections(sections, bo);
419     	} else {
420     		inquiryForm.setSections(getEmptySections(kualiInquirable.getTitle()));
421     	}
422 
423         request.setAttribute(KRADConstants.INQUIRABLE_ATTRIBUTE_NAME, kualiInquirable);
424     }
425     
426     
427 
428 
429 
430 
431 
432 
433    protected void streamToResponse(byte[] fileContents, String fileName, String fileContentType,HttpServletResponse response) throws Exception{
434        ByteArrayOutputStream baos = null;
435        try{
436            baos = new ByteArrayOutputStream(fileContents.length);
437            baos.write(fileContents);
438            WebUtils.saveMimeOutputStreamAsFile(response, fileContentType, baos, fileName);
439        }finally{
440            try{
441                if(baos!=null){
442                    baos.close();
443                    baos = null;
444                }
445            }catch(IOException ioEx){
446                LOG.error("Error while downloading attachment");
447                throw new RuntimeException("IOException occurred while downloading attachment", ioEx);
448            }
449        }
450    }
451     
452 
453 
454 
455 
456     private List<Section> getEmptySections(String title) {
457     	final Row row = new Row(Collections.<Field>emptyList());
458     	
459     	final Section section = new Section(Collections.singletonList(row));
460 		section.setErrorKey("*");
461 		section.setSectionTitle(title != null ? title : "");
462 		section.setNumberOfColumns(0);
463 		
464 		return Collections.singletonList(section);
465     }
466     
467     
468 
469 
470 
471 
472     private void checkBO(BusinessObject bo) {
473         if (bo == null && GlobalVariables.getMessageMap().hasNoMessages()) {
474         	throw new UnsupportedOperationException("The record you have inquired on does not exist.");
475         }
476     }
477     
478     protected NoteService getNoteService() {
479 		if ( noteService == null ) {
480 			noteService = KRADServiceLocator.getNoteService();
481 		}
482 		return this.noteService;
483 	}
484 }