I'm using UIColumns (myfaces-1.0.9), and I've hit what appears to be a bug.
I can initialize my page, and then update my page, but I get an
IllegalArgumentException("row is unavailable") exception when the page
is being rendered (but after all of the actions for that page have
been processed).
The problem appears to be in here:
HtmlTableRendererBase.encodeChildren() contains:
columns.setRowIndex(k);
String columnStyle = styles.getColumnStyle(j);
renderColumnBody(facesContext, writer,
uiData, child, columnStyle);
k starts out as 0. renderColumnBody() eventually calls
UIColumns(UIData).isAllChildrenAndFacetsValid() line: 646
UIColumns(UIData).encodeBegin(FacesContext) line: 594
RendererUtils.renderChild(FacesContext, UIComponent) line: 482
HtmlTableRenderer(HtmlTableRendererBase).renderColumnBody(FacesContext,
ResponseWriter, UIData, UIComponent, String) line: 205
and isAllChildrenAndFacetsValid cycles through the rowIndexes, and
ends up setting it to -1.
And then sometime later my own code gets called via
HtmlSelectBooleanCheckbox(UIOutput).getValue() line: 75
RendererUtils.getBooleanValue(UIComponent) line: 213
HtmlCheckboxRenderer(HtmlCheckboxRendererBase).encodeEnd(FacesContext,
UIComponent) line: 94
HtmlSelectBooleanCheckbox(UIComponentBase).encodeEnd(FacesContext)
line: 341
RendererUtils.renderChild(FacesContext, UIComponent) line: 491
RendererUtils.renderChildren(FacesContext, UIComponent) line: 468
RendererUtils.renderChild(FacesContext, UIComponent) line: 489
HtmlTableRenderer(HtmlTableRendererBase).renderColumnBody(FacesContext,
ResponseWriter, UIData, UIComponent, String) line: 205
but by this point, the rowIndex is -1 rather than the original 0 value
it should have been.
I'm not sure what to suggest as a fix. Maybe override
isAllChildrenAndFacetsValid() at UIColumns, store the current
row-index, call super.isAllChildrenAndFacetsValid(), and then restore
the row-index?
I'll go ahead and open this as a Jira issue if someone confirms this
is really a bug.
Thanks.
-Mike