/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.bc.document.web.struts;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.kfs.module.bc.BCConstants;
import org.kuali.kfs.module.bc.BCPropertyConstants;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.rice.kns.util.KNSGlobalVariables;
import org.kuali.rice.kns.util.MessageList;
import org.kuali.rice.kns.web.struts.action.KualiAction;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.MessageMap;
import org.kuali.rice.krad.util.UrlFactory;
/**
* Handles close action to implement Budget return to caller (expansion screen) flow.
*/
public class BudgetExpansionAction extends KualiAction {
/**
* @see org.kuali.rice.kns.web.struts.action.KualiAction#execute(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
BudgetExpansionForm budgetExpansionForm = (BudgetExpansionForm) form;
return super.execute(mapping, form, request, response);
}
/**
* Handling for screen close. Default action is return to caller.
*
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm,
* javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward close(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
return returnToCaller(mapping, form, request, response);
}
/**
* @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.moveCallBackMessagesInPlace();
this.removeCallBackMessagesObjectFromSession();
return super.refresh(mapping, form, request, response);
}
/**
* Return to form's back location (usually previous screen). Returns back the form key that was passed in for the previous form
* and any previous anchor position. Default refresh method is executed.
*
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm,
* javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward returnToCaller(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
BudgetExpansionForm budgetExpansionForm = (BudgetExpansionForm) form;
// if this form is session scoped remove it
this.cleanupAnySessionForm(mapping, request);
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, BCConstants.BC_SELECTION_REFRESH_METHOD);
parameters.put(KFSConstants.DOC_FORM_KEY, budgetExpansionForm.getReturnFormKey());
if (StringUtils.isNotEmpty(budgetExpansionForm.getReturnAnchor())) {
parameters.put(KFSConstants.ANCHOR, budgetExpansionForm.getReturnAnchor());
}
parameters.put(KFSConstants.REFRESH_CALLER, this.getClass().getName());
this.addCallBackMessagesAsObjectInSession(budgetExpansionForm);
String backUrl = UrlFactory.parameterizeUrl(budgetExpansionForm.getBackLocation(), parameters);
return new ActionForward(backUrl, true);
}
/**
* add the callback messages and error messages as objects in session variable
*/
public void addCallBackMessagesAsObjectInSession(BudgetExpansionForm budgetExpansionForm) {
if (!budgetExpansionForm.getCallBackMessages().isEmpty()) {
GlobalVariables.getUserSession().addObject(BCPropertyConstants.CALL_BACK_MESSAGES, budgetExpansionForm.getCallBackMessages());
}
if (budgetExpansionForm.getCallBackErrors().hasErrors()) {
GlobalVariables.getUserSession().addObject(BCPropertyConstants.CALL_BACK_ERRORS, budgetExpansionForm.getCallBackErrors());
}
}
/**
* remove the objects that hold the callback messages and error messages from session variable
*/
public void removeCallBackMessagesObjectFromSession() {
GlobalVariables.getUserSession().removeObject(BCPropertyConstants.CALL_BACK_MESSAGES);
GlobalVariables.getUserSession().removeObject(BCPropertyConstants.CALL_BACK_ERRORS);
}
/**
* move the callback messages and error messages in place
*/
public void moveCallBackMessagesInPlace() {
MessageList messagesList = (MessageList) GlobalVariables.getUserSession().retrieveObject(BCPropertyConstants.CALL_BACK_MESSAGES);
if (messagesList != null) {
KNSGlobalVariables.getMessageList().addAll(messagesList);
}
MessageMap messageMap = (MessageMap) GlobalVariables.getUserSession().retrieveObject(BCPropertyConstants.CALL_BACK_ERRORS);
if (messageMap != null) {
GlobalVariables.setMessageMap(messageMap);
}
}
/**
* remove any session form attribute
*
* @param mapping
* @param request
*/
public void cleanupAnySessionForm(ActionMapping mapping, HttpServletRequest request) {
if (BCConstants.MAPPING_SCOPE_SESSION.equals(mapping.getScope())) {
HttpSession sess = request.getSession(Boolean.FALSE);
String formName = mapping.getAttribute();
sess.removeAttribute(formName);
}
}
}