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