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.uif.view;
17  
18  import org.kuali.rice.krad.uif.UifConstants.ViewType;
19  import org.kuali.rice.krad.uif.component.Component;
20  import org.kuali.rice.krad.uif.lifecycle.ViewPostMetadata;
21  import org.kuali.rice.krad.uif.service.ViewHelperService;
22  
23  import javax.servlet.http.HttpServletRequest;
24  import java.io.Serializable;
25  import java.util.List;
26  import java.util.Map;
27  import java.util.Set;
28  
29  /**
30   * Interface that must be implemented for classes the provide the backing data (model) for a
31   * {@link org.kuali.rice.krad.uif.view.View}.
32   *
33   * <p>Since the View relies on helper properties from the model it is necessary the backing object implement the
34   * ViewModel interface. Note model objects can extend {@link org.kuali.rice.krad.web.form.UifFormBase} which implements
35   * the ViewModel interface.</p>
36   *
37   * @author Kuali Rice Team (rice.collab@kuali.org)
38   */
39  public interface ViewModel extends Serializable {
40  
41      /**
42       * Called before Spring binds the request to the form to allow for pre-processing before setting values.
43       *
44       * @param request - request object containing the query parameters
45       */
46      public void preBind(HttpServletRequest request);
47  
48      /**
49       * Called after Spring binds the request to the form and before the controller method is invoked
50       *
51       * @param request - request object containing the query parameters
52       */
53      public void postBind(HttpServletRequest request);
54  
55      /**
56       * Unique Id for the <code>View</code> instance. This is specified for a
57       * view in its definition by setting the 'id' property.
58       *
59       * @return String view id
60       */
61      public String getViewId();
62  
63      /**
64       * Setter for the unique view id
65       *
66       * @param viewId
67       */
68      public void setViewId(String viewId);
69  
70      /**
71       * Name for the <code>View</code> instance. This is specified for a view in
72       * its definition by setting the 'id' property. The name is not necessary
73       * unique and cannot be used by itself to retrieve a view. Typically it is
74       * used with other parameters to identify a view with a certain type (view
75       * type)
76       *
77       * @return String view name
78       */
79      public String getViewName();
80  
81      /**
82       * Setter for the view name
83       *
84       * @param viewName
85       */
86      public void setViewName(String viewName);
87  
88      /**
89       * Name for the type of view being requested. This can be used to find
90       * <code>View</code> instances by request parameters (not necessary the
91       * unique id)
92       *
93       * @return String view type name
94       */
95      public ViewType getViewTypeName();
96  
97      /**
98       * Setter for the view type name
99       *
100      * @param viewTypeName
101      */
102     public void setViewTypeName(ViewType viewTypeName);
103 
104     /**
105      * View instance associated with the model. Used to render the user interface
106      *
107      * @return View
108      */
109     public View getView();
110 
111     /**
112      * Setter for the view instance
113      *
114      * @param view
115      */
116     public void setView(View view);
117 
118     /**
119      * Returns the view helper service instance that was configured for the current view.
120      *
121      * @return instance of view helper service, null if view is null
122      */
123     public ViewHelperService getViewHelperService() throws IllegalAccessException, InstantiationException;
124 
125     /**
126      * Gets the {@link org.kuali.rice.krad.uif.lifecycle.ViewPostMetadata} that has been built up from processing
127      * of a view.
128      *
129      * <p>The view post metadata is used to read information about the view that was rendered when a post occurs. For
130      * example, you might need to check whether a particular flag was enabled for the rendered view when processing
131      * the post logic</p>
132      *
133      * @return ViewPostMetadata instance for the previously processed view
134      */
135     public ViewPostMetadata getViewPostMetadata();
136 
137     /**
138      * @see ViewModel#getViewPostMetadata()
139      */
140     public void setViewPostMetadata(ViewPostMetadata viewPostMetadata);
141 
142     /**
143      * Id for the current page being displayed within the view
144      *
145      * @return String page id
146      */
147     public String getPageId();
148 
149     /**
150      * Setter for the current page id
151      *
152      * @param pageId
153      */
154     public void setPageId(String pageId);
155 
156     /**
157      * URL the form generated for the view should post to
158      *
159      * @return String form post URL
160      */
161     public String getFormPostUrl();
162 
163     /**
164      * Setter for the form post URL
165      *
166      * @param formPostUrl
167      */
168     public void setFormPostUrl(String formPostUrl);
169 
170     /**
171      * Map of parameters that was used to configured the <code>View</code>.
172      * Maintained on the form to rebuild the view on posts and session timeout
173      *
174      * @return Map<String, String> view parameters
175      * @see org.kuali.rice.krad.uif.view.View.getViewRequestParameters()
176      */
177     public Map<String, String> getViewRequestParameters();
178 
179     /**
180      * Setter for the view's request parameter map
181      *
182      * @param viewRequestParameters map of request parameters
183      */
184     public void setViewRequestParameters(Map<String, String> viewRequestParameters);
185 
186     /**
187      * List of fields that should be read only on the view
188      *
189      * <p>
190      * If the view being rendered supports request setting of read-only fields, the readOnlyFields request parameter
191      * can be sent to mark fields as read only that might not have been otherwise
192      * </p>
193      *
194      * <p>
195      * Note the paths specified should be the simple property names (not the full binding path). Therefore if the
196      * property name appears multiple times in the view, all instances will be set as read only
197      * </p>
198      *
199      * @return List<String> read only property names
200      * @see View#isSupportsRequestOverrideOfReadOnlyFields()
201      */
202     public List<String> getReadOnlyFieldsList();
203 
204     /**
205      * Setter for the list of read only fields
206      *
207      * @param readOnlyFieldsList
208      */
209     public void setReadOnlyFieldsList(List<String> readOnlyFieldsList);
210 
211     /**
212      * Holds instances for collection add lines. The key of the Map gives the
213      * collection name the line instance applies to, the Map value is an
214      * instance of the collection object class that holds the new line data
215      *
216      * @return Map<String, Object> new collection lines
217      */
218     public Map<String, Object> getNewCollectionLines();
219 
220     /**
221      * Setter for the new collection lines Map
222      *
223      * @param newCollectionLines
224      */
225     public void setNewCollectionLines(Map<String, Object> newCollectionLines);
226 
227     /**
228      * Map of parameters sent for the invoked action
229      *
230      * <p>
231      * Many times besides just setting the method to call actions need to send
232      * additional parameters. For instance the method being called might do a
233      * redirect, in which case the action needs to send parameters for the
234      * redirect URL. An example of this is redirecting to a <code>Lookup</code>
235      * view. In some cases the parameters that need to be sent conflict with
236      * properties already on the form, and putting all the action parameters as
237      * form properties would grow massive (in addition to adds an additional
238      * step from the XML config). So this general map solves those issues.
239      * </p>
240      *
241      * @return Map<String, String> action parameters
242      */
243     public Map<String, String> getActionParameters();
244 
245     /**
246      * Setter for the action parameters map
247      *
248      * @param actionParameters
249      */
250     public void setActionParameters(Map<String, String> actionParameters);
251 
252     /**
253      * Map that is populated from the component state maintained on the client
254      *
255      * <p>
256      * Used when a request is made that refreshes part of the view. The current state for components (which
257      * have state that can be changed on the client), is populated into this map which is then used by the
258      * <code>ViewHelperService</code> to update the components so that the state is maintained when they render.
259      * </p>
260      *
261      * @return Map<String, Object> map where key is name of property or component id, and value is the property
262      *         value or another map of component key/value pairs
263      */
264     public Map<String, Object> getClientStateForSyncing();
265 
266     /**
267      * Holds Set of String identifiers for lines that were selected in a collection from a single page.
268      * selectedCollectionLines are request level values and get reset with every page request
269      *
270      * <p>
271      * When the select field is enabled for a <code>CollectionGroup</code>, the framework will be
272      * default bind the selected identifier strings to this property. The key of the map uniquely identifies the
273      * collection by the full binding path to the collection, and the value is a set of Strings for the checked
274      * lines.
275      * </p>
276      *
277      * @return Map<String, Set<String>> map of collections and their selected lines
278      * @see org.kuali.rice.krad.service.LegacyDataAdapter#getDataObjectIdentifierString(java.lang.Object)
279      */
280     public Map<String, Set<String>> getSelectedCollectionLines();
281 
282     /**
283      * Setter for the map that holds selected collection lines
284      *
285      * @param selectedCollectionLines
286      */
287     public void setSelectedCollectionLines(Map<String, Set<String>> selectedCollectionLines);
288 
289     /**
290      * Indicates whether default values should be applied.
291      *
292      * <p>
293      * Default field values of a view need to be applied after the view life cycle completes.  Otherwise,
294      * they risk getting over written.
295      * </p>
296      *
297      * @return boolean true if the request was an ajax call, false if not
298      */
299     boolean isApplyDefaultValues();
300 
301     /**
302      * Set whether default values should be applied to the view
303      *
304      * @param applyDefaultValues
305      */
306     void setApplyDefaultValues(boolean applyDefaultValues);
307 
308     /**
309      * Script that will run on render (view or component) for generating growl messages
310      *
311      * @return String JS growl script
312      */
313     public String getGrowlScript();
314 
315     /**
316      * Setter for the script that generates growls on render
317      *
318      * @param growlScript
319      */
320     public void setGrowlScript(String growlScript);
321 
322     /**
323      * Script that will run on render (view or component) for a lightbox
324      *
325      * @return String JS lightbox script
326      */
327     public String getLightboxScript();
328 
329     /**
330      * Setter for the script that generates a lightbox on render
331      *
332      * @param lightboxScript
333      */
334     public void setLightboxScript(String lightboxScript);
335 
336     /**
337      * Gets the state.  This is the default location for state on KRAD forms.
338      *
339      * @return the state
340      */
341     public String getState();
342 
343     /**
344      * Set the state
345      *
346      * @param state
347      */
348     public void setState(String state);
349 
350     /**
351      * Id for the component that should be updated for a component refresh process
352      *
353      * @return String component id
354      */
355     public String getUpdateComponentId();
356 
357     /**
358      * Setter for the component id that should be refreshed
359      *
360      * @param updateComponentId
361      */
362     public void setUpdateComponentId(String updateComponentId);
363 
364     /**
365      * Component instance that been built for a refresh/disclosure request.
366      *
367      * <p>This is generally set by org.kuali.rice.krad.uif.lifecycle.ViewLifecycle#performComponentLifecycle(org.kuali.rice.krad.uif.view.View,
368      * java.lang.Object, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse,
369      * org.kuali.rice.krad.uif.lifecycle.ViewPostMetadata, java.lang.String) after processing the lifecycle. The form
370      * property provides access to the rendering layer.</p>
371      *
372      * @return component instance for updating
373      */
374     public Component getUpdateComponent();
375 
376     /**
377      * @see ViewModel#getUpdateComponent()
378      */
379     public void setUpdateComponent(Component updateComponent);
380 
381     /**
382      * Indicates whether the request was made by an ajax call
383      *
384      * <p>
385      * Depending on whether the request was made via ajax (versus standard browser submit) the response
386      * will be handled different. For example with an ajax request we can send back partial page updates, which
387      * cannot be done with standard submits
388      * </p>
389      *
390      * <p>
391      * If this indicator is true, {@link #getAjaxReturnType()} will be used to determine how to handling
392      * the ajax return
393      * </p>
394      *
395      * @return boolean true if the request was an ajax call, false if not
396      */
397     boolean isAjaxRequest();
398 
399     /**
400      * Set the ajaxRequest
401      *
402      * @param ajaxRequest
403      */
404     void setAjaxRequest(boolean ajaxRequest);
405 
406     /**
407      * Gets the return type for the ajax call
408      *
409      * <p>
410      * The ajax return type indicates how the response content will be handled in the client. Typical
411      * examples include updating a component, the page, or doing a redirect.
412      * </p>
413      *
414      * @return String return type
415      * @see org.kuali.rice.krad.uif.UifConstants.AjaxReturnTypes
416      */
417     String getAjaxReturnType();
418 
419     /**
420      * Setter for the type of ajax return
421      *
422      * @param ajaxReturnType
423      */
424     void setAjaxReturnType(String ajaxReturnType);
425 
426     /**
427      * Indicates whether the request is to update a component (only applicable for ajax requests)
428      *
429      * @return boolean true if the request is for update component, false if not
430      */
431     boolean isUpdateComponentRequest();
432 
433     /**
434      * Indicates whether the request is to update a page (only applicable for ajax requests)
435      *
436      * @return boolean true if the request is for update page, false if not
437      */
438     boolean isUpdatePageRequest();
439 
440     /**
441      * Indicates whether the request is to update a dialog (only applicable for ajax requests)
442      *
443      * @return boolean true if the request is for update dialog, false if not
444      */
445     boolean isUpdateDialogRequest();
446 
447     /**
448      * Indicates whether the request is for a non-update of the view (only applicable for ajax requests)
449      *
450      * <p>
451      * Examples of requests that do not update the view are ajax queries or requests that download a file
452      * </p>
453      *
454      * @return boolean true if the request is for non-update, false if not
455      */
456     boolean isUpdateNoneRequest();
457 
458     /**
459      * Indicates whether the request should return a JSON string
460      *
461      * <p>
462      * When this indicator is true, the rendering process will invoke the template
463      * given by {@link #getRequestJsonTemplate()} which should return a JSON string
464      * </p>
465      *
466      * <p>
467      * For JSON requests the view is not built, however a component can be retrieved and
468      * exported in the request by setting {@link #getUpdateComponentId()}
469      * </p>
470      *
471      * @return boolean true if request is for JSON, false if not
472      */
473     boolean isJsonRequest();
474 
475     /**
476      * Template the will be invoked to return a JSON string
477      *
478      * <p>
479      * Certain templates can be rendered to build JSON for a JSON request. The template
480      * set here (by a controller) will be rendered
481      * </p>
482      *
483      * @return path to template
484      */
485     String getRequestJsonTemplate();
486 
487     /**
488      * Setter for the template to render for the request
489      *
490      * @param requestJsonTemplate
491      */
492     void setRequestJsonTemplate(String requestJsonTemplate);
493 
494     /**
495      * Indicates whether the request is for paging a collection (or sorting).
496      *
497      * @return boolean true if a paging request is present, false if not
498      */
499     boolean isCollectionPagingRequest();
500 
501     /**
502      * @see ViewModel#isCollectionPagingRequest()
503      */
504     void setCollectionPagingRequest(boolean collectionPagingRequest);
505 
506     /**
507      * A generic map for framework pieces (such as component modifiers) that need to dynamically store
508      * data to the form
509      *
510      * @return Map<String, Object>
511      */
512     public Map<String, Object> getExtensionData();
513 
514     /**
515      * Setter for the generic extension data map
516      *
517      * @param extensionData
518      */
519     public void setExtensionData(Map<String, Object> extensionData);
520 }