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.uif.util;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.apache.log4j.Logger;
020 import org.kuali.rice.krad.UserSession;
021 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
022 import org.kuali.rice.krad.service.SessionDocumentService;
023 import org.kuali.rice.krad.uif.UifConstants;
024 import org.kuali.rice.krad.uif.view.History;
025 import org.kuali.rice.krad.uif.view.View;
026 import org.kuali.rice.krad.uif.component.Component;
027 import org.kuali.rice.krad.uif.service.ViewService;
028 import org.kuali.rice.krad.util.KRADConstants;
029 import org.kuali.rice.krad.util.KRADUtils;
030 import org.kuali.rice.krad.web.controller.UifControllerBase;
031 import org.kuali.rice.krad.web.form.DocumentFormBase;
032 import org.kuali.rice.krad.web.form.UifFormBase;
033 import org.springframework.web.servlet.ModelAndView;
034
035 import javax.servlet.http.HttpServletRequest;
036 import javax.servlet.http.HttpServletResponse;
037 import java.util.Map;
038
039 /**
040 * Provides helper methods that will be used during the request lifecycle
041 *
042 * <p>
043 * Created to avoid duplication of the methods used by the UifHandlerExceptionResolver
044 * </p>
045 *
046 * @author Kuali Rice Team (rice.collab@kuali.org)
047 */
048 public class UifWebUtils {
049 private static final Logger LOG = Logger.getLogger(UifWebUtils.class);
050
051 /**
052 * Configures the <code>ModelAndView</code> instance containing the form
053 * data and pointing to the UIF generic spring view
054 *
055 * @param form - Form instance containing the model data
056 * @param pageId - Id of the page within the view that should be rendered, can
057 * be left blank in which the current or default page is rendered
058 * @return ModelAndView object with the contained form
059 */
060 public static ModelAndView getUIFModelAndView(UifFormBase form, String pageId) {
061 if (StringUtils.isNotBlank(pageId)) {
062 form.setPageId(pageId);
063 }
064
065 // create the spring return object pointing to View.jsp
066 ModelAndView modelAndView = new ModelAndView();
067 modelAndView.addObject(UifConstants.DEFAULT_MODEL_NAME, form);
068 modelAndView.setViewName(UifConstants.SPRING_VIEW_ID);
069
070 return modelAndView;
071 }
072
073 public static ModelAndView getComponentModelAndView(Component component, Object model) {
074 ModelAndView modelAndView = new ModelAndView();
075 modelAndView.addObject(UifConstants.DEFAULT_MODEL_NAME, model);
076 modelAndView.addObject("Component", component);
077 modelAndView.setViewName("ComponentUpdate");
078
079 return modelAndView;
080 }
081
082 /**
083 * After the controller logic is executed, the form is placed into session
084 * and the corresponding view is prepared for rendering
085 */
086 public static void postControllerHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
087 ModelAndView modelAndView) throws Exception {
088 if (handler instanceof UifControllerBase && (modelAndView != null)) {
089 UifControllerBase controller = (UifControllerBase) handler;
090 UifFormBase form = null;
091
092 // check to see if this is a full view request
093 if (modelAndView.getViewName().equals(UifConstants.SPRING_VIEW_ID)) {
094 Object model = modelAndView.getModelMap().get(UifConstants.DEFAULT_MODEL_NAME);
095 if (model instanceof UifFormBase) {
096 form = (UifFormBase) model;
097
098 form.setPreviousView(null);
099
100 // persist document form to db
101 if (form instanceof DocumentFormBase) {
102 UserSession userSession = (UserSession) request.getSession().getAttribute(
103 KRADConstants.USER_SESSION_KEY);
104 getSessionDocumentService().setDocumentForm((DocumentFormBase) form, userSession,
105 request.getRemoteAddr());
106 }
107
108 // prepare view instance
109 prepareViewForRendering(request, form);
110
111 // update history for view
112 prepareHistory(request, form);
113 }
114 }
115 }
116 }
117
118 /**
119 * Updates the history object (or constructs a new History) for the view we are getting ready
120 * to render
121 *
122 * @param request - Http request object containing the request parameters
123 * @param form - object containing the view data
124 */
125 public static void prepareHistory(HttpServletRequest request, UifFormBase form) {
126 View view = form.getView();
127
128 // main history/breadcrumb tracking support
129 History history = form.getFormHistory();
130 if (history == null || request.getMethod().equals("GET")) {
131 history = new History();
132 history.setHomewardPath(view.getBreadcrumbs().getHomewardPathList());
133 history.setAppendHomewardPath(view.getBreadcrumbs().isDisplayHomewardPath());
134 history.setAppendPassedHistory(view.getBreadcrumbs().isDisplayPassedHistory());
135
136 // passed settings ALWAYS override the defaults
137 if (StringUtils.isNotBlank(request.getParameter(UifConstants.UrlParams.SHOW_HOME))) {
138 history.setAppendHomewardPath(Boolean.parseBoolean(request.getParameter(
139 UifConstants.UrlParams.SHOW_HOME)));
140 }
141
142 if (StringUtils.isNotBlank(request.getParameter(UifConstants.UrlParams.SHOW_HISTORY))) {
143 history.setAppendPassedHistory(Boolean.parseBoolean(request.getParameter(
144 UifConstants.UrlParams.SHOW_HISTORY)));
145 }
146
147 history.setCurrent(form, request);
148 history.buildHistoryFromParameterString(request.getParameter(UifConstants.UrlParams.HISTORY));
149 form.setFormHistory(history);
150 }
151 }
152
153 /**
154 * Prepares the <code>View</code> instance contained on the form for
155 * rendering
156 *
157 * @param request - request object
158 * @param form - form instance containing the data and view instance
159 */
160 public static void prepareViewForRendering(HttpServletRequest request, UifFormBase form) {
161 View view = form.getView();
162
163 // set view page to page requested on form
164 if (StringUtils.isNotBlank(form.getPageId())) {
165 view.setCurrentPageId(form.getPageId());
166 }
167
168 Map<String, String> parameterMap = KRADUtils.translateRequestParameterMap(request.getParameterMap());
169 parameterMap.putAll(form.getViewRequestParameters());
170
171 // build view which will prepare for rendering
172 getViewService().buildView(view, form, parameterMap);
173
174 // set dirty flag
175 form.setValidateDirty(view.isValidateDirty());
176 }
177
178 protected static SessionDocumentService getSessionDocumentService() {
179 return KRADServiceLocatorWeb.getSessionDocumentService();
180 }
181
182 protected static ViewService getViewService() {
183 return KRADServiceLocatorWeb.getViewService();
184 }
185 }