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 org.kuali.rice.krad.uif.container.CollectionGroup; 19 import org.kuali.rice.krad.uif.view.ExpressionEvaluator; 20 import org.kuali.rice.krad.uif.view.View; 21 import org.kuali.rice.krad.uif.component.Component; 22 import org.kuali.rice.krad.uif.widget.Inquiry; 23 24 import java.util.Map; 25 26 /** 27 * Provides methods for implementing the various phases of a <code>View</code> 28 * 29 * <ul> 30 * <li>Initialize Phase: Invoked when the view is first requested to setup 31 * necessary state</li> 32 * </ul> 33 * 34 * @author Kuali Rice Team (rice.collab@kuali.org) 35 */ 36 public interface ViewHelperService { 37 38 /** 39 * Populates the <code>View</code> properties from the given request 40 * parameters 41 * 42 * <p> 43 * The <code>View</code> instance is inspected for fields that have the 44 * <code>RequestParameter</code> annotation and if corresponding parameters 45 * are found in the request parameter map, the request value is used to set 46 * the view property. The Map of parameter name/values that match are placed 47 * in the view so they can be later retrieved to rebuild the view. Custom 48 * <code>ViewServiceHelper</code> implementations can add additional 49 * parameter key/value pairs to the returned map if necessary. 50 * </p> 51 * 52 * @see org.kuali.rice.krad.uif.component.RequestParameter 53 */ 54 public void populateViewFromRequestParameters(View view, Map<String, String> parameters); 55 56 /** 57 * Performs the Initialization phase for the <code>View</code>. During this 58 * phase each component of the tree is invoked to setup state based on the 59 * configuration and request options. 60 * 61 * <p> 62 * The initialize phase is only called once per <code>View</code> lifecycle 63 * </p> 64 * 65 * <p> 66 * Note the <code>View</code> instance also contains the context Map that 67 * was created based on the parameters sent to the view service 68 * </p> 69 * 70 * @param view View instance that should be initialized 71 * @param model object instance containing the view data 72 */ 73 public void performInitialization(View view, Object model); 74 75 /** 76 * Performs the Initialization phase for the given <code>Component</code> 77 * 78 * <p> 79 * Can be called for component instances constructed via code or prototypes 80 * to initialize the constructed component 81 * </p> 82 * 83 * @param view view instance the component belongs to 84 * @param model object instance containing the view data 85 * @param component component instance that should be initialized 86 */ 87 public void performComponentInitialization(View view, Object model, Component component); 88 89 /** 90 * Executes the ApplyModel phase. During this phase each component of the 91 * tree if invoked to setup any state based on the given model data 92 * 93 * <p> 94 * Part of the view lifecycle that applies the model data to the view. 95 * Should be called after the model has been populated before the view is 96 * rendered. The main things that occur during this phase are: 97 * <ul> 98 * <li>Generation of dynamic fields (such as collection rows)</li> 99 * <li>Execution of conditional logic (hidden, read-only, required settings 100 * based on model values)</li> 101 * </ul> 102 * </p> 103 * 104 * <p> 105 * The update phase can be called multiple times for the view's lifecycle 106 * (typically only once per request) 107 * </p> 108 * 109 * @param view View instance that the model should be applied to 110 * @param model Top level object containing the data (could be the form or a 111 * top level business object, dto) 112 */ 113 public void performApplyModel(View view, Object model); 114 115 /** 116 * Gets global objects for the context map and pushes them to the context 117 * for the component 118 * 119 * @param view view instance for component 120 * @param component component instance to push context to 121 */ 122 public Map<String, Object> getCommonContext(View view, Component component); 123 124 /** 125 * The last phase before the view is rendered. Here final preparations can 126 * be made based on the updated view state 127 * 128 * <p> 129 * The finalize phase runs after the apply model phase and can be called 130 * multiple times for the view's lifecylce (however typically only once per 131 * request) 132 * </p> 133 * 134 * @param view view instance that should be finalized for rendering 135 * @param model top level object containing the data 136 */ 137 public void performFinalize(View view, Object model); 138 139 /** 140 * Invoked after the view has been rendered to clear out objects that are not necessary to keep around for 141 * the post, this helps reduce the view size and overall cost to store the form in session 142 * 143 * @param view view instance to be cleaned 144 */ 145 public void cleanViewAfterRender(View view); 146 147 /** 148 * Performs the complete component lifecycle on the component passed in for use during a refresh process 149 * 150 * <p> 151 * Runs the three lifecycle phases on the component passed in. Some adjustments are made to account for the 152 * component being processed without its parent. The component within the view (contained on the form) is 153 * retrieved to obtain the context to use (such as parent). The created components id is then updated to match 154 * the current id within the view. 155 * </p> 156 * 157 * @param view view instance the component belongs to 158 * @param model object containing the full view data 159 * @param component component instance to perform lifecycle for 160 * @param origId id of the component within the view, used to pull the current component from the view 161 */ 162 public void performComponentLifecycle(View view, Object model, Component component, String origId); 163 164 /** 165 * Runs the lifecycle process for the given component starting at the given start phase and ending with 166 * the given end phase 167 * 168 * <p> 169 * Start or end phase can be null to indicate the first phase or last phase respectively 170 * </p> 171 * 172 * @param view view instance the component belongs to 173 * @param model object providing the view data 174 * @param component component to run the lifecycle phases for 175 * @param parent parent component for the component being processed 176 * @param startPhase lifecycle phase to start with, or null to indicate the first phase 177 * @param endPhase lifecycle phase to end with, or null to indicate the last phase 178 */ 179 public void spawnSubLifecyle(View view, Object model, Component component, Component parent, String startPhase, 180 String endPhase); 181 182 /** 183 * Update the reference objects listed in referencesToRefresh of the model 184 * 185 * <p> 186 * The the individual references in the referencesToRefresh string are separated by 187 * KRADConstants.REFERENCES_TO_REFRESH_SEPARATOR). 188 * </p> 189 * 190 * @param model top level object containing the data 191 * @param referencesToRefresh list of references to refresh ( 192 */ 193 public void refreshReferences(Object model, String referencesToRefresh); 194 195 /** 196 * Invoked when the add line action is chosen for a collection. The 197 * collection path gives the full path to the collection that action was 198 * selected for. Here validation can be performed on the line as well as 199 * further processing on the line such as defaults. If the action is valid 200 * the line should be added to the collection, otherwise errors should be 201 * added to the global <code>MessageMap</code> 202 * 203 * @param view view instance that is being presented (the action was taken on) 204 * @param model Top level object containing the view data including the 205 * collection and new line 206 * @param collectionPath full path to the collection on the model 207 */ 208 public void processCollectionAddLine(View view, Object model, String collectionPath); 209 210 /** 211 * Adds a blank line to the collection 212 * 213 * <p> 214 * Adds a new collection item to the collection and applies any default values. 215 * </p> 216 * 217 * @param view view instance that is being presented (the action was taken on) 218 * @param model Top level object containing the view data including the collection and new line 219 * @param collectionPath full path to the collection on the model 220 */ 221 public void processCollectionAddBlankLine(View view, Object model, String collectionPath); 222 223 /** 224 * Invoked when the save line action is chosen for a collection. This method only does server side validation by 225 * default but creates hook for client applications to add additional logic like persisting data. 226 * 227 * @param view view instance that is being presented (the action was taken on) 228 * @param model Top level object containing the view data including the collection and new line 229 * @param collectionPath full path to the collection on the model 230 */ 231 public void processCollectionSaveLine(View view, Object model, String collectionPath, int selectedLineIndex); 232 233 /** 234 * Invoked when the delete line action is chosen for a collection. The 235 * collection path gives the full path to the collection that action was 236 * selected for. Here validation can be performed to make sure the action is 237 * allowed. If the action is valid the line should be deleted from the 238 * collection, otherwise errors should be added to the global 239 * <code>MessageMap</code> 240 * 241 * @param view view instance that is being presented (the action was taken on) 242 * @param model Top level object containing the view data including the collection 243 * @param collectionPath full path to the collection on the model 244 * @param lineIndex index of the collection line that was selected for removal 245 */ 246 public void processCollectionDeleteLine(View view, Object model, String collectionPath, int lineIndex); 247 248 /** 249 * Process the results returned from a multi-value lookup populating the lines for the collection given 250 * by the path 251 * 252 * @param view view instance the collection belongs to 253 * @param model object containing the view data 254 * @param collectionPath binding path to the collection to populated 255 * @param lookupResultValues String containing the selected line values 256 */ 257 public void processMultipleValueLookupResults(View view, Object model, String collectionPath, String lookupResultValues); 258 259 /** 260 * Invoked by the <code>Inquiry</code> widget to build the inquiry link 261 * 262 * <p> 263 * Note this is used primarily for custom <code>Inquirable</code> 264 * implementations to customize the inquiry class or parameters for an 265 * inquiry. Instead of building the full inquiry link, implementations can 266 * make a callback to 267 * org.kuali.rice.krad.uif.widget.Inquiry.buildInquiryLink(Object, String, 268 * Class<?>, Map<String, String>) given an inquiry class and parameters to 269 * build the link field. 270 * </p> 271 * 272 * @param dataObject parent object for the inquiry property 273 * @param propertyName name of the property the inquiry is being built for 274 * @param inquiry instance of the inquiry widget being built for the property 275 */ 276 public void buildInquiryLink(Object dataObject, String propertyName, Inquiry inquiry); 277 278 /** 279 * Applies configured default values for the line fields to the line 280 * instance 281 * 282 * @param view view instance the collection line belongs to 283 * @param model object containing the full view data 284 * @param collectionGroup collection group component the line belongs to 285 * @param line line instance to apply default values to 286 */ 287 public void applyDefaultValuesForCollectionLine(View view, Object model, CollectionGroup collectionGroup, Object line); 288 289 /** 290 * Return an instance of {@link org.kuali.rice.krad.uif.view.ExpressionEvaluator} that can be used for evaluating 291 * expressions 292 * contained on the view 293 * 294 * <p> 295 * A ExpressionEvaluator must be initialized with a model for expression evaluation. One instance is 296 * constructed for the view lifecycle and made available to all components/helpers through this method 297 * </p> 298 * 299 * @return instance of ExpressionEvaluator 300 */ 301 public ExpressionEvaluator getExpressionEvaluator(); 302 303 /** 304 * Generates table formatted data based on data collected from the table model 305 * 306 * @param view view instance where the table is located 307 * @param model top level object containing the data 308 * @param tableId id of the table being generated 309 * @param formatType format which the table should be generated in 310 * @return 311 */ 312 public String buildExportTableData(View view, Object model, String tableId, String formatType); 313 314 }