001 /* 002 * Copyright 2011 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.kfs.module.bc.document.web.struts; 017 018 import java.util.Properties; 019 020 import javax.servlet.http.HttpServletRequest; 021 import javax.servlet.http.HttpServletResponse; 022 import javax.servlet.http.HttpSession; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.apache.struts.action.ActionForm; 026 import org.apache.struts.action.ActionForward; 027 import org.apache.struts.action.ActionMapping; 028 import org.kuali.kfs.module.bc.BCConstants; 029 import org.kuali.kfs.module.bc.BCKeyConstants; 030 import org.kuali.kfs.module.bc.BCPropertyConstants; 031 import org.kuali.kfs.sys.KFSConstants; 032 import org.kuali.rice.kns.util.ErrorMap; 033 import org.kuali.rice.kns.util.GlobalVariables; 034 import org.kuali.rice.kns.util.MessageList; 035 import org.kuali.rice.kns.util.UrlFactory; 036 import org.kuali.rice.kns.web.struts.action.KualiAction; 037 038 /** 039 * Handles close action to implement Budget return to caller (expansion screen) flow. 040 */ 041 public class BudgetExpansionAction extends KualiAction { 042 043 /** 044 * @see org.kuali.rice.kns.web.struts.action.KualiAction#execute(org.apache.struts.action.ActionMapping, 045 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 046 */ 047 @Override 048 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 049 050 BudgetExpansionForm budgetExpansionForm = (BudgetExpansionForm) form; 051 052 // check for session timeout if not initial (re)load of BC selection 053 if (!(mapping.getType().endsWith("BudgetConstructionSelectionAction") && (budgetExpansionForm.getMethodToCall().equals(BCConstants.LOAD_EXPANSION_SCREEN_METHOD) || budgetExpansionForm.getMethodToCall().equals(BCConstants.LOAD_EXPANSION_SCREEN_METHOD_SESSION_TIMEOUT)))) { 054 055 Boolean isBCHeartBeating = (Boolean) GlobalVariables.getUserSession().retrieveObject(BCConstants.BC_HEARTBEAT_SESSIONFLAG); 056 if (isBCHeartBeating == null) { 057 budgetExpansionForm.setLostSession(Boolean.TRUE); 058 059 if (form instanceof SalarySettingBaseForm){ 060 SalarySettingBaseForm salarySettingBaseForm = (SalarySettingBaseForm) form; 061 if (!salarySettingBaseForm.isBudgetByAccountMode()){ 062 GlobalVariables.getMessageList().add(BCKeyConstants.MESSAGE_BUDGET_PREVIOUS_SESSION_TIMEOUT); 063 return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING); 064 } 065 } 066 if (budgetExpansionForm.isMainWindow()){ 067 Properties parameters = new Properties(); 068 parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, BCConstants.LOAD_EXPANSION_SCREEN_METHOD_SESSION_TIMEOUT); 069 070 String lookupUrl = UrlFactory.parameterizeUrl("/" + BCConstants.BC_SELECTION_ACTION, parameters); 071 072 return new ActionForward(lookupUrl, true); 073 } 074 else { 075 GlobalVariables.getMessageList().add(BCKeyConstants.MESSAGE_BUDGET_PREVIOUS_SESSION_TIMEOUT); 076 return mapping.findForward(BCConstants.MAPPING_LOST_SESSION_RETURNING); 077 } 078 } 079 } 080 081 return super.execute(mapping, form, request, response); 082 } 083 084 /** 085 * Handling for screen close. Default action is return to caller. 086 * 087 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, 088 * javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 089 */ 090 public ActionForward close(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 091 return returnToCaller(mapping, form, request, response); 092 } 093 094 /** 095 * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping, 096 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 097 */ 098 @Override 099 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 100 this.moveCallBackMessagesInPlace(); 101 this.removeCallBackMessagesObjectFromSession(); 102 103 return super.refresh(mapping, form, request, response); 104 } 105 106 /** 107 * Return to form's back location (usually previous screen). Returns back the form key that was passed in for the previous form 108 * and any previous anchor position. Default refresh method is executed. 109 * 110 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, 111 * javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 112 */ 113 public ActionForward returnToCaller(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 114 BudgetExpansionForm budgetExpansionForm = (BudgetExpansionForm) form; 115 116 // if this form is session scoped remove it 117 this.cleanupAnySessionForm(mapping, request); 118 119 Properties parameters = new Properties(); 120 parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, BCConstants.BC_SELECTION_REFRESH_METHOD); 121 parameters.put(KFSConstants.DOC_FORM_KEY, budgetExpansionForm.getReturnFormKey()); 122 123 if (StringUtils.isNotEmpty(budgetExpansionForm.getReturnAnchor())) { 124 parameters.put(KFSConstants.ANCHOR, budgetExpansionForm.getReturnAnchor()); 125 } 126 parameters.put(KFSConstants.REFRESH_CALLER, this.getClass().getName()); 127 128 this.addCallBackMessagesAsObjectInSession(budgetExpansionForm); 129 130 String backUrl = UrlFactory.parameterizeUrl(budgetExpansionForm.getBackLocation(), parameters); 131 return new ActionForward(backUrl, true); 132 } 133 134 /** 135 * add the callback messages and error messages as objects in session variable 136 */ 137 public void addCallBackMessagesAsObjectInSession(BudgetExpansionForm budgetExpansionForm) { 138 if (!budgetExpansionForm.getCallBackMessages().isEmpty()) { 139 GlobalVariables.getUserSession().addObject(BCPropertyConstants.CALL_BACK_MESSAGES, budgetExpansionForm.getCallBackMessages()); 140 } 141 142 if (budgetExpansionForm.getCallBackErrors().hasErrors()) { 143 GlobalVariables.getUserSession().addObject(BCPropertyConstants.CALL_BACK_ERRORS, budgetExpansionForm.getCallBackErrors()); 144 } 145 } 146 147 /** 148 * remove the objects that hold the callback messages and error messages from session variable 149 */ 150 public void removeCallBackMessagesObjectFromSession() { 151 GlobalVariables.getUserSession().removeObject(BCPropertyConstants.CALL_BACK_MESSAGES); 152 GlobalVariables.getUserSession().removeObject(BCPropertyConstants.CALL_BACK_ERRORS); 153 } 154 155 /** 156 * move the callback messages and error messages in place 157 */ 158 public void moveCallBackMessagesInPlace() { 159 MessageList messagesList = (MessageList) GlobalVariables.getUserSession().retrieveObject(BCPropertyConstants.CALL_BACK_MESSAGES); 160 if (messagesList != null) { 161 GlobalVariables.getMessageList().addAll(messagesList); 162 } 163 164 ErrorMap errorMap = (ErrorMap) GlobalVariables.getUserSession().retrieveObject(BCPropertyConstants.CALL_BACK_ERRORS); 165 if (errorMap != null) { 166 GlobalVariables.setErrorMap(errorMap); 167 } 168 } 169 170 /** 171 * remove any session form attribute 172 * 173 * @param mapping 174 * @param request 175 */ 176 public void cleanupAnySessionForm(ActionMapping mapping, HttpServletRequest request) { 177 if (BCConstants.MAPPING_SCOPE_SESSION.equals(mapping.getScope())) { 178 HttpSession sess = request.getSession(Boolean.FALSE); 179 String formName = mapping.getAttribute(); 180 sess.removeAttribute(formName); 181 } 182 } 183 }