View Javadoc

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