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 public String getBaseLookupUrl() {
300 return this.baseLookupUrl;
301 }
302
303 public void setBaseLookupUrl(String baseLookupUrl) {
304 this.baseLookupUrl = baseLookupUrl;
305 }
306
307 public String getDataObjectClassName() {
308 return this.dataObjectClassName;
309 }
310
311 public void setDataObjectClassName(String dataObjectClassName) {
312 this.dataObjectClassName = dataObjectClassName;
313 }
314
315 public String getViewName() {
316 return this.viewName;
317 }
318
319 public void setViewName(String viewName) {
320 this.viewName = viewName;
321 }
322
323 public String getReferencesToRefresh() {
324 return this.referencesToRefresh;
325 }
326
327 public void setReferencesToRefresh(String referencesToRefresh) {
328 this.referencesToRefresh = referencesToRefresh;
329 }
330
331 public Map<String, String> getFieldConversions() {
332 return this.fieldConversions;
333 }
334
335 public void setFieldConversions(Map<String, String> fieldConversions) {
336 this.fieldConversions = fieldConversions;
337 }
338
339 public Map<String, String> getLookupParameters() {
340 return this.lookupParameters;
341 }
342
343 public void setLookupParameters(Map<String, String> lookupParameters) {
344 this.lookupParameters = lookupParameters;
345 }
346
347 public String getReadOnlySearchFields() {
348 return this.readOnlySearchFields;
349 }
350
351 public void setReadOnlySearchFields(String readOnlySearchFields) {
352 this.readOnlySearchFields = readOnlySearchFields;
353 }
354
355 public Boolean getHideReturnLink() {
356 return this.hideReturnLink;
357 }
358
359 public void setHideReturnLink(Boolean hideReturnLink) {
360 this.hideReturnLink = hideReturnLink;
361 }
362
363 public Boolean getSuppressActions() {
364 return suppressActions;
365 }
366
367 public void setSuppressActions(Boolean suppressActions) {
368 this.suppressActions = suppressActions;
369 }
370
371 public Boolean getAutoSearch() {
372 return this.autoSearch;
373 }
374
375 public void setAutoSearch(Boolean autoSearch) {
376 this.autoSearch = autoSearch;
377 }
378
379 public Boolean getLookupCriteriaEnabled() {
380 return this.lookupCriteriaEnabled;
381 }
382
383 public void setLookupCriteriaEnabled(Boolean lookupCriteriaEnabled) {
384 this.lookupCriteriaEnabled = lookupCriteriaEnabled;
385 }
386
387 public Boolean getSupplementalActionsEnabled() {
388 return this.supplementalActionsEnabled;
389 }
390
391 public void setSupplementalActionsEnabled(Boolean supplementalActionsEnabled) {
392 this.supplementalActionsEnabled = supplementalActionsEnabled;
393 }
394
395 public Boolean getDisableSearchButtons() {
396 return this.disableSearchButtons;
397 }
398
399 public void setDisableSearchButtons(Boolean disableSearchButtons) {
400 this.disableSearchButtons = disableSearchButtons;
401 }
402
403 public Boolean getHeaderBarEnabled() {
404 return this.headerBarEnabled;
405 }
406
407 public void setHeaderBarEnabled(Boolean headerBarEnabled) {
408 this.headerBarEnabled = headerBarEnabled;
409 }
410
411 public Boolean getShowMaintenanceLinks() {
412 return this.showMaintenanceLinks;
413 }
414
415 public void setShowMaintenanceLinks(Boolean showMaintenanceLinks) {
416 this.showMaintenanceLinks = showMaintenanceLinks;
417 }
418
419 public ActionField getQuickfinderActionField() {
420 return this.quickfinderActionField;
421 }
422
423 public void setQuickfinderActionField(ActionField quickfinderActionField) {
424 this.quickfinderActionField = quickfinderActionField;
425 }
426
427
428
429
430
431
432 public Boolean getMultipleValuesSelect() {
433 return multipleValuesSelect;
434 }
435
436
437
438
439
440
441 public void setMultipleValuesSelect(Boolean multipleValuesSelect) {
442 this.multipleValuesSelect = multipleValuesSelect;
443 }
444
445
446
447
448
449
450
451
452
453
454
455
456 public String getLookupCollectionName() {
457 return lookupCollectionName;
458 }
459
460
461
462
463
464
465 public void setLookupCollectionName(String lookupCollectionName) {
466 this.lookupCollectionName = lookupCollectionName;
467 }
468 }