View Javadoc
1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.krad.web.controller;
17  
18  import java.util.Map;
19  
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  
23  import org.apache.commons.lang.StringUtils;
24  import org.apache.log4j.Logger;
25  import org.kuali.rice.core.api.CoreApiServiceLocator;
26  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
27  import org.kuali.rice.krad.uif.UifConstants;
28  import org.kuali.rice.krad.uif.UifParameters;
29  import org.kuali.rice.krad.uif.component.Component;
30  import org.kuali.rice.krad.uif.lifecycle.ViewLifecycle;
31  import org.kuali.rice.krad.uif.lifecycle.ViewPostMetadata;
32  import org.kuali.rice.krad.uif.service.ViewService;
33  import org.kuali.rice.krad.uif.util.UifRenderHelperMethods;
34  import org.kuali.rice.krad.uif.view.View;
35  import org.kuali.rice.krad.util.KRADConstants;
36  import org.kuali.rice.krad.util.KRADUtils;
37  import org.kuali.rice.krad.web.form.UifFormBase;
38  import org.springframework.web.servlet.ModelAndView;
39  
40  /**
41   * Provides helper methods that will be used during the request lifecycle.
42   *
43   * <p>Created to avoid duplication of the methods used by the UifHandlerExceptionResolver</p>
44   *
45   * @author Kuali Rice Team (rice.collab@kuali.org)
46   */
47  public class UifControllerHelper {
48      private static final Logger LOG = Logger.getLogger(UifControllerHelper.class);
49  
50      private UifControllerHelper() {}
51  
52      /**
53       * Attempts to resolve a view id from the given request
54       *
55       * <p>
56       * First an attempt will be made to find the view id as a request parameter. If no such request parameter
57       * is found, the request will be looked at for view type information and a call will be made to the
58       * view service to find the view id by type
59       * </p>
60       *
61       * <p>
62       * If a view id is found it is stuck in the request as an attribute (under the key
63       * {@link org.kuali.rice.krad.uif.UifParameters#VIEW_ID}) for subsequent retrieval
64       * </p>
65       *
66       * @param request instance to resolve view id for
67       * @return view id if one is found, null if not found
68       */
69      public static String getViewIdFromRequest(HttpServletRequest request) {
70          String viewId = request.getParameter(UifParameters.VIEW_ID);
71  
72          if (StringUtils.isBlank(viewId)) {
73              String viewTypeName = request.getParameter(UifParameters.VIEW_TYPE_NAME);
74  
75              UifConstants.ViewType viewType = null;
76              if (StringUtils.isNotBlank(viewTypeName)) {
77                  viewType = UifConstants.ViewType.valueOf(viewTypeName);
78              }
79  
80              if (viewType != null) {
81                  @SuppressWarnings("unchecked") Map<String, String> parameterMap =
82                          KRADUtils.translateRequestParameterMap(request.getParameterMap());
83                  viewId = getViewService().getViewIdForViewType(viewType, parameterMap);
84              }
85          }
86  
87          if (StringUtils.isNotBlank(viewId)) {
88              request.setAttribute(UifParameters.VIEW_ID, viewId);
89          }
90  
91          return viewId;
92      }
93  
94      /**
95       * Configures the <code>ModelAndView</code> instance containing the form
96       * data and pointing to the UIF generic spring view
97       *
98       * @param form - Form instance containing the model data
99       * @param pageId - Id of the page within the view that should be rendered, can
100      * be left blank in which the current or default page is rendered
101      * @return ModelAndView object with the contained form
102      */
103     public static ModelAndView getUIFModelAndView(UifFormBase form, String pageId) {
104         if (StringUtils.isNotBlank(pageId)) {
105             form.setPageId(pageId);
106         }
107 
108         // create the spring return object pointing to View.jsp
109         ModelAndView modelAndView = new ModelAndView();
110         modelAndView.addObject(UifConstants.DEFAULT_MODEL_NAME, form);
111         modelAndView.setViewName(UifConstants.SPRING_VIEW_ID);
112 
113         return modelAndView;
114     }
115 
116     /**
117      * After the controller logic is executed, the form is placed into session
118      * and the corresponding view is prepared for rendering
119      *
120      * @param request servlet request
121      * @param response servlet response
122      * @param handler handler instance
123      * @param modelAndView model and view
124      * @throws Exception
125      */
126     public static void postControllerHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
127             ModelAndView modelAndView) throws Exception {
128         if (modelAndView == null) {
129             return;
130         }
131 
132         Object model = modelAndView.getModelMap().get(UifConstants.DEFAULT_MODEL_NAME);
133         if (!(model instanceof UifFormBase)) {
134             return;
135         }
136 
137         UifFormBase form = (UifFormBase) model;
138 
139         if (!form.isRequestRedirected()) {
140             prepareViewForRendering(request, response, form);
141         }
142 
143         // expose additional objects to the templates
144         modelAndView.addObject(UifParameters.REQUEST, request);
145         modelAndView.addObject(KRADConstants.USER_SESSION_KEY, request.getSession().getAttribute(
146                 KRADConstants.USER_SESSION_KEY));
147 
148         Map<String, String> properties = CoreApiServiceLocator.getKualiConfigurationService().getAllProperties();
149         modelAndView.addObject(UifParameters.CONFIG_PROPERTIES, properties);
150 
151         modelAndView.addObject(UifParameters.RENDER_HELPER_METHODS, new UifRenderHelperMethods());
152     }
153 
154     /**
155      * Prepares the {@link org.kuali.rice.krad.uif.view.View} instance contained on the form for rendering.
156      *
157      * @param request servlet request
158      * @param response servlet response
159      * @param form form instance containing the data and view instance
160      */
161     public static void prepareViewForRendering(HttpServletRequest request, HttpServletResponse response,
162             UifFormBase form) {
163         // for component refreshes only lifecycle for component is performed
164         if (form.isUpdateComponentRequest() || form.isUpdateDialogRequest() || (form.isJsonRequest() && StringUtils
165                 .isNotBlank(form.getUpdateComponentId()))) {
166             String refreshComponentId = form.getUpdateComponentId();
167 
168             Component updateComponent = ViewLifecycle.performComponentLifecycle(form.getView(), form, request, response,
169                     form.getViewPostMetadata(), refreshComponentId);
170             form.setUpdateComponent(updateComponent);
171         } else {
172             // full view build
173             View view = form.getView();
174             if (view != null) {
175                 Map<String, String> parameterMap = KRADUtils.translateRequestParameterMap(request.getParameterMap());
176                 parameterMap.putAll(form.getViewRequestParameters());
177 
178                 // build view which will prepare for rendering
179                 ViewPostMetadata postMetadata = ViewLifecycle.buildView(view, form, request, response, parameterMap);
180                 form.setViewPostMetadata(postMetadata);
181 
182                 if (form.isUpdatePageRequest()) {
183                     Component updateComponent = form.getView().getCurrentPage();
184                     form.setUpdateComponent(updateComponent);
185                 }
186 
187                 // update the page on the form to reflect the current page of the view
188                 form.setPageId(view.getCurrentPageId());
189             } else {
190                 LOG.warn("View in form was null: " + form);
191             }
192         }
193     }
194 
195     protected static ViewService getViewService() {
196         return KRADServiceLocatorWeb.getViewService();
197     }
198 
199 }