View Javadoc

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.component;
17  
18  import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBean;
19  import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
20  import org.kuali.rice.krad.uif.modifier.ComponentModifier;
21  import org.kuali.rice.krad.uif.view.View;
22  import org.kuali.rice.krad.uif.widget.Tooltip;
23  
24  import java.io.Serializable;
25  import java.util.List;
26  import java.util.Map;
27  
28  /**
29   * Component defines basic properties and methods that all rendering element implement
30   *
31   * <p>
32   * All classes of the UIF that are used as a rendering element implement the
33   * component interface. All components within the framework have the
34   * following structure:
35   * <ul>
36   * <li>Dictionary Configuration/Composition</li>
37   * <li>Java Class (the Component implementation</li>
38   * <li>>JSP Template Renderer</li>
39   * </ul>
40   * </p>
41   * <p>
42   * There are three basic types of components:
43   * <ul>
44   * <li>Container Components: {@code View}, {@code Group}</li>
45   * <li>Field Components: {@code Field}</li>
46   * <li>Widget Components: {@code Widget}</li>
47   * </ul>
48   * </p>
49   *
50   * @author Kuali Rice Team (rice.collab@kuali.org)
51   * @see org.kuali.rice.krad.uif.container.Container
52   * @see org.kuali.rice.krad.uif.field.Field
53   * @see org.kuali.rice.krad.uif.widget.Widget
54   */
55  public interface Component extends UifDictionaryBean, Serializable, Ordered, ScriptEventSupport {
56  
57      /**
58       * The unique id (within a given tree) for the component
59       *
60       * <p>
61       * The id will be used by renderers to set the HTML element id. This gives a way to find various elements
62       * for scripting. If the id is not given, a default will be generated by the framework
63       * </p>
64       *
65       * @return String id
66       */
67      String getId();
68  
69      /**
70       * Setter for the unique id (within a given tree) for the component
71       *
72       * @param id - string to set as the component id
73       */
74      void setId(String id);
75  
76      /**
77       * Holds the id for the component that can be used to request new instances of that component from the
78       * {@link org.kuali.rice.krad.uif.util.ComponentFactory}
79       *
80       * <p>
81       * During component refreshes the component is reinitialized and the lifecycle is performed again to
82       * reflect the component state based on the latest updates (data, other component state). Since the lifecycle
83       * is only performed on the component, a new instance with configured initial state needs to be retrieved. Some
84       * component instances, such as those that are nested or created in code, cannot be obtained from the spring
85       * factory. For those the initial state is captured during the perform initialize phase and the factory id
86       * generated for referencing retrieving that configuration during a refresh
87       * </p>
88       *
89       * @return String bean id for component
90       */
91      String getBaseId();
92  
93      /**
94       * Setter for the base id that backs the component instance
95       *
96       * @param baseId
97       */
98      void setBaseId(String baseId);
99  
100     /**
101      * The name for the component type
102      *
103      * <p>
104      * This is used within the rendering layer to pass the component instance into the template. The component instance
105      * is exported under the name given by this method.
106      * </p>
107      *
108      * @return String type name
109      */
110     String getComponentTypeName();
111 
112     /**
113      * The path to the JSP file that should be called to render the component
114      *
115      * <p>
116      * The path should be relative to the web root. An attribute will be available to the component to use under the
117      * name given by the method {@code getComponentTypeName}. Based on the component type, additional attributes could
118      * be available for use. See the component documentation for more information on such attributes.
119      * </p>
120      *
121      * <p>
122      * e.g. '/krad/WEB-INF/jsp/tiles/component.jsp'
123      * </p>
124      *
125      * @return String representing the template path
126      */
127     String getTemplate();
128 
129     /**
130      * Setter for the components template
131      *
132      * @param template
133      */
134     void setTemplate(String template);
135 
136     /**
137      * The component title
138      *
139      * <p>
140      * Depending on the component can be used in various ways. For example with a Container component the title is
141      * used to set the header text. For components like controls other other components that render an HTML element it
142      * is used to set the HTML title attribute.
143      * </p>
144      *
145      * @return String title for component
146      */
147     String getTitle();
148 
149     /**
150      * Setter for the component's title
151      *
152      * @param title
153      */
154     void setTitle(String title);
155 
156     /**
157      * Initializes the component
158      *
159      * <p>
160      * Where components can set defaults and setup other necessary state. The initialize method should only be called
161      * once per component lifecycle and is invoked within the initialize phase of the view lifecylce.
162      * </p>
163      *
164      * @param view - view instance in which the component belongs
165      * @param model - object instance containing the view data
166      * @see org.kuali.rice.krad.uif.service.ViewHelperService#performInitialization(org.kuali.rice.krad.uif.view.View,
167      *      Object)
168      */
169     void performInitialization(View view, Object model);
170 
171     /**
172      * Called after the initialize phase to perform conditional logic based on the model data
173      *
174      * <p>
175      * Where components can perform conditional logic such as dynamically generating new fields or setting field state
176      * based on the given data
177      * </p>
178      *
179      * @param view - view instance to which the component belongs
180      * @param model - Top level object containing the data (could be the form or a
181      * top level business object, dto)
182      */
183     void performApplyModel(View view, Object model, Component parent);
184 
185     /**
186      * The last phase before the view is rendered
187      *
188      * <p>
189      * Here final preparations can be made based on the updated view state.
190      * </p>
191      *
192      * @param view - view instance that should be finalized for rendering
193      * @param model - top level object containing the data
194      * @param parent - parent component
195      */
196     void performFinalize(View view, Object model, Component parent);
197 
198     /**
199      * List of components that are contained within the component and should be sent through
200      * the lifecycle
201      *
202      * <p>
203      * Used by {@code ViewHelperService} for the various lifecycle callbacks
204      * </p>
205      *
206      * @return List<Component> child components
207      */
208     List<Component> getComponentsForLifecycle();
209 
210     /**
211      * List of components that are maintained by the component as prototypes for creating other component instances
212      *
213      * <p>
214      * Prototypes are held for configuring how a component should be created during the lifecycle. An example of this
215      * are the fields in a collection group that are created for each collection record. They only participate in the
216      * initialize phase.
217      * </p>
218      *
219      * @return List<Component> child component prototypes
220      */
221     List<Component> getComponentPrototypes();
222 
223     /**
224      * List of components that are contained within the List of {@code PropertyReplacer} in component
225      *
226      * <p>
227      * Used to get all the nested components in the property replacers.
228      * </p>
229      *
230      * @return List<Component> {@code PropertyReplacer} child components
231      */
232     List<Component> getPropertyReplacerComponents();
233 
234     /**
235      * {@code ComponentModifier} instances that should be invoked to
236      * initialize the component
237      *
238      * <p>
239      * These provide dynamic initialization behavior for the component and are
240      * configured through the components definition. Each initializer will get
241      * invoked by the initialize method.
242      * </p>
243      *
244      * @return List of component modifiers
245      * @see org.kuali.rice.krad.uif.service.ViewHelperService#performInitialization(org.kuali.rice.krad.uif.view.View,
246      *      Object)
247      */
248     List<ComponentModifier> getComponentModifiers();
249 
250     /**
251      * Setter for the components List of {@code ComponentModifier}
252      * instances
253      *
254      * @param componentModifiers
255      */
256     void setComponentModifiers(List<ComponentModifier> componentModifiers);
257 
258     /**
259      * Indicates whether the component should be rendered in the UI
260      *
261      * <p>
262      * If set to false, the corresponding component template will not be invoked
263      * (therefore nothing will be rendered to the UI).
264      * </p>
265      *
266      * @return boolean true if the component should be rendered, false if it
267      *         should not be
268      */
269     boolean isRender();
270 
271     /**
272      * Setter for the components render indicator
273      *
274      * @param render
275      */
276     void setRender(boolean render);
277 
278     /**
279      * Indicates whether the component should be hidden in the UI
280      *
281      * <p>
282      * How the hidden data is maintained depends on the views persistence mode.
283      * If the mode is request, the corresponding data will be rendered to the UI
284      * but not visible. If the mode is session, the data will not be rendered to
285      * the UI but maintained server side.
286      * </p>
287      *
288      * <p>
289      * For a {@code Container} component, the hidden setting will apply to
290      * all contained components (making a section hidden makes all fields within
291      * the section hidden)
292      * </p>
293      *
294      * @return boolean true if the component should be hidden, false if it
295      *         should be visible
296      */
297     boolean isHidden();
298 
299     /**
300      * Setter for the hidden indicator
301      *
302      * @param hidden
303      */
304     void setHidden(boolean hidden);
305 
306     /**
307      * Indicates whether the component can be edited
308      *
309      * <p>
310      * When readOnly the controls and widgets of {@code Field} components
311      * will not be rendered. If the Field has an underlying value it will be
312      * displayed readOnly to the user.
313      * </p>
314      *
315      * <p>
316      * For a {@code Container} component, the readOnly setting will apply
317      * to all contained components (making a section readOnly makes all fields
318      * within the section readOnly).
319      * </p>
320      *
321      * @return boolean true if the component should be readOnly, false if is
322      *         allows editing
323      */
324     boolean isReadOnly();
325 
326     /**
327      * Setter for the read only indicator
328      *
329      * @param readOnly
330      */
331     void setReadOnly(boolean readOnly);
332 
333     /**
334      * Indicates whether the component is required
335      *
336      * <p>
337      * At the general component level required means there is some action the
338      * user needs to take within the component. For example, within a section it
339      * might mean the fields within the section should be completed. At a field
340      * level, it means the field should be completed. This provides the ability
341      * for the renderers to indicate the required action.
342      * </p>
343      *
344      * @return boolean true if the component is required, false if it is not
345      *         required
346      */
347     Boolean getRequired();
348 
349     /**
350      * Setter for the required indicator
351      *
352      * @param required
353      */
354     void setRequired(Boolean required);
355 
356     /**
357      * Horizontal alignment of the component within its container
358      *
359      * <p>
360      * All components belong to a <code>Container</code> and are placed using a
361      * <code>LayoutManager</code>. This property specifies how the component
362      * should be aligned horizontally within the container. During the finalize
363      * phase the CSS text-align style will be created for the align setting.
364      * </p>
365      *
366      * @return String horizontal align
367      * @see org.kuali.rice.krad.uif.CssConstants.TextAligns
368      */
369     public String getAlign();
370 
371     /**
372      * Sets the components horizontal alignment
373      *
374      * @param align
375      */
376     public void setAlign(String align);
377 
378     /**
379      * Vertical alignment of the component within its container
380      *
381      * <p>
382      * All components belong to a <code>Container</code> and are placed using a
383      * <code>LayoutManager</code>. This property specifies how the component
384      * should be aligned vertically within the container. During the finalize
385      * phase the CSS vertical-align style will be created for the valign
386      * setting.
387      * </p>
388      *
389      * @return String vertical align
390      * @see org.kuali.rice.krad.uif.CssConstants.VerticalAligns
391      */
392     public String getValign();
393 
394     /**
395      * Setter for the component's vertical align
396      *
397      * @param valign
398      */
399     public void setValign(String valign);
400 
401     /**
402      * Width the component should take up in the container
403      *
404      * <p>
405      * All components belong to a <code>Container</code> and are placed using a
406      * <code>LayoutManager</code>. This property specifies a width the component
407      * should take up in the Container. This is not applicable for all layout
408      * managers. During the finalize phase the CSS width style will be created
409      * for the width setting.
410      * </p>
411      *
412      * <p>
413      * e.g. '30%', '55px'
414      * </p>
415      *
416      * @return String width string
417      */
418     public String getWidth();
419 
420     /**
421      * Setter for the components width
422      *
423      * @param width
424      */
425     public void setWidth(String width);
426 
427     /**
428      * CSS style string to be applied to the component
429      *
430      * <p>
431      * Any style override or additions can be specified with this attribute.
432      * This is used by the renderer to set the style attribute on the
433      * corresponding element.
434      * </p>
435      *
436      * <p>
437      * e.g. 'color: #000000;text-decoration: underline;'
438      * </p>
439      *
440      * @return String css style string
441      */
442     String getStyle();
443 
444     /**
445      * Setter for the components style
446      *
447      * @param style
448      */
449     void setStyle(String style);
450 
451     /**
452      * CSS style class(s) to be applied to the component
453      *
454      * <p>
455      * Declares style classes for the component. Multiple classes are specified
456      * with a space delimiter. This is used by the renderer to set the class
457      * attribute on the corresponding element. The class(s) declared must be
458      * available in the common style sheets or the style sheets specified for
459      * the view
460      * </p>
461      *
462      * @return List<String> css style classes to appear on the 'class' attribute
463      */
464     List<String> getCssClasses();
465 
466     /**
467      * Setter for the components style classes
468      *
469      * @param styleClasses
470      */
471     void setCssClasses(List<String> styleClasses);
472 
473     /**
474      * Adds a single style to the list of styles on this component
475      *
476      * @param styleClass
477      */
478     void addStyleClass(String styleClass);
479 
480     /**
481      * Appends to the inline style set on a component
482      *
483      * @param itemStyle
484      */
485     void appendToStyle(String itemStyle);
486 
487     /**
488      * Number of places the component should take up horizontally in the
489      * container
490      *
491      * <p>
492      * All components belong to a {@code Container} and are placed using a
493      * {@code LayoutManager}. This property specifies how many places
494      * horizontally the component should take up within the container. This is
495      * only applicable for table based layout managers. Default is 1
496      * </p>
497      *
498      * TODO: this should not be on component interface since it only applies if
499      * the layout manager supports it, need some sort of layoutOptions map for
500      * field level options that depend on the manager
501      *
502      * @return int number of columns to span
503      */
504     int getColSpan();
505 
506     /**
507      * Setter for the components column span
508      *
509      * @param colSpan
510      */
511     void setColSpan(int colSpan);
512 
513     /**
514      * Number of places the component should take up vertically in the container
515      *
516      * <p>
517      * All components belong to a {@code Container} and are placed using a
518      * {@code LayoutManager}. This property specifies how many places
519      * vertically the component should take up within the container. This is
520      * only applicable for table based layout managers. Default is 1
521      * </p>
522      *
523      * TODO: this should not be on component interface since it only applies if
524      * the layout manager supports it, need some sort of layoutOptions map for
525      * field level options that depend on the manager
526      *
527      * @return int number of rows to span
528      */
529     int getRowSpan();
530 
531     /**
532      * Setter for the component row span
533      *
534      * @param rowSpan
535      */
536     void setRowSpan(int rowSpan);
537 
538     /**
539      * The cellCssClasses property defines the classes that will be placed on the corresponding td (or th) elements
540      * relating to this component when used in a table backed layout.  This property has no effect on other layouts.
541      *
542      * @return the css classes to apply to the wrapping td (or th) element for this component
543      */
544     public List<String> getCellCssClasses();
545 
546     /**
547      * Set the cellCssClasses property which defines the classes that will be placed on the corresponding td (or th)
548      * relating to this component when used in a table backed layout.  This property has no effect on other layouts.
549      *
550      * @param cellCssClasses
551      */
552     public void setCellCssClasses(List<String> cellCssClasses);
553 
554     /**
555      * Add a cell css class to the cell classes list
556      *
557      * @param cssClass the name of the class to add
558      */
559     public void addCellCssClass(String cssClass);
560 
561     /**
562      * CSS style string to be applied to the cell containing the component (only applies within
563      * table based layouts)
564      *
565      * <p>
566      * e.g. 'align: right;'
567      * </p>
568      *
569      * @return String css style string
570      */
571     public String getCellStyle();
572 
573     /**
574      * Setter for the cell style attribute
575      *
576      * @param cellStyle
577      */
578     public void setCellStyle(String cellStyle);
579 
580     /**
581      * Width setting for the cell containing the component (only applies within table based
582      * layouts)
583      *
584      * @return String width ('25%', '155px')
585      */
586     public String getCellWidth();
587 
588     /**
589      * Setter for the containing cell width
590      *
591      * @param cellWidth
592      */
593     public void setCellWidth(String cellWidth);
594 
595     /**
596      * Context map for the component
597      *
598      * <p>
599      * Any el statements configured for the components properties (e.g.
600      * title="@{foo.property}") are evaluated using the el context map. This map
601      * will get populated with default objects like the model, view, and request
602      * from the {@code ViewHelperService}. Other components can push
603      * further objects into the context so that they are available for use with
604      * that component. For example, {@code Field} instances that are part
605      * of a collection line as receive the current line instance
606      * </p>
607      *
608      * <p>
609      * Context map also provides objects to methods that are invoked for
610      * {@code GeneratedField} instances
611      * </p>
612      *
613      * <p>
614      * The Map key gives the name of the variable that can be used within
615      * expressions, and the Map value gives the object instance for which
616      * expressions containing the variable should evaluate against
617      * </p>
618      *
619      * <p>
620      * NOTE: Calling getContext().putAll() will skip updating any configured property replacers for the
621      * component. Instead you should call #pushAllToContext
622      * </p>
623      *
624      * @return Map<String, Object> context
625      */
626     Map<String, Object> getContext();
627 
628     /**
629      * Setter for the context Map
630      *
631      * @param context
632      */
633     void setContext(Map<String, Object> context);
634 
635     /**
636      * Places the given object into the context Map for the component with the
637      * given name
638      *
639      * <p>
640      * Note this also will push context to property replacers configured on the component.
641      * To place multiple objects in the context, you should use #pushAllToContext since that
642      * will call this method for each and update property replacers. Using {@link #getContext().putAll()}
643      * will bypass property replacers.
644      * </p>
645      *
646      * @param objectName - name the object should be exposed under in the context map
647      * @param object - object instance to place into context
648      */
649     void pushObjectToContext(String objectName, Object object);
650 
651     /**
652      * Places each entry of the given Map into the context for the component
653      *
654      * <p>
655      * Note this will call #pushObjectToContext for each entry which will update any configured property
656      * replacers as well. This should be used in place of getContext().putAll()
657      * </p>
658      *
659      * @param objects - Map<String, Object> objects to add to context, where the entry key will be the context key
660      * and the entry value will be the context value
661      */
662     void pushAllToContext(Map<String, Object> objects);
663 
664     /**
665      * gets a list of {@code PropertyReplacer} instances
666      *
667      * <p>They will be evaluated
668      * during the view lifecycle to conditionally set properties on the
669      * {@code Component} based on expression evaluations</p>
670      *
671      * @return List<PropertyReplacer> replacers to evaluate
672      */
673     List<PropertyReplacer> getPropertyReplacers();
674 
675     /**
676      * Setter for the components property substitutions
677      *
678      * @param propertyReplacers
679      */
680     void setPropertyReplacers(List<PropertyReplacer> propertyReplacers);
681 
682     /**
683      * The options that are passed through to the Component renderer
684      *
685      * <p>
686      * The Map key is the option name, with the Map value as the option value. See
687      * documentation on the particular widget render for available options.
688      * </p>
689      *
690      * @return Map<String, String> options
691      */
692     Map<String, String> getTemplateOptions();
693 
694     /**
695      * Setter for the template's options
696      *
697      * @param templateOptions
698      */
699     void setTemplateOptions(Map<String, String> templateOptions);
700 
701     /**
702      * Builds a string from the underlying <code>Map</code> of template options that will export that options as a
703      * JavaScript Map for use in js and jQuery plugins
704      *
705      * <p>
706      * See documentation on the particular component render for available options.
707      * </p>
708      *
709      * @return String options
710      */
711     String getTemplateOptionsJSString();
712 
713     /**
714      * Setter for the template's options
715      *
716      * @param templateOptionsJSString
717      */
718     void setTemplateOptionsJSString(String templateOptionsJSString);
719 
720     /**
721      * Order of a component within a List of other components
722      *
723      * <p>Lower numbers are placed higher up in the list, while higher numbers are placed
724      * lower in the list</p>
725      *
726      * @return int ordering number
727      * @see org.springframework.core.Ordered#getOrder()
728      */
729     int getOrder();
730 
731     /**
732      * Setter for the component's order
733      *
734      * @param order
735      */
736     void setOrder(int order);
737 
738     /**
739      * The Tooltip widget that renders a tooltip with additional information about the element on
740      * specified trigger event
741      *
742      * @return Tooltip
743      */
744     Tooltip getToolTip();
745 
746     /**
747      * Setter for the component tooltip widget instance
748      *
749      * @param toolTip
750      */
751     void setToolTip(Tooltip toolTip);
752 
753     /**
754      * The name of the method that should be invoked for finalizing the component
755      * configuration (full method name, without parameters or return type)
756      *
757      * <p>
758      * Note the method can also be set with the finalizeMethodInvoker
759      * targetMethod property. If the method is on the configured
760      * {@code ViewHelperService}, only this property needs to be configured
761      * </p>
762      *
763      * <p>
764      * The model backing the view will be passed as the first argument method and then
765      * the {@code Component} instance as the second argument. If any additional method
766      * arguments are declared with the finalizeMethodAdditionalArguments, they will then
767      * be passed in the order declared in the list
768      * </p>
769      *
770      * <p>
771      * If the component is selfRendered, the finalize method can return a string which
772      * will be set as the component's renderOutput. The selfRendered indicator will also
773      * be set to true on the component.
774      * </p>
775      *
776      * @return String method name
777      */
778     String getFinalizeMethodToCall();
779 
780     /**
781      * The List of Object instances that should be passed as arguments to the finalize method
782      *
783      * <p>
784      * These arguments are passed to the finalize method after the standard model and component
785      * arguments. They are passed in the order declared in the list
786      * </p>
787      *
788      * @return List<Object> additional method arguments
789      */
790     List<Object> getFinalizeMethodAdditionalArguments();
791 
792     /**
793      * {@code MethodInvokerConfig} instance for the method that should be invoked
794      * for finalizing the component configuration
795      *
796      * <p>
797      * MethodInvoker can be configured to specify the class or object the method
798      * should be called on. For static method invocations, the targetClass
799      * property can be configured. For object invocations, that targetObject
800      * property can be configured
801      * </p>
802      *
803      * <p>
804      * If the component is selfRendered, the finalize method can return a string which
805      * will be set as the component's renderOutput. The selfRendered indicator will also
806      * be set to true on the component.
807      * </p>
808      *
809      * @return MethodInvokerConfig instance
810      */
811     MethodInvokerConfig getFinalizeMethodInvoker();
812 
813     /**
814      * Indicates whether the component contains its own render output (through
815      * the renderOutput property)
816      *
817      * <p>
818      * If self rendered is true, the corresponding template for the component
819      * will not be invoked and the renderOutput String will be written to the
820      * response as is.
821      * </p>
822      *
823      * @return boolean true if component is self rendered, false if not (renders
824      *         through template)
825      */
826     boolean isSelfRendered();
827 
828     /**
829      * Setter for the self render indicator
830      *
831      * @param selfRendered
832      */
833     void setSelfRendered(boolean selfRendered);
834 
835     /**
836      * Rendering output for the component that will be sent as part of the
837      * response (can contain static text and HTML)
838      *
839      * @return String render output
840      */
841     String getRenderedHtmlOutput();
842 
843     /**
844      * Setter for the component's render output
845      *
846      * @param renderOutput
847      */
848     void setRenderedHtmlOutput(String renderOutput);
849 
850     /**
851      * Disables the storage of the component in session (when the framework determines it needs to be due to a
852      * refresh condition)
853      *
854      * <p>
855      * When the framework determines there is a condition on the component that requires it to keep around between
856      * posts, it will store the component instance in session. This flag can be set to disable this behavior (which
857      * would require custom application logic to support behavior such as refresh)
858      * </p>
859      *
860      * @return boolean true if the component should not be stored in session, false if session storage is allowed
861      */
862     boolean isDisableSessionPersistence();
863 
864     /**
865      * Setter for disabling storage of the component in session
866      *
867      * @param disableSessionPersistence
868      */
869     void setDisableSessionPersistence(boolean disableSessionPersistence);
870 
871     /**
872      * Indicates whether the component should be stored with the session view regardless of configuration
873      *
874      * <p>
875      * By default the framework nulls out any components that do not have a refresh condition or are needed for
876      * collection processing. This can be a problem if custom application code is written to refresh a component
877      * without setting the corresponding component flag. In this case this property can be set to true to force the
878      * framework to keep the component in session. Defaults to false
879      * </p>
880      *
881      * @return boolean true if the component should be stored in session, false if not
882      */
883     boolean isForceSessionPersistence();
884 
885     /**
886      * Setter for the indicator to force persistence of the component in session
887      *
888      * @param persistInSession
889      */
890     void setForceSessionPersistence(boolean persistInSession);
891 
892     /**
893      * Security object that indicates what authorization (permissions) exist for the component
894      *
895      * @return ComponentSecurity instance
896      */
897     ComponentSecurity getComponentSecurity();
898 
899     /**
900      * Setter for the components security object
901      *
902      * @param componentSecurity
903      */
904     void setComponentSecurity(ComponentSecurity componentSecurity);
905 
906     /**
907      * Spring EL expression, which when evaluates to true, makes this component visible
908      *
909      * @return the SpEl expression string
910      */
911     String getProgressiveRender();
912 
913     /**
914      * Setter for progressiveRender Spring EL expression
915      *
916      * @param progressiveRender the progressiveRender to set
917      */
918     void setProgressiveRender(String progressiveRender);
919 
920     /**
921      * Spring EL expression, which when evaluates to true, causes this component to be refreshed
922      *
923      * @return the SpEl expression string
924      */
925     String getConditionalRefresh();
926 
927     /**
928      * Setter for conditionalRefresh Spring EL expression
929      *
930      * @param conditionalRefresh the conditionalRefresh to set
931      */
932     void setConditionalRefresh(String conditionalRefresh);
933 
934     /**
935      * List of control names (ids) extracted from {@link #getProgressiveRender()}
936      *
937      * @return the list of control names
938      */
939     List<String> getProgressiveDisclosureControlNames();
940 
941     /**
942      * A JavaScript expression constructed from {@link #getConditionalRefresh()}
943      *
944      * <p>The script can be executed on the client to determine if the original exp was satisfied before
945      * interacting with the server.</p>
946      *
947      * @return the JS script
948      */
949     String getProgressiveDisclosureConditionJs();
950 
951     /**
952      * A JavaScript expression constructed from {@link #getProgressiveRender()}
953      *
954      * <p>The script can be executed on the client to determine if the original exp was satisfied before
955      * interacting with the server.</p>
956      *
957      * @return the JS script
958      */
959     String getConditionalRefreshConditionJs();
960 
961     /**
962      * The list of control names (ids) extracted from {@link #getConditionalRefresh()}
963      *
964      * @return the list of control names
965      */
966     List<String> getConditionalRefreshControlNames();
967 
968     /**
969      * Indicates whether the component will be stored on the client, but hidden, after the first retrieval
970      *
971      * <p>
972      * The component will not be rendered hidden after first retrieval if this flag is set to true. The component will
973      * then be fetched via an ajax call when it should be rendered.
974      * </p>
975      *
976      * @return the progressiveRenderViaAJAX
977      */
978     boolean isProgressiveRenderViaAJAX();
979 
980     /**
981      * Setter for the progressiveRenderViaAJAX flag
982      *
983      * @param progressiveRenderViaAJAX the progressiveRenderViaAJAX to set
984      */
985     void setProgressiveRenderViaAJAX(boolean progressiveRenderViaAJAX);
986 
987     /**
988      * Determines whether the component will always be retrieved from the server and shown
989      *
990      * <p>
991      * If true, when the progressiveRender condition is satisfied, the component
992      * will always be retrieved from the server and shown(as opposed to being
993      * stored on the client, but hidden, after the first retrieval as is the
994      * case with the progressiveRenderViaAJAX option). <b>By default, this is
995      * false, so components with progressive render capabilities will always be
996      * already within the client html and toggled to be hidden or visible.</b> </p>
997      *
998      * @return the progressiveRenderAndRefresh
999      */
1000     boolean isProgressiveRenderAndRefresh();
1001 
1002     /**
1003      * Setter for the progressiveRenderAndRefresh flag
1004      *
1005      * @param progressiveRenderAndRefresh the progressiveRenderAndRefresh to set
1006      */
1007     void setProgressiveRenderAndRefresh(boolean progressiveRenderAndRefresh);
1008 
1009     /**
1010      * Specifies a property by name that when its value changes will automatically perform
1011      * a refresh on this component
1012      *
1013      * <p>
1014      * This can be a comma
1015      * separated list of multiple properties that require this component to be
1016      * refreshed when any of them change. <Br>DO NOT use with progressiveRender
1017      * unless it is know that progressiveRender condition will always be
1018      * satisfied before one of these fields can be changed.
1019      * </p>
1020      *
1021      * @return List property names that should trigger a refresh when their values change
1022      */
1023     List<String> getRefreshWhenChangedPropertyNames();
1024 
1025     /**
1026      * Setter for the list of property names that trigger a refresh
1027      *
1028      * @param refreshWhenChangedPropertyNames
1029      */
1030     void setRefreshWhenChangedPropertyNames(List<String> refreshWhenChangedPropertyNames);
1031 
1032     /**
1033      * Returns a list of componentIds which will be also be refreshed when this component is refreshed
1034      *
1035      * <p>
1036      * This will be a comma separated list of componentIds that need to be refreshed when a refresh
1037      * condition has been set on this component.
1038      * </p>
1039      *
1040      * @return List<String>
1041      */
1042     public List<String> getAdditionalComponentsToRefresh();
1043 
1044     /**
1045      * Setter for alsoRefreshComponents
1046      *
1047      * @param additionalComponentsToRefresh
1048      */
1049     public void setAdditionalComponentsToRefresh(List<String> additionalComponentsToRefresh);
1050 
1051     /**
1052      * Returns a string for representing the list of additional components to be refreshed as
1053      * a JavaScript value
1054      *
1055      * @return String representation of the list of componentIds for the components that need to be refreshed
1056      */
1057     public String getAdditionalComponentsToRefreshJs();
1058 
1059     /**
1060      * Indicates the component can be refreshed by an action
1061      *
1062      * <p>
1063      * This is set by the framework for configured ajax action buttons, should not be set in
1064      * configuration
1065      * </p>
1066      *
1067      * @return boolean true if the component is refreshed by an action, false if not
1068      */
1069     boolean isRefreshedByAction();
1070 
1071     /**
1072      * Setter for the refreshed by action indicator
1073      *
1074      * <p>
1075      * This is set by the framework for configured ajax action buttons, should not be set in
1076      * configuration
1077      * </p>
1078      *
1079      * @param refreshedByAction
1080      */
1081     void setRefreshedByAction(boolean refreshedByAction);
1082 
1083     /**
1084      * If true if this component is disclosed by an action in js, a placeholder will be put in this components place
1085      * if render is also false.
1086      *
1087      * @return true if this component is disclosed by an action
1088      */
1089     public boolean isDisclosedByAction();
1090 
1091     /**
1092      * Set if this component is disclosed by some outside action
1093      *
1094      * @param disclosedByAction
1095      */
1096     public void setDisclosedByAction(boolean disclosedByAction);
1097 
1098     /**
1099      * Indicates whether data contained within the component should be reset (set to default) when the
1100      * component is refreshed
1101      *
1102      * @return boolean true if data should be refreshed, false if data should remain as is
1103      */
1104     boolean isResetDataOnRefresh();
1105 
1106     /**
1107      * Setter for the reset data on refresh indicator
1108      *
1109      * @param resetDataOnRefresh
1110      */
1111     void setResetDataOnRefresh(boolean resetDataOnRefresh);
1112 
1113     /**
1114      * Time in seconds after which the component is automatically refreshed
1115      *
1116      * @return time in seconds
1117      */
1118     int getRefreshTimer();
1119 
1120     /**
1121      * Setter for refreshTimer
1122      *
1123      * @param refreshTimer
1124      */
1125     void setRefreshTimer(int refreshTimer);
1126 
1127     /**
1128      * Add a data attribute to the dataAttributes map
1129      *
1130      * @param key
1131      * @param value
1132      */
1133     void addDataAttribute(String key, String value);
1134 
1135     Map<String, String> getDataAttributes();
1136 
1137     /**
1138      * The DataAttributes that will be written to the html and/or through script to be consumed by jQuery
1139      *
1140      * <p>The attributes that are complex objects (contain {}) they will be written through script.
1141      * The attributes that are simple (contain no objects) will be written directly to the html of the
1142      * component using standard data-.</p>
1143      * <p>Either way they can be access through .data() call in jQuery.</p>
1144      *
1145      * @param dataAttributes
1146      */
1147     void setDataAttributes(Map<String, String> dataAttributes);
1148 
1149     /**
1150      * A JavaScript script that will add data to this component by the element which matches its id
1151      *
1152      * <p>
1153      * This will return script for only the complex data elements (containing {})</p>
1154      *
1155      * @return jQuery data script for adding complex data attributes
1156      */
1157     String getComplexDataAttributesJs();
1158 
1159     /**
1160      * The string that can be put into a the tag of a component to add data attributes inline
1161      *
1162      * <p>
1163      * This does not include the complex attributes which contain {}</p>
1164      *
1165      * @return html string for data attributes for the simple attributes
1166      */
1167     String getSimpleDataAttributes();
1168 
1169     /**
1170      * A JavaScript script that will add data to this component by the element which matches its id
1171      *
1172      * <p>This will return script for all the complex data elements.
1173      * This method is useful for controls that are implemented as spring form tags</p>
1174      *
1175      * @return jQuery data script for adding all data attributes
1176      */
1177     String getAllDataAttributesJs();
1178 
1179     /**
1180      * Validates different requirements of component compiling a series of reports detailing information on errors
1181      * found in the component.  Used by the RiceDictionaryValidator.
1182      *
1183      * @param tracer Record of component's location
1184      */
1185     void completeValidation(ValidationTrace tracer);
1186 
1187 }