1 /*
2 * Copyright 2007 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 1.0 (the
5 * "License"); 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/ecl1.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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16 package org.kuali.rice.krad.web.form;
17
18 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
19 import org.kuali.rice.krad.uif.container.View;
20 import org.kuali.rice.krad.uif.history.History;
21 import org.kuali.rice.krad.uif.service.ViewService;
22 import org.springframework.web.multipart.MultipartFile;
23
24 import javax.servlet.http.HttpServletRequest;
25 import java.io.Serializable;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.Properties;
29 import java.util.UUID;
30
31 /**
32 * Base form class for views within the KRAD User Interface Framework
33 *
34 * <p>
35 * Holds properties necessary to determine the <code>View</code> instance that
36 * will be used to render the UI
37 * </p>
38 *
39 * @author Kuali Rice Team (rice.collab@kuali.org)
40 */
41 public class UifFormBase implements Serializable {
42 private static final long serialVersionUID = 8432543267099454434L;
43
44 private History formHistory;
45
46 // current view
47 protected String viewId;
48 protected String viewName;
49 protected String viewTypeName;
50 protected String pageId;
51 protected String methodToCall;
52 protected String formKey;
53 protected String jumpToId;
54 protected String jumpToName;
55 protected String focusId;
56 protected String formPostUrl;
57
58 protected boolean defaultsApplied;
59
60 protected View view;
61 protected View previousView;
62 protected Map<String, String> viewRequestParameters;
63
64 protected Map<String, Object> newCollectionLines;
65 protected Map<String, String> actionParameters;
66
67 protected MultipartFile attachmentFile;
68
69 // navigation
70 protected String returnLocation;
71 protected String returnFormKey;
72 protected String hubLocation;
73 protected String hubFormKey;
74 protected String homeLocation;
75
76 protected boolean renderFullView;
77 protected boolean validateDirty;
78
79 public UifFormBase() {
80 formKey = generateFormKey();
81 renderFullView = true;
82 defaultsApplied = false;
83
84 viewRequestParameters = new HashMap<String, String>();
85 newCollectionLines = new HashMap<String, Object>();
86 actionParameters = new HashMap<String, String>();
87 }
88
89 /**
90 * Creates the unique id used to store this "conversation" in the session.
91 * The default method generates a java UUID.
92 *
93 * @return
94 */
95 protected String generateFormKey() {
96 return UUID.randomUUID().toString();
97 }
98
99 /**
100 * Called after Spring binds the request to the form and before the
101 * controller method is invoked.
102 *
103 * @param request
104 * - request object containing the query parameters
105 */
106 public void postBind(HttpServletRequest request) {
107 // default form post URL to request URL
108 formPostUrl = request.getRequestURL().toString();
109 }
110
111 /**
112 * Unique Id for the <code>View</code> instance. This is specified for a
113 * view in its definition by setting the 'id' property.
114 *
115 * @return String view id
116 */
117 public String getViewId() {
118 return this.viewId;
119 }
120
121 /**
122 * Setter for the unique view id
123 *
124 * @param viewId
125 */
126 public void setViewId(String viewId) {
127 this.viewId = viewId;
128 }
129
130 /**
131 * Name for the <code>View</code> instance. This is specified for a view in
132 * its definition by setting the 'id' property. The name is not necessary
133 * unique and cannot be used by itself to retrieve a view. Typically it is
134 * used with other parameters to identify a view with a certain type (view
135 * type)
136 *
137 * @return String view name
138 */
139 public String getViewName() {
140 return this.viewName;
141 }
142
143 /**
144 * Setter for the view name
145 *
146 * @param viewName
147 */
148 public void setViewName(String viewName) {
149 this.viewName = viewName;
150 }
151
152 /**
153 * Name for the type of view being requested. This can be used to find
154 * <code>View</code> instances by request parameters (not necessary the
155 * unique id)
156 *
157 * @return String view type name
158 */
159 public String getViewTypeName() {
160 return this.viewTypeName;
161 }
162
163 /**
164 * Setter for the view type name
165 *
166 * @param viewTypeName
167 */
168 public void setViewTypeName(String viewTypeName) {
169 this.viewTypeName = viewTypeName;
170 }
171
172 /**
173 * Id for the current page being displayed within the view
174 *
175 * @return String page id
176 */
177 public String getPageId() {
178 return this.pageId;
179 }
180
181 /**
182 * Setter for the current page id
183 *
184 * @param pageId
185 */
186 public void setPageId(String pageId) {
187 this.pageId = pageId;
188 }
189
190 public String getFormPostUrl() {
191 return this.formPostUrl;
192 }
193
194 public void setFormPostUrl(String formPostUrl) {
195 this.formPostUrl = formPostUrl;
196 }
197
198 public String getReturnLocation() {
199 return this.returnLocation;
200 }
201
202 public void setReturnLocation(String returnLocation) {
203 this.returnLocation = returnLocation;
204 }
205
206 public String getReturnFormKey() {
207 return this.returnFormKey;
208 }
209
210 public void setReturnFormKey(String returnFormKey) {
211 this.returnFormKey = returnFormKey;
212 }
213
214 public String getHubLocation() {
215 return this.hubLocation;
216 }
217
218 public void setHubLocation(String hubLocation) {
219 this.hubLocation = hubLocation;
220 }
221
222 public String getHubFormKey() {
223 return this.hubFormKey;
224 }
225
226 public void setHubFormKey(String hubFormKey) {
227 this.hubFormKey = hubFormKey;
228 }
229
230 public String getHomeLocation() {
231 return this.homeLocation;
232 }
233
234 public void setHomeLocation(String homeLocation) {
235 this.homeLocation = homeLocation;
236 }
237
238 /**
239 * Identifies the controller method that should be invoked to fulfill a
240 * request. The value will be matched up against the 'params' setting on the
241 * <code>RequestMapping</code> annotation for the controller method
242 *
243 * @return String method to call
244 */
245 public String getMethodToCall() {
246 return this.methodToCall;
247 }
248
249 /**
250 * Setter for the method to call
251 *
252 * @param methodToCall
253 */
254 public void setMethodToCall(String methodToCall) {
255 this.methodToCall = methodToCall;
256 }
257
258 /**
259 * Map of parameters that was used to configured the <code>View</code>.
260 * Maintained on the form to rebuild the view on posts and session timeout
261 *
262 * @return Map<String, String> view parameters
263 * @see org.kuali.rice.krad.uif.container.View.getViewRequestParameters()
264 */
265 public Map<String, String> getViewRequestParameters() {
266 return this.viewRequestParameters;
267 }
268
269 /**
270 * Setter for the view's request parameter map
271 *
272 * @param viewRequestParameters
273 */
274 public void setViewRequestParameters(Map<String, String> viewRequestParameters) {
275 this.viewRequestParameters = viewRequestParameters;
276 }
277
278 /**
279 * Holds instances for collection add lines. The key of the Map gives the
280 * collection name the line instance applies to, the Map value is an
281 * instance of the collection object class that holds the new line data
282 *
283 * @return Map<String, Object> new collection lines
284 */
285 public Map<String, Object> getNewCollectionLines() {
286 return this.newCollectionLines;
287 }
288
289 /**
290 * Setter for the new collection lines Map
291 *
292 * @param newCollectionLines
293 */
294 public void setNewCollectionLines(Map<String, Object> newCollectionLines) {
295 this.newCollectionLines = newCollectionLines;
296 }
297
298 /**
299 * Map of parameters sent for the invoked action
300 * <p>
301 * Many times besides just setting the method to call actions need to send
302 * additional parameters. For instance the method being called might do a
303 * redirect, in which case the action needs to send parameters for the
304 * redirect URL. An example of this is redirecting to a <code>Lookup</code>
305 * view. In some cases the parameters that need to be sent conflict with
306 * properties already on the form, and putting all the action parameters as
307 * form properties would grow massive (in addition to adds an additional
308 * step from the XML config). So this general map solves those issues.
309 * </p>
310 *
311 * @return Map<String, String> action parameters
312 */
313 public Map<String, String> getActionParameters() {
314 return this.actionParameters;
315 }
316
317 /**
318 * Returns the action parameters map as a <code>Properties</code> instance
319 *
320 * @return Properties action parameters
321 */
322 public Properties getActionParametersAsProperties() {
323 Properties actionProperties = new Properties();
324
325 if (actionParameters != null) {
326 for (Map.Entry<String, String> actionParameter : actionParameters.entrySet()) {
327 actionProperties.put(actionParameter.getKey(), actionParameter.getValue());
328 }
329 }
330
331 return actionProperties;
332 }
333
334 /**
335 * Setter for the action parameters map
336 *
337 * @param actionParameters
338 */
339 public void setActionParameters(Map<String, String> actionParameters) {
340 this.actionParameters = actionParameters;
341 }
342
343 /**
344 * Retrieves the value for the given action parameter, or empty string if
345 * not found
346 *
347 * @param actionParameterName
348 * - name of the action parameter to retrieve value for
349 * @return String parameter value or empty string
350 */
351 public String getActionParamaterValue(String actionParameterName) {
352 if ((actionParameters != null) && actionParameters.containsKey(actionParameterName)) {
353 return actionParameters.get(actionParameterName);
354 }
355
356 return "";
357 }
358
359 /**
360 * Key string that identifies the form instance in session storage
361 * <p>
362 * When the view is posted, the previous form instance is retrieved and then
363 * populated from the request parameters. This key string is retrieve the
364 * session form from the session service
365 * </p>
366 *
367 * @return String form session key
368 */
369 public String getFormKey() {
370 return this.formKey;
371 }
372
373 /**
374 * Setter for the form's session key
375 *
376 * @param formKey
377 */
378 public void setFormKey(String formKey) {
379 this.formKey = formKey;
380 }
381
382 /**
383 * Indicates whether the form has had default values from the configured
384 * <code>View</code> applied. This happens only once for each form instance
385 *
386 * @return boolean true if default values have been applied, false if not
387 */
388 public boolean isDefaultsApplied() {
389 return this.defaultsApplied;
390 }
391
392 /**
393 * Setter for the defaults applied indicator
394 *
395 * @param defaultsApplied
396 */
397 public void setDefaultsApplied(boolean defaultsApplied) {
398 this.defaultsApplied = defaultsApplied;
399 }
400
401 /**
402 * Holder for files that are attached through the view
403 *
404 * @return MultipartFile representing the attachment
405 */
406 public MultipartFile getAttachmentFile() {
407 return this.attachmentFile;
408 }
409
410 /**
411 * Setter for the form's attachment file
412 *
413 * @param attachmentFile
414 */
415 public void setAttachmentFile(MultipartFile attachmentFile) {
416 this.attachmentFile = attachmentFile;
417 }
418
419 /**
420 * @return the renderFullView
421 */
422 public boolean isRenderFullView() {
423 return this.renderFullView;
424 }
425
426 /**
427 * @param renderFullView
428 */
429 public void setRenderFullView(boolean renderFullView) {
430 this.renderFullView = renderFullView;
431 }
432
433 /**
434 * View instance associated with the form. Used to render the user interface
435 *
436 * @return View
437 */
438 public View getView() {
439 return this.view;
440 }
441
442 /**
443 * Setter for the view instance
444 *
445 * @param view
446 */
447 public void setView(View view) {
448 this.view = view;
449 }
450
451 /**
452 * View instance for the page that made a request. Since a new view instance
453 * gets initialized for each request before the controller logic is invoked,
454 * any state about the previous view is lost. This could be needed to read
455 * metadata from the view for such things as collection processing. When
456 * this is necessary the previous view instance can be retrieved
457 *
458 * @return View instance
459 */
460 public View getPreviousView() {
461 return this.previousView;
462 }
463
464 /**
465 * Setter for the previous view instance
466 *
467 * @param previousView
468 */
469 public void setPreviousView(View previousView) {
470 this.previousView = previousView;
471 }
472
473 /**
474 * Instance of the <code>ViewService</code> that can be used to retrieve
475 * <code>View</code> instances
476 *
477 * @return ViewService implementation
478 */
479 protected ViewService getViewService() {
480 return KRADServiceLocatorWeb.getViewService();
481 }
482
483 /**
484 * The jumpToId for this form, the element with this id will be jumped to automatically
485 * when the form is loaded in the view.
486 * Using "TOP" or "BOTTOM" will jump to the top or the bottom of the resulting page.
487 * jumpToId always takes precedence over jumpToName, if set.
488 *
489 * @return the jumpToId
490 */
491 public String getJumpToId() {
492 return this.jumpToId;
493 }
494
495 /**
496 * @param jumpToId the jumpToId to set
497 */
498 public void setJumpToId(String jumpToId) {
499 this.jumpToId = jumpToId;
500 }
501
502 /**
503 * The jumpToName for this form, the element with this name will be jumped to automatically
504 * when the form is loaded in the view.
505 * WARNING: jumpToId always takes precedence over jumpToName, if set.
506 *
507 * @return the jumpToName
508 */
509 public String getJumpToName() {
510 return this.jumpToName;
511 }
512
513 /**
514 * @param jumpToName the jumpToName to set
515 */
516 public void setJumpToName(String jumpToName) {
517 this.jumpToName = jumpToName;
518 }
519
520 /**
521 * Field to place focus on when the page loads
522 * An empty focusId will result in focusing on the first visible input element by default.
523 *
524 * @return the focusId
525 */
526 public String getFocusId() {
527 return this.focusId;
528 }
529
530 /**
531 * @param focusId the focusId to set
532 */
533 public void setFocusId(String focusId) {
534 this.focusId = focusId;
535 }
536
537 /**
538 * History parameter representing the History of views that have come before the
539 * viewing of the current view. Used for breadcrumb widget generation on the view.
540 *
541 * @param history the history to set
542 */
543 public void setFormHistory(History history) {
544 this.formHistory = history;
545 }
546
547 /**
548 * @return the history
549 */
550 public History getFormHistory() {
551 return formHistory;
552 }
553
554 public boolean isValidateDirty() {
555 return this.validateDirty;
556 }
557
558 /**
559 * Setter for dirty validation.
560 */
561 public void setValidateDirty(boolean validateDirty) {
562 this.validateDirty = validateDirty;
563 }
564
565 }