View Javadoc
1   /**
2    * Copyright 2005-2015 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.field;
17  
18  import java.beans.PropertyEditor;
19  import java.util.List;
20  
21  import org.kuali.rice.krad.datadictionary.AttributeDefinition;
22  import org.kuali.rice.krad.datadictionary.mask.MaskFormatter;
23  import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
24  import org.kuali.rice.krad.uif.component.ComponentSecurity;
25  import org.kuali.rice.krad.uif.component.DataBinding;
26  import org.kuali.rice.krad.uif.widget.Helpable;
27  import org.kuali.rice.krad.uif.widget.Inquiry;
28  import org.kuali.rice.krad.valuefinder.ValueFinder;
29  
30  /**
31   * Component interface for data fields. 
32   * 
33   * @author Kuali Rice Team (rice.collab@kuali.org)
34   */
35  public interface DataField extends DataBinding, Helpable, Field {
36  
37      /**
38       * Defaults the properties of the <code>DataField</code> to the
39       * corresponding properties of its <code>AttributeDefinition</code>
40       * retrieved from the dictionary (if such an entry exists). If the field
41       * already contains a value for a property, the definitions value is not
42       * used.
43       *
44       * @param attributeDefinition AttributeDefinition instance the property values should be
45       * copied from
46       */
47      void copyFromAttributeDefinition(AttributeDefinition attributeDefinition);
48  
49      /**
50       * Indicates whether the data field instance allows input, subclasses should override and set to
51       * true if input is allowed
52       *
53       * @return true if input is allowed, false if read only
54       */
55      boolean isInputAllowed();
56  
57      /**
58       * Setter for the component's property name
59       *
60       * @param propertyName
61       */
62      void setPropertyName(String propertyName);
63  
64      /**
65       * Performs formatting of the field value for display and then converting the value back to its
66       * expected type from a string
67       *
68       * <p>
69       * Note property editors exist and are already registered for the basic Java types and the
70       * common Kuali types such as [@link KualiDecimal}. Registration with this property is only
71       * needed for custom property editors
72       * </p>
73       *
74       * @return PropertyEditor property editor instance to use for this field
75       */
76      PropertyEditor getPropertyEditor();
77  
78      /**
79       * Setter for the custom property editor to use for the field
80       *
81       * @param propertyEditor
82       */
83      void setPropertyEditor(PropertyEditor propertyEditor);
84  
85      /**
86       * Convenience setter for configuring a property editor by class
87       *
88       * @param propertyEditorClass
89       */
90      void setPropertyEditorClass(Class<? extends PropertyEditor> propertyEditorClass);
91  
92      /**
93       * Returns the full binding path (the path used in the name attribute of the input).
94       * This differs from propertyName in that it uses BindingInfo to determine the path.
95       *
96       * @return full binding path name
97       */
98      String getName();
99  
100     /**
101      * Name of the attribute within the data dictionary the attribute field is
102      * associated with
103      *
104      * <p>
105      * During the initialize phase for the <code>View</code>, properties for
106      * attribute fields are defaulted from a corresponding
107      * <code>AttributeDefinition</code> in the data dictionary. Based on the
108      * propertyName and parent object class the framework attempts will
109      * determine the attribute definition that is associated with the field and
110      * set this property. However this property can also be set in the fields
111      * configuration to use another dictionary attribute.
112      * </p>
113      *
114      * <p>
115      * The attribute name is used along with the dictionary object entry to find
116      * the <code>AttributeDefinition</code>
117      * </p>
118      *
119      * @return attribute name
120      */
121     String getDictionaryAttributeName();
122 
123     /**
124      * Setter for the dictionary attribute name
125      *
126      * @param dictionaryAttributeName
127      */
128     void setDictionaryAttributeName(String dictionaryAttributeName);
129 
130     /**
131      * Object entry name in the data dictionary the associated attribute is
132      * apart of
133      *
134      * <p>
135      * During the initialize phase for the <code>View</code>, properties for
136      * attribute fields are defaulted from a corresponding
137      * <code>AttributeDefinition</code> in the data dictionary. Based on the
138      * parent object class the framework will determine the object entry for the
139      * associated attribute. However the object entry can be set in the field's
140      * configuration to use another object entry for the attribute
141      * </p>
142      *
143      * <p>
144      * The attribute name is used along with the dictionary object entry to find
145      * the <code>AttributeDefinition</code>
146      * </p>
147      *
148      * @return String
149      */
150     String getDictionaryObjectEntry();
151 
152     /**
153      * Setter for the dictionary object entry
154      *
155      * @param dictionaryObjectEntry
156      */
157     void setDictionaryObjectEntry(String dictionaryObjectEntry);
158 
159     /**
160      * Default value for the model property the field points to
161      *
162      * <p>
163      * When a new <code>View</code> instance is requested, the corresponding
164      * model will be newly created. During this initialization process the value
165      * for the model property will be set to the given default value, if it was null.
166      * This will only work on properties which can be determined to be null.
167      * Therefore a String property with an empty string value will
168      * not be ovewritten with the defaultValue set here.
169      * </p>
170      *
171      * <p>
172      * In addition, int, boolean, and other primitive types
173      * will not use this default value because they inherently have a value in Java (0 for int, false for boolean, etc).
174      * To use such types either using a primitive wrapper type (Integer, Boolean, etc) so an unset variable can
175      * be determined to be null, or explicitly set the default value on the form/object itself for these types and
176      * not through this property.
177      * </p>
178      *
179      * @return default value
180      */
181     Object getDefaultValue();
182 
183     /**
184      * Setter for the fields default value
185      *
186      * @param defaultValue
187      */
188     void setDefaultValue(Object defaultValue);
189 
190     /**
191      * Gives Class that should be invoked to produce the default value for the
192      * field
193      *
194      * @return default value finder class
195      */
196     Class<? extends ValueFinder> getDefaultValueFinderClass();
197 
198     /**
199      * Setter for the default value finder class
200      *
201      * @param defaultValueFinderClass
202      */
203     void setDefaultValueFinderClass(Class<? extends ValueFinder> defaultValueFinderClass);
204 
205     /**
206      * Array of default values for the model property the field points to
207      *
208      * <p>
209      * When a new <code>View</code> instance is requested, the corresponding
210      * model will be newly created. During this initialization process the value
211      * for the model property will be set to the given default values (if set)
212      * </p>
213      *
214      * @return default value
215      */
216     List<Object> getDefaultValues();
217 
218     /**
219      * Setter for the fields default values
220      *
221      * @param defaultValues
222      */
223     void setDefaultValues(List<Object> defaultValues);
224 
225     /**
226      * For read only DataFields, if forcedValue has a value, the value of it will be used instead of the value
227      * received from the propertyName specified for this field;
228      * this can be combined with SpringEL to format a property value in some way, for example.
229      *
230      * @return the forced value
231      */
232     String getForcedValue();
233 
234     /**
235      * @see org.kuali.rice.krad.uif.field.DataField#setForcedValue(String)
236      */
237     void setForcedValue(String forcedValue);
238 
239     /**
240      * Summary help text for the field
241      *
242      * @return summary help text
243      */
244     String getHelpSummary();
245 
246     /**
247      * Setter for the summary help text
248      *
249      * @param helpSummary
250      */
251     void setHelpSummary(String helpSummary);
252 
253     /**
254      * Data Field Security object that indicates what authorization (permissions) exist for the field
255      *
256      * @return DataFieldSecurity instance
257      */
258     DataFieldSecurity getDataFieldSecurity();
259 
260     /**
261      * Override to assert a {@link DataFieldSecurity} instance is set
262      *
263      * @param componentSecurity instance of DataFieldSecurity
264      */
265     void setComponentSecurity(ComponentSecurity componentSecurity);
266 
267     /**
268      * Indicates the field should be read-only but also a hidden should be generated for the field
269      *
270      * <p>
271      * Useful for when a value is just displayed but is needed by script
272      * </p>
273      *
274      * @return true if field should be readOnly hidden, false if not
275      */
276     boolean isAddHiddenWhenReadOnly();
277 
278     /**
279      * Setter for the read-only hidden indicator
280      *
281      * @param addHiddenWhenReadOnly
282      */
283     void setAddHiddenWhenReadOnly(boolean addHiddenWhenReadOnly);
284 
285     /**
286      * Inquiry widget for the field
287      *
288      * <p>
289      * The inquiry widget will render a link for the field value when read-only
290      * that points to the associated inquiry view for the field. The inquiry can
291      * be configured to point to a certain <code>InquiryView</code>, or the
292      * framework will attempt to associate the field with a inquiry based on its
293      * metadata (in particular its relationships in the model)
294      * </p>
295      *
296      * @return Inquiry field inquiry
297      */
298     Inquiry getInquiry();
299 
300     /**
301      * Setter for the inquiry widget
302      *
303      * @param inquiry
304      */
305     void setInquiry(Inquiry inquiry);
306 
307     /**
308      * Indicates whether inquiries should be automatically set when a relationship for the field's property
309      * is found
310      *
311      * <p>
312      * Note this only applies when the {@link #getInquiry()} widget has not been configured (is null)
313      * and is set to true by default
314      * </p>
315      *
316      * @return true if auto inquiries are enabled, false if not
317      */
318     boolean isEnableAutoInquiry();
319 
320     /**
321      * Setter for enabling automatic inquiries
322      *
323      * @param enableAutoInquiry
324      */
325     void setEnableAutoInquiry(boolean enableAutoInquiry);
326 
327     /**
328      * When true, render the info message span which contains can contain additional information
329      * about the field (used by Field Query functionality)
330      *
331      * @return true if the span will be rendered, false otherwise
332      */
333     boolean isRenderInfoMessageSpan();
334 
335     /**
336      * @see org.kuali.rice.krad.uif.field.DataField#isRenderInfoMessageSpan()
337      * @param renderInfoMessageSpan
338      */
339     void setRenderInfoMessageSpan(boolean renderInfoMessageSpan);
340 
341     /**
342      * When true, render the marker icon span to show icons related to the field (used by CompareFieldCreateModifier on
343      * maintenance documetnts to mark editted fields)
344      *
345      * @return true if the the marker icon span will be rendered, false otherwise
346      */
347     boolean isRenderMarkerIconSpan();
348 
349     /**
350      * @see org.kuali.rice.krad.uif.field.DataField#isRenderMarkerIconSpan()
351      * @param renderMarkerIconSpan
352      */
353     void setRenderMarkerIconSpan(boolean renderMarkerIconSpan);
354 
355     /**
356      * Additional display attribute name, which will be displayed next to the actual field value
357      * when the field is readonly with hyphen in between like PropertyValue - AdditionalPropertyValue
358      *
359      * @param readOnlyDisplaySuffixPropertyName name of the additional display property
360      */
361     void setReadOnlyDisplaySuffixPropertyName(String readOnlyDisplaySuffixPropertyName);
362 
363     /**
364      * Returns the additional display attribute name to be displayed when the field is readonly
365      *
366      * @return additional display attribute name
367      */
368     String getReadOnlyDisplaySuffixPropertyName();
369 
370     /**
371      * Sets the alternate display attribute name to be displayed when the field is readonly.
372      * This properties value will be displayed instead of actual fields value when the field is readonly.
373      *
374      * @param readOnlyDisplayReplacementPropertyName alternate display property name
375      */
376     void setReadOnlyDisplayReplacementPropertyName(String readOnlyDisplayReplacementPropertyName);
377 
378     /**
379      * Returns the alternate display attribute name to be displayed when the field is readonly.
380      *
381      * @return alternate Display Property Name
382      */
383     String getReadOnlyDisplayReplacementPropertyName();
384 
385     /**
386      * Returns the alternate display value
387      *
388      * @return the alternate display value set for this field
389      */
390     String getReadOnlyDisplayReplacement();
391 
392     /**
393      * Setter for the alternative display value
394      *
395      * @param value
396      */
397     void setReadOnlyDisplayReplacement(String value);
398 
399     /**
400      * Returns the additional display value.
401      *
402      * @return the additional display value set for this field
403      */
404     String getReadOnlyDisplaySuffix();
405 
406     /**
407      * Setter for the additional display value
408      *
409      * @param value
410      */
411     void setReadOnlyDisplaySuffix(String value);
412 
413     /**
414      * Gets the readOnlyListDisplayType.
415      *
416      * <p>When this is not set, the list will default to the delimited list display with a default of comma and space
417      * (", ") - if readOnlyListDelimiter is not set as well.  The type can be set as the following:
418      * <ul>
419      * <li>"DELIMITED" - list will be output with delimiters between each item defined by readOnlyListDelimiter</li>
420      * <li>"BREAK" - list will be output with breaks between each item</li>
421      * <li>"OL" - list will be output in ordered list format (numbered)</li>
422      * <li>"UL" - list will be output in unordered list format (bulleted)</li>
423      * </ul>
424      * </p>
425      *
426      * @return the display type to use
427      */
428     String getReadOnlyListDisplayType();
429 
430     /**
431      * Set the readOnlyListDisplayType
432      *
433      * @param readOnlyListDisplayType
434      */
435     void setReadOnlyListDisplayType(String readOnlyListDisplayType);
436 
437     /**
438      * The readOnlyListDelimiter is used to set the delimiter used when "DELIMITED" type is set for
439      * readOnlyListDisplayType
440      *
441      * @return the delimiter to use in readOnly list output with "DELIMITED" type set
442      */
443     String getReadOnlyListDelimiter();
444 
445     /**
446      * Set the readOnlyListDelimiter
447      *
448      * @param readOnlyListDelimiter
449      */
450     void setReadOnlyListDelimiter(String readOnlyListDelimiter);
451 
452     /**
453      * Indicates whether the value for the field should be masked (or partially masked) on display
454      *
455      * <p>
456      * If set to true, the field value will be masked by applying the configured {@link #getMaskFormatter()}
457      * </p>
458      *
459      * <p>
460      * If a KIM permission exists that should be checked to determine whether the value should be masked or not,
461      * this value should not be set but instead the mask or partialMask property on {@link #getComponentSecurity()}
462      * should be set to true. This indicates there is a mask permission that should be consulted. If the user
463      * does not have the permission, this flag will be set to true by the framework and the value masked using
464      * the mask formatter configured on the security object
465      * </p>
466      *
467      * @return true if the field value should be masked, false if not
468      */
469     boolean isApplyMask();
470 
471     /**
472      * Setter for the apply value mask flag
473      *
474      * @param applyMask
475      */
476     void setApplyMask(boolean applyMask);
477 
478     /**
479      * MaskFormatter instance that will be used to mask the field value when {@link #isApplyMask()} is true
480      *
481      * <p>
482      * Note in cases where the mask is applied due to security (KIM permissions), the mask or partial mask formatter
483      * configured on {@link #getComponentSecurity()} will be used instead of this mask formatter
484      * </p>
485      *
486      * @return MaskFormatter instance
487      */
488     MaskFormatter getMaskFormatter();
489 
490     /**
491      * Setter for the MaskFormatter instance to apply when the value is masked
492      *
493      * @param maskFormatter
494      */
495     void setMaskFormatter(MaskFormatter maskFormatter);
496 
497     /**
498      * Allows specifying hidden property names without having to specify as a
499      * field in the group config (that might impact layout)
500      *
501      * @return hidden property names
502      */
503     List<String> getAdditionalHiddenPropertyNames();
504 
505     /**
506      * Setter for the hidden property names
507      *
508      * @param additionalHiddenPropertyNames
509      */
510     void setAdditionalHiddenPropertyNames(List<String> additionalHiddenPropertyNames);
511 
512     /**
513      * List of property names whose values should be displayed read-only under this field
514      *
515      * <p>
516      * In the attribute field template for each information property name given its values is
517      * outputted read-only. Informational property values can also be updated dynamically with
518      * the use of field attribute query
519      * </p>
520      *
521      * <p>
522      * Simple property names can be given if the property has the same binding parent as this
523      * field, in which case the binding path will be adjusted by the framework. If the property
524      * names starts with org.kuali.rice.krad.uif.UifConstants#NO_BIND_ADJUST_PREFIX, no binding
525      * prefix will be added.
526      * </p>
527      *
528      * @return informational property names
529      */
530     List<String> getPropertyNamesForAdditionalDisplay();
531 
532     /**
533      * Setter for the list of informational property names
534      *
535      * @param propertyNamesForAdditionalDisplay
536      */
537     void setPropertyNamesForAdditionalDisplay(List<String> propertyNamesForAdditionalDisplay);
538 
539     /**
540      * Sets HTML escaping for this property value. HTML escaping will be handled in alternate and additional fields
541      * also.
542      */
543     void setEscapeHtmlInPropertyValue(boolean escapeHtmlInPropertyValue);
544 
545     /**
546      * Returns true if HTML escape allowed for this field
547      *
548      * @return true if escaping allowed
549      */
550     boolean isEscapeHtmlInPropertyValue();
551 
552     /**
553      * Returns true if this field is of type {@code TextAreaControl}.
554      *
555      * <p>
556      * Used to preserve text formatting in a textarea when the view
557      * is readOnly by enclosing the text in a </pre> tag.
558      * </p>
559      *
560      * @return true if the field is of type {@code TextAreaControl}
561      */
562     boolean isMultiLineReadOnlyDisplay();
563 
564     /**
565      * Setter for multiLineReadOnlyDisplay
566      *
567      * @param multiLineReadOnlyDisplay
568      */
569     void setMultiLineReadOnlyDisplay(boolean multiLineReadOnlyDisplay);
570 
571     /**
572      * Indicates whether the value for the field is secure.
573      *
574      * <p>
575      * A value will be secured if masking has been applied (by configuration or a failed KIM permission) or the field
576      * has been marked as hidden due to a required KIM permission check failing.
577      * </p>
578      *
579      * @return true if value is secure, false if not
580      */
581     boolean hasSecureValue();
582 
583     boolean isRenderFieldset();
584 
585     /**
586      * Sets the sort type if this field is used within a collection
587      *
588      * <p>
589      * The default sort type is the Java class of the
590      * property being referenced. Since a String property may actually contain numeric or date values only this property
591      * can be used to better set the sort type.
592      * </p>
593      *
594      * @return string representation of the sort type
595      */
596     public String getSortAs();
597 
598     public void setSortAs(String sortAs);
599 
600     /**
601      * @see org.kuali.rice.krad.uif.component.Component#completeValidation
602      */
603     void completeValidation(ValidationTrace tracer);
604 
605 }