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.service;
17
18 import java.util.Map;
19
20 import org.kuali.rice.krad.uif.component.Component;
21 import org.kuali.rice.krad.uif.container.CollectionGroup;
22 import org.kuali.rice.krad.uif.container.Container;
23 import org.kuali.rice.krad.uif.field.DataField;
24 import org.kuali.rice.krad.uif.util.ComponentFactory;
25 import org.kuali.rice.krad.uif.util.LifecycleElement;
26 import org.kuali.rice.krad.uif.view.ExpressionEvaluatorFactory;
27 import org.kuali.rice.krad.uif.view.ViewModel;
28 import org.kuali.rice.krad.uif.widget.Inquiry;
29 import org.kuali.rice.krad.web.service.impl.CollectionControllerServiceImpl.CollectionActionParameters;
30
31 /**
32 * Provides customization methods at various points of the view lifecycle.
33 *
34 * <p>Custom view helpers can be configured with view property
35 * {@link org.kuali.rice.krad.uif.view.View#getViewHelperServiceClass()}</p>
36 *
37 * @author Kuali Rice Team (rice.collab@kuali.org)
38 */
39 public interface ViewHelperService {
40
41 /**
42 * Uses reflection to find all fields defined on the <code>View</code> instance that have the
43 * <code>RequestParameter</code> annotation (which indicates the field may be populated by the
44 * request).
45 *
46 * <p>
47 * The <code>View</code> instance is inspected for fields that have the
48 * <code>RequestParameter</code> annotation and if corresponding parameters are found in the
49 * request parameter map, the request value is used to set the view property. The Map of
50 * parameter name/values that match are placed in the view so they can be later retrieved to
51 * rebuild the view. Custom <code>ViewServiceHelper</code> implementations can add additional
52 * parameter key/value pairs to the returned map if necessary.
53 * </p>
54 *
55 * <p>
56 * For each field found, if there is a corresponding key/value pair in the request parameters,
57 * the value is used to populate the field. In addition, any conditional properties of
58 * <code>PropertyReplacers</code> configured for the field are cleared so that the request
59 * parameter value does not get overridden by the dictionary conditional logic
60 * </p>
61 *
62 * @param parameters The request parameters that apply to the view.
63 * @see org.kuali.rice.krad.uif.component.RequestParameter
64 */
65 void populateViewFromRequestParameters(Map<String, String> parameters);
66
67 /**
68 * Hook for service overrides to perform custom initialization prior to view initialization.
69 *
70 * @param model The model.
71 */
72 void performCustomViewInitialization(Object model);
73
74 /**
75 * Hook for service overrides to perform custom initialization on the component
76 *
77 * @param component component instance to initialize
78 */
79 void performCustomInitialization(LifecycleElement component);
80
81 /**
82 * Hook for service overrides to perform custom apply model logic on the component
83 *
84 * @param component component instance to apply model to
85 * @param model Top level object containing the data (could be the model or a top level business
86 * object, dto)
87 */
88 void performCustomApplyModel(LifecycleElement component, Object model);
89
90 /**
91 * Hook for service overrides to perform custom component finalization
92 *
93 * @param component component instance to update
94 * @param model Top level object containing the data
95 * @param parent Parent component for the component being finalized
96 */
97 void performCustomFinalize(LifecycleElement component, Object model, LifecycleElement parent);
98
99 /**
100 * Hook for service overrides to perform view component finalization
101 *
102 * @param model Top level object containing the data
103 */
104 void performCustomViewFinalize(Object model);
105
106 /**
107 * Hook for service overrides to process the new collection line before it is added to the
108 * collection
109 *
110 * @param model object instance that contain's the view's data
111 * @param addLine the new line instance to be processed
112 * @param collectionId the id of the collection being added to
113 * @param collectionPath the path to the collection being modified
114 */
115 void processBeforeAddLine(ViewModel model, Object addLine, String collectionId, String collectionPath);
116
117 /**
118 * Hook for service overrides to process the new collection line after it has been added to the
119 * collection
120 *
121 * @param model object instance that contain's the views data
122 * @param addLine the new line that was added
123 * @param collectionId the id of the collection being added to
124 * @param collectionPath the path to the collection being modified
125 * @param isValidLine indicates if the line is valid
126 */
127 void processAfterAddLine(ViewModel model, Object addLine, String collectionId, String collectionPath,
128 boolean isValidLine);
129
130 /**
131 * Hook for service overrides to process the edit collection line before it is validated
132 *
133 * @param model object instance that contain's the views data
134 * @param lineObject the line instance to be processed
135 * @param collectionId the id of the collection being edited from
136 * @param collectionPath the path to the collection being modified
137 */
138 void processBeforeEditLine(ViewModel model, Object lineObject, String collectionId, String collectionPath);
139
140 /**
141 * Hook for service overrides to process the edit collection line after it has been validated
142 *
143 * @param model object instance that contains the views data
144 * @param lineObject the line instance to be processed
145 * @param collectionId the id of the collection being edited from
146 * @param collectionPath the path to the collection being modified
147 */
148 void processAfterEditLine(ViewModel model, Object lineObject, String collectionId, String collectionPath);
149
150 /**
151 * Hook for service overrides to process the save collection line before it is validated
152 *
153 * @param model object instance that contain's the views data
154 * @param lineObject the line instance to be processed
155 * @param collectionId the id of the collection being added to
156 * @param collectionPath the path to the collection being modified
157 */
158 void processBeforeSaveLine(ViewModel model, Object lineObject, String collectionId, String collectionPath);
159
160 /**
161 * Hook for service overrides to process the save collection line after it has been validated
162 *
163 * @param model object instance that contains the views data
164 * @param lineObject the line instance to be processed
165 * @param collectionId the id of the collection being added to
166 * @param collectionPath the path to the collection being modified
167 */
168 void processAfterSaveLine(ViewModel model, Object lineObject, String collectionId, String collectionPath);
169
170 /**
171 * Hook for service overrides to process the collection line after it has been deleted
172 *
173 * @param model object instance that contains the views data
174 * @param collectionId the id of the collection being added to
175 * @param collectionPath the path to the collection being modified
176 * @param lineIndex index of the line that was deleted
177 */
178 void processAfterDeleteLine(ViewModel model, String collectionId, String collectionPath, int lineIndex);
179
180 /**
181 * Hook for creating new components with code and adding them to a container
182 *
183 * <p>
184 * Subclasses can override this method to check for one or more containers by id and then adding
185 * components created in code. This is invoked before the initialize method on the container
186 * component, so the full lifecycle will be run on the components returned.
187 * </p>
188 *
189 * <p>
190 * New components instances can be retrieved using {@link ComponentFactory}
191 * </p>
192 *
193 * @param model object containing the view data
194 * @param container container instance to add components to
195 */
196 void addCustomContainerComponents(ViewModel model, Container container);
197
198 /**
199 * Invoked when the add line action is chosen for a collection. The
200 * collection path gives the full path to the collection that action was
201 * selected for. Here validation can be performed on the line as well as
202 * further processing on the line such as defaults. If the action is valid
203 * the line should be added to the collection, otherwise errors should be
204 * added to the global <code>MessageMap</code>
205 *
206 * @param model Top level object containing the view data including the
207 * collection and new line
208 * @param collectionId the id of the collection being added to
209 * @param collectionPath the path to the collection being modified
210 */
211 void processCollectionAddLine(ViewModel model, String collectionId, String collectionPath);
212
213 void processAndAddLineObject(ViewModel viewModel, Object newLine, String collectionId,
214 String collectionPath);
215
216 /**
217 * Adds a blank line to the collection
218 *
219 * <p>
220 * Adds a new collection item to the collection and applies any default values.
221 * </p>
222 *
223 * @param model Top level object containing the view data including the collection and new line
224 * @param collectionId the id of the collection being added to
225 * @param collectionPath the path to the collection being modified
226 */
227 void processCollectionAddBlankLine(ViewModel model, String collectionId, String collectionPath);
228
229 /**
230 * Invoked when the retrieve edit line dialog action is chosen for a collection. This method only does server side
231 * validation by default but creates hook for client applications to add additional logic like persisting data.
232 *
233 * @param model Top level object containing the view data including the collection and new line
234 * @param collectionId the id of the collection being added to
235 * @param collectionPath the path to the collection being modified
236 * @param selectedLineIndex The index within the collection of the line to edit.
237 */
238 void processCollectionRetrieveEditLineDialog(ViewModel model, String collectionId,
239 String collectionPath, int selectedLineIndex);
240
241 /**
242 * Invoked when the edit line action is chosen for a collection. This method only does server side validation by
243 * default but creates hook for client applications to add additional logic like persisting data.
244 *
245 * @param model Top level object containing the view data including the collection and new line
246 * @param parameters the parameters for edit line request
247 */
248 void processCollectionEditLine(ViewModel model, CollectionActionParameters parameters);
249
250 /**
251 * Invoked when the close edit line dialog action is chosen for a collection.
252 *
253 * @param model Top level object containing the view data including the collection and new line
254 * @param collectionId the id of the collection being added to
255 * @param collectionPath the path to the collection being modified
256 * @param selectedLineIndex The index within the collection of the line to edit.
257 */
258 void processCollectionCloseEditLineDialog(ViewModel model, String collectionId,
259 String collectionPath, int selectedLineIndex);
260
261 /**
262 * Invoked when the save line action is chosen for a collection. This method only does server side validation by
263 * default but creates hook for client applications to add additional logic like persisting data.
264 *
265 * @param model Top level object containing the view data including the collection and new line
266 * @param parameters the parameters for save line request
267 */
268 void processCollectionSaveLine(ViewModel model, CollectionActionParameters parameters);
269
270 /**
271 * Invoked when the delete line action is chosen for a collection. The
272 * collection path gives the full path to the collection that action was
273 * selected for. Here validation can be performed to make sure the action is
274 * allowed. If the action is valid the line should be deleted from the
275 * collection, otherwise errors should be added to the global
276 * <code>MessageMap</code>
277 *
278 * @param model Top level object containing the view data including the collection
279 * @param collectionId the id of the collection being added to
280 * @param collectionPath the path to the collection being modified
281 * @param lineIndex index of the collection line that was selected for removal
282 */
283 void processCollectionDeleteLine(ViewModel model, String collectionId, String collectionPath, int lineIndex);
284
285 /**
286 * Process the results returned from a multi-value lookup populating the lines for the collection given
287 * by the path
288 *
289 * @param model object containing the view data
290 * @param collectionId the id of the collection being added to
291 * @param collectionPath the path to the collection being modified
292 * @param multiValueReturnFields String containing the selected line field names
293 * @param lookupResultValues String containing the selected line values
294 */
295 void processMultipleValueLookupResults(ViewModel model, String collectionId, String collectionPath,
296 String multiValueReturnFields, String lookupResultValues);
297
298 /**
299 * Invoked by the <code>Inquiry</code> widget to build the inquiry link
300 *
301 * <p>
302 * Note this is used primarily for custom <code>Inquirable</code>
303 * implementations to customize the inquiry class or parameters for an
304 * inquiry. Instead of building the full inquiry link, implementations can
305 * make a callback to
306 * org.kuali.rice.krad.uif.widget.Inquiry.buildInquiryLink(Object, String,
307 * Class<?>, Map<String, String>) given an inquiry class and parameters to
308 * build the link field.
309 * </p>
310 *
311 * @param dataObject parent object for the inquiry property
312 * @param propertyName name of the property the inquiry is being built for
313 * @param inquiry instance of the inquiry widget being built for the property
314 */
315 void buildInquiryLink(Object dataObject, String propertyName, Inquiry inquiry);
316
317 /**
318 * Sets up the view context which will be available to other components through their context
319 * for conditional logic evaluation.
320 */
321 void setViewContext();
322
323 /**
324 * Invoked to set up the context for an element.
325 *
326 * <p>Context is primarily used for expression evaluation. Any object in the context for a component
327 * will be available as a variable within expressions.</p>
328 *
329 * @param element element to setup context for
330 * @param parent parent of the given element
331 */
332 void setElementContext(LifecycleElement element, LifecycleElement parent);
333
334 /**
335 * Invokes the configured <code>PresentationController</code> and </code>Authorizer</code> for
336 * the view to get the exported action flags and edit modes that can be used in conditional
337 * logic
338 */
339 void retrieveEditModesAndActionFlags();
340
341 /**
342 * Perform a database or data dictionary based refresh of a specific property object
343 *
344 * <p>
345 * The object needs to be of type PersistableBusinessObject.
346 * </p>
347 *
348 * @param parentObject parent object that references the object to be refreshed
349 * @param referenceObjectName property name of the parent object to be refreshed
350 */
351 void refreshReference(Object parentObject, String referenceObjectName);
352
353 /**
354 * Update the reference objects listed in referencesToRefresh of the model
355 *
356 * <p>
357 * The the individual references in the referencesToRefresh string are separated by
358 * KRADConstants.REFERENCES_TO_REFRESH_SEPARATOR).
359 * </p>
360 *
361 * @param referencesToRefresh list of references to refresh (
362 */
363 void refreshReferences(String referencesToRefresh);
364
365 /**
366 * Retrieves the default value that is configured for the given data field
367 *
368 * <p>
369 * The field's default value is determined in the following order:
370 *
371 * <ol>
372 * <li>If default value on field is non-blank</li>
373 * <li>If expression is found for default value</li>
374 * <li>If default value finder class is configured for field</li>
375 * <li>If an expression is found for default values</li>
376 * <li>If default values on field is not null</li>
377 * </ol>
378 * </p>
379 *
380 * @param object object that should be populated
381 * @param dataField field to retrieve default value for
382 * @return Object default value for field or null if value was not found
383 */
384 Object getDefaultValueForField(Object object, DataField dataField);
385
386 /**
387 * Applies the default value configured for the given field (if any) to the line given object
388 * property that is determined by the given binding path
389 *
390 * @param object object that should be populated
391 * @param dataField field to check for configured default value
392 * @param bindingPath path to the property on the object that should be populated
393 */
394 void populateDefaultValueForField(Object object, DataField dataField, String bindingPath);
395
396 /**
397 * Builds JS script that will invoke the show growl method to display a growl message when the
398 * page is rendered
399 *
400 * <p>
401 * A growl call will be created for any explicit growl messages added to the message map.
402 * </p>
403 *
404 * <p>
405 * Growls are only generated if @{link
406 * org.kuali.rice.krad.uif.view.View#isGrowlMessagingEnabled()} is enabled. If not, the growl
407 * messages are set as info messages for the page
408 * </p>
409 *
410 * @return JS script string for generated growl messages
411 */
412 String buildGrowlScript();
413
414 /**
415 * Iterates through the view components picking up data fields and applying an default value
416 * configured
417 *
418 * @param component component that should be checked for default values
419 */
420 void applyDefaultValues(Component component);
421
422 /**
423 * Populate default values the model backing a line in a collection group.
424 *
425 * @param collectionGroup The collection group.
426 * @param line The model object backing the line.
427 */
428 void applyDefaultValuesForCollectionLine(CollectionGroup collectionGroup, Object line);
429
430 /**
431 * Gets an expression evaluator factory for use with the current view.
432 *
433 * @return expression evaluator factory
434 */
435 ExpressionEvaluatorFactory getExpressionEvaluatorFactory();
436
437 }