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