001    /**
002     * Copyright 2005-2014 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.kns.web.struts.action;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.apache.struts.action.ActionForm;
020    import org.apache.struts.action.ActionForward;
021    import org.apache.struts.action.ActionMapping;
022    import org.kuali.rice.core.api.util.RiceConstants;
023    import org.kuali.rice.kns.web.struts.form.QuestionPromptForm;
024    import org.kuali.rice.krad.exception.AuthorizationException;
025    import org.kuali.rice.krad.util.GlobalVariables;
026    import org.kuali.rice.krad.util.KRADConstants;
027    import org.kuali.rice.krad.util.UrlFactory;
028    
029    import javax.servlet.http.HttpServletRequest;
030    import javax.servlet.http.HttpServletResponse;
031    import java.util.Properties;
032    
033    /**
034     * This class handles Actions for QuestionPromp.
035     *
036     * @deprecated KNS Struts deprecated, use KRAD and the Spring MVC framework.
037     */
038    @Deprecated
039    public class QuestionPromptAction extends KualiAction {
040            
041        /**
042             * This overridden method ...
043             * 
044             * @see org.kuali.rice.krad.web.struts.action.KualiAction#checkAuthorization(org.apache.struts.action.ActionForm, java.lang.String)
045             */
046            @Override
047            protected void checkAuthorization(ActionForm form, String methodToCall)
048                            throws AuthorizationException {
049                    // no authorization required
050            }
051    
052            /**
053         * This method is the entry point action for the question prompt component.
054         *
055         * @param mapping
056         * @param form
057         * @param request
058         * @param response
059         * @return ActionForward
060         * @throws Exception
061         */
062        public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
063            // deal with the fact that some requests might be reposts from errors on the reason field
064            processErrorMessages(request);
065    
066            return mapping.findForward(RiceConstants.MAPPING_BASIC);
067        }
068    
069        /**
070         * This method handles gathering all input and passing control back to the caller action.
071         *
072         * @param mapping
073         * @param form
074         * @param request
075         * @param response
076         * @return ActionForward
077         * @throws Exception
078         */
079        public ActionForward processAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
080            QuestionPromptForm questionPromptForm = (QuestionPromptForm) form;
081    
082            Properties parameters = new Properties();
083    
084            parameters.put(KRADConstants.DOC_FORM_KEY, questionPromptForm.getFormKey());
085            parameters.put(KRADConstants.QUESTION_CLICKED_BUTTON, getSelectedButton(request));
086            parameters.put(KRADConstants.METHOD_TO_CALL_ATTRIBUTE, questionPromptForm.getCaller());
087            parameters.put(KRADConstants.REFRESH_CALLER, KRADConstants.QUESTION_REFRESH);
088            parameters.put(KRADConstants.QUESTION_INST_ATTRIBUTE_NAME, questionPromptForm.getQuestionIndex());
089            if(questionPromptForm.getDocNum() != null){
090                    parameters.put(KRADConstants.DOC_NUM, questionPromptForm.getDocNum());
091            }
092            
093            if (StringUtils.isNotBlank(questionPromptForm.getQuestionAnchor())) {
094                parameters.put(KRADConstants.ANCHOR, questionPromptForm.getQuestionAnchor());
095            }
096    
097            String context = questionPromptForm.getContext();
098            if (StringUtils.isNotBlank(context)) {
099                parameters.put(KRADConstants.QUESTION_CONTEXT, context);
100            }
101            String reason = questionPromptForm.getReason();
102            if (StringUtils.isNotBlank(reason)) {
103                parameters.put(KRADConstants.QUESTION_REASON_ATTRIBUTE_NAME, reason);
104            }
105            if (StringUtils.isNotBlank(questionPromptForm.getMethodToCallPath())) {
106                // For header tab navigation. Leaving it blank will just kick user back to page.
107                parameters.put(questionPromptForm.getMethodToCallPath(), "present");
108            }
109    
110            String returnUrl = UrlFactory.parameterizeUrl(questionPromptForm.getBackLocation(), parameters);
111    
112            return new ActionForward(returnUrl, true);
113        }
114    
115        /**
116         * Parses the method to call attribute to pick off the button number that was pressed.
117         *
118         * @param request
119         * @return int
120         */
121        private String getSelectedButton(HttpServletRequest request) {
122            String selectedButton = "-1";
123            String parameterName = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE);
124            if (StringUtils.isNotBlank(parameterName)) {
125                selectedButton = StringUtils.substringBetween(parameterName, ".button", ".");
126            }
127    
128            return selectedButton;
129        }
130    
131        /**
132         * This method handles processing any error messages coming in the door.
133         *
134         * @param request
135         */
136        private void processErrorMessages(HttpServletRequest request) {
137            String errorKey = request.getParameter(KRADConstants.QUESTION_ERROR_KEY);
138            String errorPropertyName = request.getParameter(KRADConstants.QUESTION_ERROR_PROPERTY_NAME);
139            String errorParameter = request.getParameter(KRADConstants.QUESTION_ERROR_PARAMETER);
140    
141            if (StringUtils.isNotBlank(errorKey)) {
142                if (StringUtils.isBlank(errorPropertyName)) {
143                    throw new IllegalStateException("Both the errorKey and the errorPropertyName must be filled in, " + "in order for errors to be displayed by the question component.  Currently, " + "only the errorKey has a value specified.");
144                }
145                else {
146                    if (StringUtils.isBlank(errorParameter)) {
147                        GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(errorPropertyName, errorKey);
148                    }
149                    else {
150                        GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(errorPropertyName, errorKey, errorParameter);
151                    }
152                }
153            }
154        }
155    }