001    /**
002     * Copyright 2005-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krad.web.controller;
017    
018    import java.util.Collections;
019    
020    import javax.servlet.http.HttpServletRequest;
021    import javax.servlet.http.HttpServletResponse;
022    
023    import org.kuali.rice.krad.bo.Exporter;
024    import org.kuali.rice.krad.datadictionary.DataObjectEntry;
025    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026    import org.kuali.rice.krad.util.GlobalVariables;
027    import org.kuali.rice.krad.util.KRADConstants;
028    import org.kuali.rice.krad.util.KRADUtils;
029    import org.kuali.rice.krad.web.form.InquiryForm;
030    import org.kuali.rice.krad.web.form.UifFormBase;
031    import org.springframework.stereotype.Controller;
032    import org.springframework.validation.BindingResult;
033    import org.springframework.web.bind.annotation.ModelAttribute;
034    import org.springframework.web.bind.annotation.RequestMapping;
035    import org.springframework.web.servlet.ModelAndView;
036    
037    /**
038     * Controller for <code>InquiryView</code> screens which handle
039     * initial requests for the inquiry and actions coming from the
040     * inquiry view such as export
041     *
042     * @author Kuali Rice Team (rice.collab@kuali.org)
043     */
044    @Controller
045    @RequestMapping(value = "/inquiry")
046    public class InquiryController extends UifControllerBase {
047        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InquiryController.class);
048    
049        /**
050         * @see org.kuali.rice.krad.web.controller.UifControllerBase#createInitialForm(javax.servlet.http.HttpServletRequest)
051         */
052        @Override
053        protected InquiryForm createInitialForm(HttpServletRequest request) {
054            return new InquiryForm();
055        }
056    
057        /**
058         * Invoked to display the inquiry view for a data object record
059         *
060         * <p>
061         * Data object class name and values for a primary or alternate key set must
062         * be sent in the request
063         * </p>
064         *
065         * <p>
066         * Invokes the inquirable to perform the query for the data object record, if not found
067         * an exception will be thrown. If found the object is set on the form and then the view
068         * is rendered
069         * </p>
070         */
071        @RequestMapping(params = "methodToCall=start")
072        @Override
073        public ModelAndView start(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
074                HttpServletRequest request, HttpServletResponse response) {
075            InquiryForm inquiryForm = (InquiryForm) form;
076    
077            // initialize data object class in inquirable
078            try {
079                inquiryForm.getInquirable().setDataObjectClass(Class.forName(inquiryForm.getDataObjectClassName()));
080            } catch (ClassNotFoundException e) {
081                LOG.error("Unable to get new instance for object class: " + inquiryForm.getDataObjectClassName(), e);
082                throw new RuntimeException(
083                        "Unable to get new instance for object class: " + inquiryForm.getDataObjectClassName(), e);
084            }
085    
086            // invoke inquirable to retrieve inquiry data object
087            Object dataObject = inquiryForm.getInquirable()
088                    .retrieveDataObject(KRADUtils.translateRequestParameterMap(request.getParameterMap()));
089    
090            if (dataObject == null && GlobalVariables.getMessageMap().hasNoMessages()) {
091                LOG.error("The record you have inquired on does not exist.");
092                inquiryForm.setView(getViewService().getViewById("InquiryNoResultView"));
093    //            throw new UnsupportedOperationException("The record you have inquired on does not exist.");
094            }
095            inquiryForm.setDataObject(dataObject);
096    
097            return getUIFModelAndView(inquiryForm);
098        }
099        
100        /**
101         * Handles exporting the BusinessObject for this Inquiry to XML if it has a custom XML exporter available.
102         */
103        @RequestMapping(params = "methodToCall=export")
104        public ModelAndView export(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
105                HttpServletRequest request, HttpServletResponse response) throws Exception  {
106            InquiryForm inquiryForm = (InquiryForm) form;
107            
108            Object dataObject = inquiryForm.getDataObject();
109            
110            if (dataObject != null) {
111                DataObjectEntry dataObjectEntry = KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().getDataObjectEntry(inquiryForm.getDataObjectClassName());
112                Class<? extends Exporter> exporterClass = dataObjectEntry.getExporterClass();
113                if (exporterClass != null) {
114                    Exporter exporter = exporterClass.newInstance();
115                    response.setContentType(KRADConstants.XML_MIME_TYPE);
116                    response.setHeader("Content-disposition", "attachment; filename=export.xml");
117                    exporter.export(dataObjectEntry.getDataObjectClass(), Collections.singletonList(dataObject), KRADConstants.XML_FORMAT, response.getOutputStream());
118                }
119            }
120            
121             return null;
122        }
123    }