Thanks you all for the comments and advice.

Now I know that I didn't do anything wrong on my part.
I just patched my own app, using the following code.
       int first = uiData.getFirst();
       int rows = uiData.getRows();
       int rowCount = uiData.getRowCount();
       int last = -1;
       if (rowCount > -1)
       {
           if (rows <= 0)
           {
               rows = rowCount - first;
           }
           last = first + rows;
           if (last > rowCount)
               last = rowCount;
       }
       else
       {
           if (rows > 0)
           {
               last = first + rows;
           }
       }

       for (int i = first; i < last || (last == -1) ; i++)

a bit verbose, but it serves my need and cover all cases I have.
Now everything works well. To be honest, I didn't use a ResultSetDataModel directly, but wrote my own DataModel to wrap an Iterator returned by Hibernate. So the code above was not actually tested with ResultSetDataModel.

Thanks guys.

Simon Kitching wrote:

On Sun, 2006-01-01 at 11:21 +0700, Pichai Ongvasith wrote:
Hello,

I tried to use a ResultSetDataModel as the data model for <t:dataTable>, with myfaces1.1.1. It turns out that the result never shows up in the table.
My guess is that this might be related to Jira issue MYFACES-278.

Looking into the source code, I guess HtmlTableRendererBase.encodeInnerHtml is doing the job to render the result set.
this is the excerpt of relevant code.
       int first = uiData.getFirst();
       int rows = uiData.getRows();
       int rowCount = uiData.getRowCount();
       if (rows <= 0)
       {
           rows = rowCount - first;
       }
       int last = first + rows;
       if (last > rowCount)
           last = rowCount;

       for (int i = first; i < last; i++)
{ // render
       }

If that's true, the method might be mishandling the uiData.getRowCount.
The implementation of ResultSetDataModel.getRowCount in myfaces1.1.1 always return -1, which is valid when the row count is unknown at the time. So before the rendering loop, last is always -1, and nothing would be rendered.

Or am I missing something here?

It sure looks to me like the ResultSet support is broken. As you say,
ResultSetDataModel.getRowCount always returns -1, so I can't see how
this code would ever work.

Perhaps the HtmlTableRendererBase.encodeInnerHtml method should look
more like this:
 uiData.setRowIndex(first);
 int offset = first;
 while (uiData.isRowValid()) {
   // render
if (offset > last)
     break;

   ++offset;
   uiData.setRowIndex(offset);
 }

Regards,

Simon


Reply via email to