/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/metaobj/trunk/metaobj-util/tool-lib/src/java/org/sakaiproject/metaobj/utils/mvc/impl/servlet/FormControllerImpl.java $ * $Id: FormControllerImpl.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2004, 2005, 2006, 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.metaobj.utils.mvc.impl.servlet; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.metaobj.shared.FormHelper; import org.sakaiproject.metaobj.utils.mvc.impl.ControllerFilterManager; import org.sakaiproject.metaobj.utils.mvc.impl.HttpServletHelper; import org.sakaiproject.metaobj.utils.mvc.intf.CancelableController; import org.sakaiproject.metaobj.utils.mvc.intf.Controller; import org.sakaiproject.metaobj.utils.mvc.intf.CustomCommandController; import org.sakaiproject.metaobj.utils.mvc.intf.FormController; import org.sakaiproject.metaobj.utils.mvc.intf.LoadObjectController; import org.sakaiproject.metaobj.utils.mvc.intf.TypedPropertyEditor; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; /** * Created by IntelliJ IDEA. * User: John Ellis * Date: Mar 25, 2004 * Time: 3:45:21 PM * To change this template use File | Settings | File Templates. */ public class FormControllerImpl extends SimpleFormController { private Controller controller = null; private Map screenMappings = null; private ServletRequestDataBinder servletRequestMapDataBinder = null; private String homeName; private List customTypedEditors = new ArrayList(); private String formMethod; private String[] requiredFields = null; private Collection filters; //Constant for property enabling save attempt/success cookies (SAK-15911) protected static final String PROP_SAVE_COOKIES = "metaobj.save.cookies"; protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Map requestMap = HttpServletHelper.getInstance().createRequestMap(request); Map session = HttpServletHelper.getInstance().createSessionMap(request); Map application = HttpServletHelper.getInstance().createApplicationMap(request); ModelAndView returnedMv; if (controller instanceof CancelableController && ((CancelableController) controller).isCancel(requestMap)) { returnedMv = ((CancelableController) controller).processCancel(requestMap, session, application, command, errors); } else { returnedMv = controller.handleRequest(command, requestMap, session, application, errors); } boolean saveCookies = ServerConfigurationService.getBoolean(PROP_SAVE_COOKIES, false); if (errors.hasErrors()) { logger.debug("Form submission errors: " + errors.getErrorCount()); HttpServletHelper.getInstance().reloadApplicationMap(request, application); HttpServletHelper.getInstance().reloadSessionMap(request, session); HttpServletHelper.getInstance().reloadRequestMap(request, requestMap); if (saveCookies) { Cookie cookie = new Cookie(FormHelper.FORM_SAVE_ATTEMPT, "yes"); cookie.setMaxAge(30); cookie.setPath("/"); response.addCookie(cookie); } return showForm(request, response, errors); } if (returnedMv.getViewName() != null) { // should get from mappings String mappedView = (String) screenMappings.get(returnedMv.getViewName()); if (mappedView == null) { mappedView = returnedMv.getViewName(); } //getControllerFilterManager().processFilters(requestMap, session, application, returnedMv, mappedView); returnedMv = new ModelAndView(mappedView, returnedMv.getModel()); } //We have a successful save coming back, so we set/append to a cookie String savedForm = (String) session.get(FormHelper.FORM_SAVE_SUCCESS); if (savedForm != null && saveCookies) { Cookie cookie = null; if (request.getCookies() != null) { for (Cookie c : request.getCookies()) { if (FormHelper.FORM_SAVE_SUCCESS.equals(c.getName())) { String[] forms = c.getValue().split(","); StringBuilder value = new StringBuilder(); boolean alreadyIncluded = false; for (String form : forms) { if (form.equals(savedForm)) { alreadyIncluded = true; } value.append(",").append(form); } if (!alreadyIncluded) { value.append(",").append(savedForm); } cookie = new Cookie(FormHelper.FORM_SAVE_SUCCESS, value.substring(1)); } } } if (cookie == null) { cookie = new Cookie(FormHelper.FORM_SAVE_SUCCESS, savedForm); } cookie.setMaxAge(2000000); cookie.setPath("/"); response.addCookie(cookie); } HttpServletHelper.getInstance().reloadApplicationMap(request, application); HttpServletHelper.getInstance().reloadSessionMap(request, session); HttpServletHelper.getInstance().reloadRequestMap(request, requestMap); return returnedMv; } protected Map referenceData(HttpServletRequest request, Object command, Errors errors) { if (getController() instanceof FormController) { Map requestMap = HttpServletHelper.getInstance().createRequestMap(request); Map referenceData = ((FormController) getController()).referenceData(requestMap, command, errors); HttpServletHelper.getInstance().reloadRequestMap(request, requestMap); return referenceData; } return null; } protected boolean isFormSubmission(HttpServletRequest request) { if (getFormMethod() != null && getFormMethod().equalsIgnoreCase("get") && request.getMethod().equalsIgnoreCase("get")) { return true; } if (getFormMethod() != null && getFormMethod().equalsIgnoreCase("post") && request.getMethod().equalsIgnoreCase("post")) { return true; } return super.isFormSubmission(request); } protected Object formBackingObject(HttpServletRequest request) throws Exception { Map requestMap = HttpServletHelper.getInstance().createRequestMap(request); Map session = HttpServletHelper.getInstance().createSessionMap(request); Map application = HttpServletHelper.getInstance().createApplicationMap(request); Object lightObject = null; if (controller instanceof CustomCommandController) { lightObject = ((CustomCommandController) controller).formBackingObject(requestMap, session, application); } else { lightObject = super.formBackingObject(request); } Object returned = lightObject; if (controller instanceof LoadObjectController) { // need to bind variables to fill in lightweight object // then pass object to real control to fill in // this will get the info from the backing store ServletRequestDataBinder binder = createBinder(request, lightObject); binder.bind(request); returned = ((LoadObjectController) controller).fillBackingObject(lightObject, requestMap, session, application); } /* if (controller instanceof ContextAwareController){ ((ContextAwareController) controller).addContexts(getHelpManager().getActiveContexts(session), requestMap, getFormView()); } else { getHelpManager().addContexts(session, getFormView()); } */ //getControllerFilterManager().processFilters(requestMap, session, application, null, getFormView()); HttpServletHelper.getInstance().reloadApplicationMap(request, application); HttpServletHelper.getInstance().reloadSessionMap(request, session); HttpServletHelper.getInstance().reloadRequestMap(request, requestMap); return returned; } protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object command) throws Exception { ServletRequestDataBinder binder = null; binder = new ServletRequestBeanDataBinder(command, getCommandName()); initBinder(request, binder); return binder; } /** * Set up a custom property editor for the application's date format. */ protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { for (Iterator i = getCustomTypedEditors().iterator(); i.hasNext();) { TypedPropertyEditor editor = (TypedPropertyEditor) i.next(); binder.registerCustomEditor(editor.getType(), editor); } if (getRequiredFields() != null) { binder.setRequiredFields(getRequiredFields()); } } public Controller getController() { return controller; } public void setController(Controller controller) { this.controller = controller; } public Map getScreenMappings() { return screenMappings; } public void setScreenMappings(Map screenMappings) { this.screenMappings = screenMappings; } public ServletRequestDataBinder getServletRequestMapDataBinder() { return servletRequestMapDataBinder; } public void setServletRequestMapDataBinder(ServletRequestDataBinder servletRequestMapDataBinder) { this.servletRequestMapDataBinder = servletRequestMapDataBinder; } public String getHomeName() { return homeName; } public void setHomeName(String homeName) { this.homeName = homeName; } public List getCustomTypedEditors() { return customTypedEditors; } public void setCustomTypedEditors(List customTypedEditors) { this.customTypedEditors = customTypedEditors; } public String getFormMethod() { return formMethod; } public void setFormMethod(String formMethod) { this.formMethod = formMethod; } public String[] getRequiredFields() { return requiredFields; } public void setRequiredFields(String[] requiredFields) { this.requiredFields = requiredFields; } protected ControllerFilterManager getControllerFilterManager() { return (ControllerFilterManager) ComponentManager.getInstance().get("controllerFilterManager"); } }