1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.uif.widget;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.krad.bo.DataObjectRelationship;
20 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
21 import org.kuali.rice.krad.uif.UifParameters;
22 import org.kuali.rice.krad.uif.container.CollectionGroup;
23 import org.kuali.rice.krad.uif.field.InputField;
24 import org.kuali.rice.krad.uif.view.View;
25 import org.kuali.rice.krad.uif.component.BindingInfo;
26 import org.kuali.rice.krad.uif.component.Component;
27 import org.kuali.rice.krad.uif.field.ActionField;
28 import org.kuali.rice.krad.uif.util.ViewModelUtils;
29 import org.kuali.rice.krad.util.KRADUtils;
30
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
34
35
36
37
38
39
40 public class QuickFinder extends WidgetBase {
41 private static final long serialVersionUID = 3302390972815386785L;
42
43
44 private String baseLookupUrl;
45 private String dataObjectClassName;
46 private String viewName;
47
48 private String referencesToRefresh;
49
50 private Map<String, String> fieldConversions;
51 private Map<String, String> lookupParameters;
52
53
54 private String readOnlySearchFields;
55
56 private Boolean hideReturnLink;
57 private Boolean suppressActions;
58 private Boolean autoSearch;
59 private Boolean lookupCriteriaEnabled;
60 private Boolean supplementalActionsEnabled;
61 private Boolean disableSearchButtons;
62 private Boolean headerBarEnabled;
63 private Boolean showMaintenanceLinks;
64
65 private Boolean multipleValuesSelect;
66 private String lookupCollectionName;
67
68 private ActionField quickfinderActionField;
69
70 public QuickFinder() {
71 super();
72
73 fieldConversions = new HashMap<String, String>();
74 lookupParameters = new HashMap<String, String>();
75 }
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 @Override
98 public void performFinalize(View view, Object model, Component parent) {
99 super.performFinalize(view, model, parent);
100
101 if (!isRender()) {
102 return;
103 }
104
105 if (parent instanceof InputField) {
106 InputField field = (InputField) parent;
107
108
109
110 if (StringUtils.isBlank(dataObjectClassName)) {
111 DataObjectRelationship relationship = getRelationshipForField(view, model, field);
112
113
114 if (relationship == null) {
115 setRender(false);
116 return;
117 }
118
119 dataObjectClassName = relationship.getRelatedClass().getName();
120
121 if ((fieldConversions == null) || fieldConversions.isEmpty()) {
122 generateFieldConversions(field, relationship);
123 }
124
125 if ((lookupParameters == null) || lookupParameters.isEmpty()) {
126 generateLookupParameters(field, relationship);
127 }
128 }
129
130
131 updateFieldConversions(field.getBindingInfo());
132 updateLookupParameters(field.getBindingInfo());
133 } else if (parent instanceof CollectionGroup) {
134 CollectionGroup collectionGroup = (CollectionGroup) parent;
135
136
137
138 if (StringUtils.isBlank(getDataObjectClassName())) {
139 Class<?> collectionObjectClass = collectionGroup.getCollectionObjectClass();
140 boolean isCollectionClassLookupable = KRADServiceLocatorWeb.getViewDictionaryService().isLookupable(
141 collectionObjectClass);
142 if (isCollectionClassLookupable) {
143 setDataObjectClassName(collectionObjectClass.getName());
144
145 if ((fieldConversions == null) || fieldConversions.isEmpty()) {
146
147 List<String> collectionObjectPKFields =
148 KRADServiceLocatorWeb.getDataObjectMetaDataService().listPrimaryKeyFieldNames(
149 collectionObjectClass);
150
151 for (String pkField : collectionObjectPKFields) {
152 fieldConversions.put(pkField, pkField);
153 }
154 }
155 } else {
156
157 setRender(false);
158 }
159 }
160
161
162 if (isRender() && StringUtils.isBlank(getLookupCollectionName())) {
163 setLookupCollectionName(collectionGroup.getBindingInfo().getBindingPath());
164 }
165 }
166
167 quickfinderActionField.addActionParameter(UifParameters.BASE_LOOKUP_URL, baseLookupUrl);
168 quickfinderActionField.addActionParameter(UifParameters.DATA_OBJECT_CLASS_NAME, dataObjectClassName);
169
170 if (!fieldConversions.isEmpty()) {
171 quickfinderActionField.addActionParameter(UifParameters.CONVERSION_FIELDS,
172 KRADUtils.buildMapParameterString(fieldConversions));
173 }
174
175 if (!lookupParameters.isEmpty()) {
176 quickfinderActionField.addActionParameter(UifParameters.LOOKUP_PARAMETERS,
177 KRADUtils.buildMapParameterString(lookupParameters));
178 }
179
180 addActionParameterIfNotNull(UifParameters.VIEW_NAME, viewName);
181 addActionParameterIfNotNull(UifParameters.READ_ONLY_FIELDS, readOnlySearchFields);
182 addActionParameterIfNotNull(UifParameters.HIDE_RETURN_LINK, hideReturnLink);
183 addActionParameterIfNotNull(UifParameters.SUPRESS_ACTIONS, suppressActions);
184 addActionParameterIfNotNull(UifParameters.REFERENCES_TO_REFRESH, referencesToRefresh);
185 addActionParameterIfNotNull(UifParameters.AUTO_SEARCH, autoSearch);
186 addActionParameterIfNotNull(UifParameters.LOOKUP_CRITERIA_ENABLED, lookupCriteriaEnabled);
187 addActionParameterIfNotNull(UifParameters.SUPPLEMENTAL_ACTIONS_ENABLED, supplementalActionsEnabled);
188 addActionParameterIfNotNull(UifParameters.DISABLE_SEARCH_BUTTONS, disableSearchButtons);
189 addActionParameterIfNotNull(UifParameters.HEADER_BAR_ENABLED, headerBarEnabled);
190 addActionParameterIfNotNull(UifParameters.SHOW_MAINTENANCE_LINKS, showMaintenanceLinks);
191 addActionParameterIfNotNull(UifParameters.MULTIPLE_VALUES_SELECT, multipleValuesSelect);
192 addActionParameterIfNotNull(UifParameters.LOOKUP_COLLECTION_NAME, lookupCollectionName);
193
194
195
196
197 }
198
199 protected void addActionParameterIfNotNull(String parameterName, Object parameterValue) {
200 if ((parameterValue != null) && StringUtils.isNotBlank(parameterValue.toString())) {
201 quickfinderActionField.addActionParameter(parameterName, parameterValue.toString());
202 }
203 }
204
205 protected DataObjectRelationship getRelationshipForField(View view, Object model, InputField field) {
206 String propertyName = field.getBindingInfo().getBindingName();
207
208
209 Object parentObject = ViewModelUtils.getParentObjectForMetadata(view, model, field);
210 Class<?> parentObjectClass = null;
211 if (parentObject != null) {
212 parentObjectClass = parentObject.getClass();
213 }
214
215
216 return KRADServiceLocatorWeb.getDataObjectMetaDataService().getDataObjectRelationship(parentObject,
217 parentObjectClass, propertyName, "", true, true, false);
218 }
219
220 protected void generateFieldConversions(InputField field, DataObjectRelationship relationship) {
221 fieldConversions = new HashMap<String, String>();
222 for (Map.Entry<String, String> entry : relationship.getParentToChildReferences().entrySet()) {
223 String fromField = entry.getValue();
224 String toField = entry.getKey();
225
226
227
228
229
230 fieldConversions.put(fromField, toField);
231 }
232 }
233
234 protected void generateLookupParameters(InputField field, DataObjectRelationship relationship) {
235 lookupParameters = new HashMap<String, String>();
236 for (Map.Entry<String, String> entry : relationship.getParentToChildReferences().entrySet()) {
237 String fromField = entry.getKey();
238 String toField = entry.getValue();
239
240
241
242
243
244 if (relationship.getUserVisibleIdentifierKey() == null || relationship.getUserVisibleIdentifierKey().equals(
245 fromField)) {
246 lookupParameters.put(fromField, toField);
247 }
248 }
249 }
250
251
252
253
254
255
256
257 public void updateFieldConversions(BindingInfo bindingInfo) {
258 Map<String, String> adjustedFieldConversions = new HashMap<String, String>();
259 for (String fromField : fieldConversions.keySet()) {
260 String toField = fieldConversions.get(fromField);
261 String adjustedToFieldPath = bindingInfo.getPropertyAdjustedBindingPath(toField);
262
263 adjustedFieldConversions.put(fromField, adjustedToFieldPath);
264 }
265
266 this.fieldConversions = adjustedFieldConversions;
267 }
268
269
270
271
272
273
274
275 public void updateLookupParameters(BindingInfo bindingInfo) {
276 Map<String, String> adjustedLookupParameters = new HashMap<String, String>();
277 for (String fromField : lookupParameters.keySet()) {
278 String toField = lookupParameters.get(fromField);
279 String adjustedFromFieldPath = bindingInfo.getPropertyAdjustedBindingPath(fromField);
280
281 adjustedLookupParameters.put(adjustedFromFieldPath, toField);
282 }
283
284 this.lookupParameters = adjustedLookupParameters;
285 }
286
287
288
289
290 @Override
291 public List<Component> getComponentsForLifecycle() {
292 List<Component> components = super.getComponentsForLifecycle();
293
294 components.add(quickfinderActionField);
295
296 return components;
297 }
298
299
300
301
302
303
304
305
306
307
308
309
310
311 public String getBaseLookupUrl() {
312 return this.baseLookupUrl;
313 }
314
315
316
317
318
319
320 public void setBaseLookupUrl(String baseLookupUrl) {
321 this.baseLookupUrl = baseLookupUrl;
322 }
323
324
325
326
327
328
329
330
331
332
333
334
335 public String getDataObjectClassName() {
336 return this.dataObjectClassName;
337 }
338
339
340
341
342
343
344 public void setDataObjectClassName(String dataObjectClassName) {
345 this.dataObjectClassName = dataObjectClassName;
346 }
347
348
349
350
351
352
353
354
355
356
357
358
359 public String getViewName() {
360 return this.viewName;
361 }
362
363
364
365
366
367
368 public void setViewName(String viewName) {
369 this.viewName = viewName;
370 }
371
372 public String getReferencesToRefresh() {
373 return this.referencesToRefresh;
374 }
375
376 public void setReferencesToRefresh(String referencesToRefresh) {
377 this.referencesToRefresh = referencesToRefresh;
378 }
379
380 public Map<String, String> getFieldConversions() {
381 return this.fieldConversions;
382 }
383
384 public void setFieldConversions(Map<String, String> fieldConversions) {
385 this.fieldConversions = fieldConversions;
386 }
387
388 public Map<String, String> getLookupParameters() {
389 return this.lookupParameters;
390 }
391
392 public void setLookupParameters(Map<String, String> lookupParameters) {
393 this.lookupParameters = lookupParameters;
394 }
395
396 public String getReadOnlySearchFields() {
397 return this.readOnlySearchFields;
398 }
399
400 public void setReadOnlySearchFields(String readOnlySearchFields) {
401 this.readOnlySearchFields = readOnlySearchFields;
402 }
403
404 public Boolean getHideReturnLink() {
405 return this.hideReturnLink;
406 }
407
408 public void setHideReturnLink(Boolean hideReturnLink) {
409 this.hideReturnLink = hideReturnLink;
410 }
411
412 public Boolean getSuppressActions() {
413 return suppressActions;
414 }
415
416 public void setSuppressActions(Boolean suppressActions) {
417 this.suppressActions = suppressActions;
418 }
419
420 public Boolean getAutoSearch() {
421 return this.autoSearch;
422 }
423
424 public void setAutoSearch(Boolean autoSearch) {
425 this.autoSearch = autoSearch;
426 }
427
428 public Boolean getLookupCriteriaEnabled() {
429 return this.lookupCriteriaEnabled;
430 }
431
432 public void setLookupCriteriaEnabled(Boolean lookupCriteriaEnabled) {
433 this.lookupCriteriaEnabled = lookupCriteriaEnabled;
434 }
435
436 public Boolean getSupplementalActionsEnabled() {
437 return this.supplementalActionsEnabled;
438 }
439
440 public void setSupplementalActionsEnabled(Boolean supplementalActionsEnabled) {
441 this.supplementalActionsEnabled = supplementalActionsEnabled;
442 }
443
444 public Boolean getDisableSearchButtons() {
445 return this.disableSearchButtons;
446 }
447
448 public void setDisableSearchButtons(Boolean disableSearchButtons) {
449 this.disableSearchButtons = disableSearchButtons;
450 }
451
452 public Boolean getHeaderBarEnabled() {
453 return this.headerBarEnabled;
454 }
455
456 public void setHeaderBarEnabled(Boolean headerBarEnabled) {
457 this.headerBarEnabled = headerBarEnabled;
458 }
459
460 public Boolean getShowMaintenanceLinks() {
461 return this.showMaintenanceLinks;
462 }
463
464 public void setShowMaintenanceLinks(Boolean showMaintenanceLinks) {
465 this.showMaintenanceLinks = showMaintenanceLinks;
466 }
467
468 public ActionField getQuickfinderActionField() {
469 return this.quickfinderActionField;
470 }
471
472 public void setQuickfinderActionField(ActionField quickfinderActionField) {
473 this.quickfinderActionField = quickfinderActionField;
474 }
475
476
477
478
479
480
481 public Boolean getMultipleValuesSelect() {
482 return multipleValuesSelect;
483 }
484
485
486
487
488
489
490 public void setMultipleValuesSelect(Boolean multipleValuesSelect) {
491 this.multipleValuesSelect = multipleValuesSelect;
492 }
493
494
495
496
497
498
499
500
501
502
503
504
505 public String getLookupCollectionName() {
506 return lookupCollectionName;
507 }
508
509
510
511
512
513
514 public void setLookupCollectionName(String lookupCollectionName) {
515 this.lookupCollectionName = lookupCollectionName;
516 }
517 }