org.apache.beehive.netui.tags.databinding.cellrepeater
Class CellRepeater

Object
  extended by TagSupport
      extended by BodyTagSupport
          extended by AbstractClassicTag
              extended by CellRepeater
All Implemented Interfaces:
Serializable, BodyTag, IterationTag, JspTag, Tag, TryCatchFinally, IDataAccessProvider, INetuiTag

public class CellRepeater
extends AbstractClassicTag
implements IDataAccessProvider, TryCatchFinally

This tag is a repeating, databound tag that renders its body each cell of a table of the specified dimensions. The tag is bound to a dataset that is specified in the dataSource attribute. For each item in the data set, the body of this tag is rendered, and NetUI tags in the body that are databound can use the container.item syntax to access the "current" data item in the iteration. Properties on this data item can be accessed using expressions.

The tag will automatically insert the open and close table, row, and cell tags which will comprise the table that is rendered. Style attributes may be set using attributes on this tag in order to cusotmize the tag's final appearance. The dimensions of the table are specified by using at least one of the attributes columns and rows. If only one is specified, the other will be inferred by using the size of the given data set. As a result, the entire dataset will be rendered. For example, if a table should be four columns wide and the data set has twenty items, the resulting table will have five rows. If the data set is fewer items than the number of cells that should be rendered, the cells are padded with HTML table cells:

     <td>&nbsp;</td>
 

This will prevent rendering a malformed HTML table. If the number of cells to render is smaller than the fully specified dimensions of the table, only this number of cells will be rendered. For example, if the data set is size fifty but the rows and the columns attributes are both seven, only the first forty-nine items in the dataset will be rendered and the fiftieth will not be shown. The values of the rows and the columns can be databound with an expression; in this case, each value will be converted into an integer. An error will be reported on the page if this conversion fails.

This tag implements the IDataAccessProvider interface which provides tags access to the "current" data item. Properties on the IDataAccessProvider interface are available through the "container" binding context, which can be used inside of the body of the CellRepeater. Properties of the IDataAccessProvider interface that are available include:

NameDescription
indexthe current index in the iteration; this index is absolute to the dataset
parentany IDataAccessProvider parent of this tag
itemthe current data item

Note: the metadata property of the container binding context is not supported on the CellRepeater.

See Also:
Serialized Form
Example
In this example, the <netui-data:cellRepeater> tag creates a table with the number of columns set given as ${pageFlow.numColumns} and as many rows as necessary to display all the items in the pageFlow.itemArray data set.
    <netui-data:cellRepeater dataSource="pageFlow.itemArray" columns="pageFlow.numColumns">
        Item: <netui:span value="${container.item}"/>
    </netui-data:cellRepeater>
 

Field Summary
 
Fields inherited from class AbstractClassicTag
DefaultNamingChain, EMPTY_STRING, NETUI_UNIQUE_CNT
 
Fields inherited from class BodyTagSupport
bodyContent
 
Fields inherited from class TagSupport
id, pageContext
 
Fields inherited from interface BodyTag
EVAL_BODY_BUFFERED, EVAL_BODY_TAG
 
Fields inherited from interface IterationTag
EVAL_BODY_AGAIN
 
Fields inherited from interface Tag
EVAL_BODY_INCLUDE, EVAL_PAGE, SKIP_BODY, SKIP_PAGE
 
Constructor Summary
CellRepeater()
           
 
Method Summary
 int doAfterBody()
          Continue rendering the body of this tag until the dimensions of the table have been reached or the entire dataset has been rendered.
 void doCatch(Throwable t)
           
 int doEndTag()
          Complete rendering the tag.
 void doFinally()
           
 int doStartTag()
          Prepare to render the dataset that was specified in the dataSource attribute.
 int getCurrentIndex()
          Get the index of the current iteration through the body of this tag.
 Object getCurrentItem()
          Get the item that is currently being rendered by this repeating tag.
 Object getCurrentMetadata()
          Get the metadata for the current item.
 String getDataSource()
          Gets the tag's data source (can be an expression).
protected  List getNamingChain()
          Return an ArrayList which represents a chain of INameInterceptor objects.
 IDataAccessProvider getProviderParent()
          Get the parent IDataAccessProvider for this tag.
 String getTagName()
          Get the name of this tag.
protected  void localRelease()
          Reset all of the fields of this tag.
 void setAlternatingCellClass(String alternatingCellClass)
          Set the HTML style class that is rendered on each HTML table cell that is opened by this tag.
 void setCellClass(String cellClass)
          Set the HTML style class that is rendered on each HTML table cell that is opened by this tag.
 void setColumns(int columns)
          Set the number of columns that should be rendered in the table generated by the tag.
 void setDataSource(String dataSource)
          The dataSource attribute determines both (1) the source of populating data for the tag and (2) the object to which the tag submits data.
 void setRowClass(String rowClass)
          Set the HTML style class that is rendered on each HTML table row that is opened by this tag.
 void setRows(int rows)
          Set the number of rows that should be rendered in the table generated by the tag.
 void setTableClass(String tableClass)
          The HTML style class that is rendered on the HTML table.
 void setVerticalRepeat(boolean verticalRepeat)
          This tag can render the items in its dataset horizontally or vertically.
 
Methods inherited from class AbstractClassicTag
applyNamingChain, getErrorsReport, getIdForTagId, getNearestForm, getNextId, getScriptReporter, getUserLocale, hasErrors, qualifyAttribute, registerTagError, registerTagError, reportAndExit, reportErrors, rewriteName, setNonEmptyValueAttribute, setRequiredValueAttribute, write
 
Methods inherited from class BodyTagSupport
doInitBody, getBodyContent, getPreviousOut, release, setBodyContent
 
Methods inherited from class TagSupport
findAncestorWithClass, getId, getParent, getValue, getValues, removeValue, setId, setPageContext, setParent, setValue
 
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface Tag
getParent, setPageContext, setParent
 

Constructor Detail

CellRepeater

public CellRepeater()
Method Detail

getTagName

public String getTagName()
Get the name of this tag. This is used to identify the type of this tag for reporting tag errors.

Specified by:
getTagName in interface INetuiTag
Specified by:
getTagName in class AbstractClassicTag
Returns:
a constant String representing the name of this tag.

setTableClass

public void setTableClass(String tableClass)
The HTML style class that is rendered on the HTML table. For example, if the row class is "tableClass", each opening table tag is:
     <table class="tableClass">
 

Parameters:
tableClass - the name of a style class in a CSS

setRowClass

public void setRowClass(String rowClass)
Set the HTML style class that is rendered on each HTML table row that is opened by this tag. For example, if the row class is "rowClass", each opening table row tag is:
     <tr class="rowClass">
 

Parameters:
rowClass - the name of a style class in the CSS

setCellClass

public void setCellClass(String cellClass)
Set the HTML style class that is rendered on each HTML table cell that is opened by this tag. For example, if the cell class is "cellClass", each opening table cell tag is:
     <td class="cellClass">
 

Parameters:
cellClass - the name of a style class in a CSS

setAlternatingCellClass

public void setAlternatingCellClass(String alternatingCellClass)
Set the HTML style class that is rendered on each HTML table cell that is opened by this tag. The starting cell is alternated for each row, which results in a checkerboard colored table being displayed. For example, if the alteranting cell class is \"alternatingCellClass\", every other table cell tag is:
     <td cell="alternatingCellClass">
 

Parameters:
alternatingCellClass - the name of a style class in a CSS

setVerticalRepeat

public void setVerticalRepeat(boolean verticalRepeat)
This tag can render the items in its dataset horizontally or vertically. If the rows are rendered horizontally, the items in the dataset are rendered across each row from top to bottom. Otherwise, they are rendered down each column from left to right. The default is to render the items horizontally.

Parameters:
verticalRepeat - if set to true, the dataset is rendered down each column; otherwise it is rendered across each row, the default.

setColumns

public void setColumns(int columns)
Set the number of columns that should be rendered in the table generated by the tag. If the columns attribute is specified but the rows attribute is not, the rows attribute will be inferred using the size of the dataset.

Parameters:
columns - an integer or an expression

setRows

public void setRows(int rows)
Set the number of rows that should be rendered in the table generated by the tag. If the rows attribute is specified but the columns attribute is not, the columns attribute will be inferred using the size of the dataset.

Parameters:
rows - an integer or an expression whose value can be converted into an integer.

setDataSource

public void setDataSource(String dataSource)

The dataSource attribute determines both (1) the source of populating data for the tag and (2) the object to which the tag submits data.

For example, assume that the Controller file (= JPF file) contains a Form Bean with the property foo. Then the following <netui:textBox> tag will (1) draw populating data from the Form Bean's foo property and (2) submit user defined data to the same property.

    <netui:textBox dataSource="actionForm.foo" />

When the tag is used to submit data, the data binding expression must refer to a Form Bean property. In cases where the tag is not used to submit data, but is used for displaying data only, the data binding expression need not refer to a Form Bean property. For example, assume that myIterativeData is a member variable on the Controller file ( = JPF file). The following <netui-data:repeater> tag draws its data from myIterativeData.

Parameters:
dataSource - the data source

doStartTag

public int doStartTag()
               throws JspException
Prepare to render the dataset that was specified in the dataSource attribute. The dataSource expression is evaluated and the table's dimensions are computed. If there is no data in the dataset but the rows and columns attributes were specified, an empty table of the given dimensions is rendered.

Specified by:
doStartTag in interface Tag
Overrides:
doStartTag in class BodyTagSupport
Returns:
EVAL_BODY_BUFFERED or SKIP_BODY if errors are reported, the data set is null, or there is no data in the data set
Throws:
JspException - if errors occurred that could not be reported in the page

doAfterBody

public int doAfterBody()
Continue rendering the body of this tag until the dimensions of the table have been reached or the entire dataset has been rendered. The buffered body content from the previous iteration of the body is added to the content this tag will render, @see addContent(java.lang.String). Pad the table if the dimensions have not been met but the dataset is empty.

Specified by:
doAfterBody in interface IterationTag
Overrides:
doAfterBody in class BodyTagSupport
Returns:
EVAL_BODY_BUFFERED if there is more data to render in the dataset or SKIP_BODY if the end of the dataset is reached or an error occurs

doEndTag

public int doEndTag()
             throws JspException
Complete rendering the tag. If no errors have occurred, the content that the tag buffered is rendered.

Specified by:
doEndTag in interface Tag
Overrides:
doEndTag in class BodyTagSupport
Returns:
EVAL_PAGE to continue evaluating the page
Throws:
JspException - if an error occurs that can not be reported on the page

doFinally

public void doFinally()
Specified by:
doFinally in interface TryCatchFinally

doCatch

public void doCatch(Throwable t)
             throws Throwable
Specified by:
doCatch in interface TryCatchFinally
Throws:
Throwable

getDataSource

public String getDataSource()
Gets the tag's data source (can be an expression).

Specified by:
getDataSource in interface IDataAccessProvider
Returns:
the data source

getCurrentIndex

public int getCurrentIndex()
Get the index of the current iteration through the body of this tag. This data can be accessed using the expression container.index on an attribute of a databindable NetUI tag that is contained within the repeating body of this tag. This expression is only valid when the dataset is being rendered.

Specified by:
getCurrentIndex in interface IDataAccessProvider
Returns:
the integer index of the current data item in the data set
See Also:
IDataAccessProvider

getCurrentItem

public Object getCurrentItem()
Get the item that is currently being rendered by this repeating tag. This can be accessed using the expression expression.item on an attribute of a databindable netUI tag that is contained within the repeating body of this tag. The expression is only valid when the dataset is being rendered.

Specified by:
getCurrentItem in interface IDataAccessProvider
Returns:
the current item in the data set
See Also:
IDataAccessProvider

getCurrentMetadata

public Object getCurrentMetadata()
Get the metadata for the current item. This method is not supported by this tag.

Specified by:
getCurrentMetadata in interface IDataAccessProvider
Returns:
the current metadata or null if no metadata can be found or metadata is not supported by a IDataAccessProvider implementation
Throws:
UnsupportedOperationException - this tag does not support this method from the IDataAccessProvider interface
See Also:
IDataAccessProvider

getProviderParent

public IDataAccessProvider getProviderParent()
Get the parent IDataAccessProvider for this tag. If this tag is contained within a IDataAccessProvider, the containing IDataAccessProvider is available through the expression container.container. Any valid properties of the parent IDataAccessProvider can be accessed through this expression. This method will return null if there is no parent IDataAccessProvider

Specified by:
getProviderParent in interface IDataAccessProvider
Returns:
a containing IDataAccessProvider if one exists, null otherwise.
See Also:
IDataAccessProvider

getNamingChain

protected List getNamingChain()
Return an ArrayList which represents a chain of INameInterceptor objects. This method by default returns null and should be overridden by objects that support naming.

Overrides:
getNamingChain in class AbstractClassicTag
Returns:
an ArrayList that will contain INameInterceptor objects.

localRelease

protected void localRelease()
Reset all of the fields of this tag.

Overrides:
localRelease in class AbstractClassicTag