Author: ekoneil
Date: Tue Jul 27 09:55:01 2004
New Revision: 30787

Added:
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/PagedDataSet.java
   (contents, props changed)
Removed:
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/Parameter.java
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/actionTest.jsp
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/anchorParams.jsp
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/formatting.jsp
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/group.jsp
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/image.jsp
Modified:
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ColumnModel.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/DataGridModel.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/IFilter.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ISort.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/PagerModel.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/StylePolicy.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/AnchorColumnModel.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultFilter.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultSort.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultStylePolicy.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/EmptyStylePolicy.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/ImageColumnModel.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/LegacyStylePolicy.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/FilterService.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/IllegalFilterException.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/AttributeHelper.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AbstractColumn.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AnchorColumn.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/Columns.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/DataGrid.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/ImageColumn.java
   
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/LiteralColumn.java
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/Controller.jpf
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/index.jsp
   
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/util/portfolioXmlBean.jsp
Log:
Significant updates to the data grid.

- This starts to bring the grid in line with JSP 2.0 EL, and it runs in a 
primitive way now.
- Remove a bunch of old tests that need to be re-worked as anchor and image 
features start to come on-line.
- A bunch of code cleanup.
- Add PagedDataSet, which starts to encapsulate the way the DataGridModel 
interacts with repeating over the data set.

BB: self
DRT: NetUI pass
CR: Daryl



Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ColumnModel.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ColumnModel.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ColumnModel.java
    Tue Jul 27 09:55:01 2004
@@ -18,28 +18,21 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
 import java.util.ArrayList;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 
-// internal imports
 import org.apache.beehive.netui.tags.html.FormatTag;
 
 import org.apache.beehive.netui.datagrid.util.AttributeHelper;
 import org.apache.beehive.netui.datagrid.services.FilterService;
 import org.apache.beehive.netui.datagrid.services.SortService;
-
 import org.apache.beehive.netui.pageflow.scoping.ScopedRequest;
 import org.apache.beehive.netui.pageflow.scoping.ScopedServletUtils;
 import org.apache.beehive.netui.pageflow.util.PageflowTagUtils;
-
 import org.apache.beehive.netui.util.logging.Logger;
-import org.apache.beehive.netui.script.common.IDataAccessProvider;
-
-// external imports
 
 /**
  *
@@ -48,7 +41,7 @@
 {
     private static final Logger _logger = 
Logger.getInstance(ColumnModel.class);
 
-    // @todo: externalize these -- they need to be overridable from a JSP
+    // todo: externalize these -- they need to be overridable from a JSP
     private static final String EMPTY_CELL = " ";
     private static final String UNSORTED_IMAGE = 
"/resources/datagrid/arrow_off.png";
     private static final String SORTED_ASCENDING_IMAGE = 
"/resources/datagrid/arrow_down.png";
@@ -60,7 +53,6 @@
     public static final int ATTR_GENERAL = 0;
     public static final int ATTR_GENERAL_EXPRESSION = 1;
    
-    private IDataAccessProvider _dap;
     private DataGridModel _dataGridModel;
     private StylePolicy _stylePolicy;
 
@@ -165,16 +157,16 @@
             renderEmptyCell(buffer);
         else
         {
-            Object value = _dataGridModel.evaluateExpression(_headerText, 
"headerText");
-            
+            Object value = _headerText;
+
             SortService sortService = _dataGridModel.getSortService();
             PageContext pageContext = _dataGridModel.getPageContext();
 
             buffer.append(value);
             
-            // @todo: there is an NPE in PageflowTagUtils.createActionURL a la
+            // todo: there is an NPE in PageflowTagUtils.createActionURL a la
             //         at 
org.apache.beehive.netui.pageflow.util.PageflowTagUtils.createActionURL(PageflowTagUtils.java:139)
-            // @todo: handle filter URIs, not just actions here?
+            // todo: handle filter URIs, not just actions here?
             // disable sorting
 //             String sort = _sortUri;
 //             if(sort != null)
@@ -205,8 +197,8 @@
 
         // for grouping, evaluate the data source expression here.  
         // that way the grouped columns can compare data to render in their 
renderData methods
-        Object value = _dataGridModel.evaluateExpression(_value, "value");
-        
+        Object value = _value;
+
         if(value != null && value.equals(getRenderData()))
             setCanGroup(true);
         else setCanGroup(false);
@@ -253,7 +245,7 @@
         assert _dataGridModel != null;
 
         if(_footerText != null)
-            buffer.append(_dataGridModel.evaluateExpression(_footerText, 
"footerText"));
+            buffer.append(_footerText);
         else renderEmptyCell(buffer);
     }
 
@@ -305,7 +297,7 @@
             }
             catch (JspException e) 
             {
-                // @todo: need a way to register errors
+                // todo: need a way to register errors
                 if(_logger.isErrorEnabled()) _logger.error("A formatter of 
type \"" + currentFormatter.getClass().getName() + "\" threw an exception " + 
e, e);
             }
         }
@@ -315,7 +307,7 @@
         return text.toString();
     }
 
-    // @todo: this should be done with cell decorators
+    // todo: this should be done with cell decorators
     private static final void renderSortLink(StringBuffer buffer, 
DataGridModel dataGridModel,
                                              SortService sortService, String 
sortUri, 
                                              String sortExpression, Object 
value)
@@ -324,7 +316,7 @@
         assert sortExpression != null;
         assert sortUri != null;
 
-        // @todo: externalize configuration
+        // todo: externalize configuration
         buffer.append("<a href=\"");
         buffer.append(sortUri);
         buffer.append("?");
@@ -347,7 +339,7 @@
         buffer.append("&nbsp;&nbsp;");
     }
     
-    // @todo: this should be done with cell decorators
+    // todo: this should be done with cell decorators
     private static final void renderFilterLink(StringBuffer buffer, 
DataGridModel dataGridModel,
                                                String filterExpression, String 
headerText, 
                                                String filterUri, Object value)
@@ -372,7 +364,7 @@
         if(sr != null)
             prefix = sr.getScopeKey().toString();
 
-        // @todo: format needs to be read from a config file
+        // todo: format needs to be read from a configurable property
         buffer.append("\n<a href=\"filter: ");
         buffer.append(headerText);
         buffer.append("\" onClick=\"return ShowFilterWindow('");

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/DataGridModel.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/DataGridModel.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/DataGridModel.java
  Tue Jul 27 09:55:01 2004
@@ -18,35 +18,21 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
 import java.io.IOException;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.tagext.JspTag;
-import javax.servlet.jsp.tagext.Tag;
-
-// internal imports
-import org.apache.beehive.netui.script.ExpressionEvaluationException;
-import org.apache.beehive.netui.script.ExpressionEvaluatorFactory;
-import org.apache.beehive.netui.script.common.ImplicitObjectUtil;
-import org.apache.beehive.netui.script.common.ImplicitObjectBean;
-import org.apache.beehive.netui.script.common.IDataAccessProvider;
-
-import org.apache.beehive.netui.tags.datagrid.DataGrid;
-
-import org.apache.beehive.netui.util.iterator.IteratorFactory;
-import org.apache.beehive.netui.util.logging.Logger;
 
 import org.apache.beehive.netui.datagrid.services.FilterService;
 import org.apache.beehive.netui.datagrid.services.PagerService;
 import org.apache.beehive.netui.datagrid.services.SortService;
-
-// external imports
+import org.apache.beehive.netui.datagrid.util.PagedDataSet;
+import org.apache.beehive.netui.script.common.IDataAccessProvider;
+import org.apache.beehive.netui.tags.datagrid.DataGrid;
+import org.apache.beehive.netui.util.logging.Logger;
 
 /**
  *
@@ -55,172 +41,48 @@
     implements IDataAccessProvider
 {
     private static final Logger _logger = 
Logger.getInstance(DataGridModel.class);
-
     private static final int NO_GROUPING = -1;
-    private ArrayList EMPTY_LIST = new ArrayList();
+
+    private String _name = null;
+    private int _groupDepth = NO_GROUPING;
+    private int _startRenderWindow = 0;
+    private int _endRenderWindow = 0;
 
     private List _columns = null;
     
     private PagerModel _pagerModel = null;
-
-    // state assiociated with the IDataAccessProvider implementation
-    private String _dataSource;
-    private int _index = 0;
-
-    // JSP references used for expression evaluation and getting into the JSP 
tag
-    // hierarchy of IDataAccessProvider classes
-    private DataGrid _grid;
-    private PageContext _pageContext;
-
-    // state associated with iterating over a data set
-    private Object _dataSet = null;
-    private Iterator _dataSetIterator = null;
-    private Object _dataItem = null;
-    private int _dataSetSize;
-
+    private StylePolicy _cssPolicy = null;
     private SortService _sortService = null;
     private FilterService _filterService = null;
-    
-    private String _name = null;
-
-    private int _groupDepth = NO_GROUPING;
+    private PagerService _pagerService = null;
 
-    private StylePolicy _cssPolicy = null;
+    private DataGrid _grid;
+    private PageContext _pageContext;
 
-    private int _startRenderWindow = 0;
-    private int _endRenderWindow = 0;
+    private PagedDataSet _dataSet = null;
 
-    private PagerService _pagerService = null;
-    
     public DataGridModel(DataGrid grid)
     {
         _grid = grid;
     }
 
-    public void setSortService(SortService sortService) {_sortService = 
sortService;}
-    public SortService getSortService() 
-    {
-        if(_sortService == null)
-            _sortService = SortService.getInstance(_pageContext.getRequest(), 
_name);
-        
-        return _sortService;
-    }
-
-    public void setFilterService(FilterService filterService) {_filterService 
= filterService;}
-    public FilterService getFilterService() 
-    {
-        if(_filterService == null)
-            _filterService = 
FilterService.getInstance(_pageContext.getRequest(), _name);
-        
-        return _filterService;
-    }
-
-    public void setPagerService(PagerService pagerService) {_pagerService = 
pagerService;}
-    public PagerService getPagerService()
-    {
-        if(_pagerService == null)
-            _pagerService = 
PagerService.getInstance(_pageContext.getRequest(), _name);
-        
-        return _pagerService;
-    }
-    
-    public void setName(String name) {_name = name;}
-    public String getName() {return _name;}
-
-    public void setPageContext(PageContext pageContext) {_pageContext = 
pageContext;}
-    public PageContext getPageContext() {return _pageContext;}
-
-    public List getColumns() 
-    {
-        if(_columns != null)
-            return Collections.unmodifiableList(_columns);
-        else return EMPTY_LIST;
-    }
-
-    public ColumnModel getColumn(int index)
-    {
-        assert _columns != null;
-        assert index < _columns.size();
-
-        ColumnModel cm = (ColumnModel)_columns.get(index);
-        
-        return cm;
-    }
-
-    /*
-     *
-     * CSS / Style properties
-     *
-     */
-    public void setCssPolicy(StylePolicy cssPolicy) {_cssPolicy = cssPolicy;}
-    public StylePolicy getCssPolicy() {return _cssPolicy;}
-
-    public void setGroupDepth(int groupDepth) {_groupDepth = groupDepth;}
-    public int getGroupDepth() {return _groupDepth;}
-
-    public int getDataSetSize() {return _dataSetSize;}
-
-    /**
-     *
-     */
-    public void addColumn(ColumnModel column)
-    {
-        column.setDataGridModel(this);
-
-        if(_columns == null)
-            _columns = new ArrayList();
-        
-        _columns.add(column);
-    }
-
     public void initialize()
     {
-        // @todo: this needs to be initialized in the DataGrid tag
-        _sortService = SortService.getInstance(_pageContext.getRequest(), 
_name);
-
-        if(_logger.isDebugEnabled()) _logger.debug("evaluate data source: " + 
_dataSource);
-
-        _dataSet = evaluateExpression(_dataSource, "dataSource");
-
-        if(_logger.isDebugEnabled()) _logger.debug("data set type: " + 
-                                                   (_dataSet != null ? 
_dataSet.getClass().toString() : "null"));
-
-        try{_dataSetIterator = IteratorFactory.makeIterator(_dataSet);} 
-        catch(Exception e) 
-        {
-            if(_logger.isErrorEnabled()) 
-                _logger.error("Error evaluating dataSource attribute: " + e, 
e);
-        }
-
-        if(_dataSetIterator == null)
-            _dataSetIterator = EMPTY_LIST.iterator();
-
-        if(_logger.isDebugEnabled()) _logger.debug("iterator type: " + 
_dataSetIterator.getClass().getName());
-
-        List list = new ArrayList();
-        int size = 0; 
-        while(_dataSetIterator.hasNext())
-        {
-            list.add(_dataSetIterator.next());
-            size++;
-            _logger.debug("size: " + size);
-        }
-        _dataSetIterator = list.iterator();
-        _dataSetSize = size;
+        if(_logger.isDebugEnabled()) _logger.debug("evaluate data source: " + 
_dataSet.getDataSourceRef());
 
         PagerService ps = getPagerService();
-        int lastPage = 
(int)Math.ceil((float)_dataSetSize/(float)ps.getPageSize());
+        int lastPage = 
(int)Math.ceil((float)_dataSet.getSize()/(float)ps.getPageSize());
         _startRenderWindow = (ps.getCurrentPage()-1)*10;
-        _endRenderWindow = (ps.getCurrentPage() != lastPage ? 
_startRenderWindow+ps.getPageSize() : _dataSetSize);
-        
-        if(_logger.isDebugEnabled()) 
-            _logger.debug("start: " + _startRenderWindow + " end: " + 
_endRenderWindow + 
-                          " lastPage: " + lastPage + " pageSize: " + 
ps.getPageSize() + 
-                          " dataSetSize: " + _dataSetSize);
+        _endRenderWindow = (ps.getCurrentPage() != lastPage ? 
_startRenderWindow+ps.getPageSize() : _dataSet.getSize());
+
+        if(_logger.isDebugEnabled())
+            _logger.debug("start: " + _startRenderWindow + " end: " + 
_endRenderWindow +
+                          " lastPage: " + lastPage + " pageSize: " + 
ps.getPageSize() +
+                          " dataSetSize: " + _dataSet.getSize());
 
         assert _startRenderWindow <= _endRenderWindow;
 
-        if(_logger.isDebugEnabled()) 
+        if(_logger.isDebugEnabled())
         {
             _logger.debug("start render window: " + _startRenderWindow);
             _logger.debug("end render window: " + _endRenderWindow);
@@ -228,33 +90,15 @@
         }
     }
 
-    // @todo: this is a terrible name
-    public void moveCursorToStart()
+    public void addColumn(ColumnModel column)
     {
-        if(_logger.isDebugEnabled()) _logger.debug("_index: " + _index + " 
_startRenderWindow: " + _startRenderWindow);
-
-        assert _index == 0;
-
-        while(_dataSetIterator.hasNext() && _index != _startRenderWindow)
-        {
-            _dataSetIterator.next();
-            _index++;
-        }
-        
-        if(_logger.isDebugEnabled()) _logger.debug("cursor moved to: " + 
_index);
-    }
+        if(_columns == null)
+            _columns = new ArrayList();
 
-    // @todo: as is this
-    public boolean endDataSet()
-    {
-        if(_logger.isDebugEnabled()) _logger.debug("index: " + _index + " 
_endRenderWindiw: " + 
-                                                   _endRenderWindow + " end 
data set: " + (_index >= _endRenderWindow));
-        return _index >= _endRenderWindow;
+        column.setDataGridModel(this);
+        _columns.add(column);
     }
 
-    /**
-     *
-     */
     public void render(Writer writer)
     {
         assert _pageContext != null;
@@ -275,23 +119,11 @@
         // header <tr>
         renderHeader(buf, _columns, _cssPolicy, _sortService);
 
-        if(_dataSetIterator != null)
+        // data <tr>
+        while(_dataSet.hasNext())
         {
-            assert _index == 0;
-
-            moveCursorToStart();
-
-            assert _index == _startRenderWindow;
-
-            // data <tr>
-            while(_dataSetIterator.hasNext() && !endDataSet())
-            {
-                _dataItem = _dataSetIterator.next();
-                renderBody(buf, _index, _columns, _cssPolicy, _sortService, 
_groupDepth);
-                _index++;
-            }
-            
-            _index = -1;
+            _dataSet.next();
+            renderBody(buf, _dataSet.getCurrentIndex(), _columns, _cssPolicy, 
_sortService, _groupDepth);
         }
 
         // footer <tr>
@@ -306,66 +138,11 @@
     public void renderPager(StringBuffer buf)
     {
         if(_pagerModel == null)
-            _pagerModel = new PagerModel(this, getPagerService());
+            _pagerModel = new PagerModel(this);
         
         _pagerModel.render(buf);
     }
 
-    public void openTable(StringBuffer buf)
-    {
-        // <table>
-        buf.append("\n<table");
-        _cssPolicy.writeStyleClass(buf, StylePolicy.TABLE_CLASS);
-        buf.append(">");
-    }
-
-    public void closeTable(StringBuffer buf)
-    {
-        // </table>
-        buf.append("\n</table>\n");
-    }
-
-    /**
-     *
-     */
-    public final Object evaluateExpression(String expression, String attrName)
-    {
-        assert _pageContext != null && _grid != null;
-
-        if(_logger.isDebugEnabled()) _logger.debug("evaluate expression: '" + 
expression + "'");
-        
-        if(expression == null)
-            return null;
-
-        Tag fakeTag = new FakeTag();
-        fakeTag.setParent(_grid);
-        ImplicitObjectBean bean = 
ImplicitObjectUtil.getImplicitObjects(_pageContext, fakeTag);
-        try
-        {
-            Object result = 
ExpressionEvaluatorFactory.getInstance().evaluateStrict(expression, bean);
-            return result;
-        }
-        catch(ExpressionEvaluationException e)
-        {
-            if(_logger.isErrorEnabled())
-                _logger.error("Exception evaluating expression \"" + 
expression + "\": " + e, e);
-            
-            return null;
-        }
-    }
-
-    private static class FakeTag
-        implements javax.servlet.jsp.tagext.Tag
-    {
-        private Tag _parent = null;
-        public int doEndTag() {return EVAL_PAGE;}
-        public int doStartTag() {return SKIP_BODY;}
-        public Tag getParent() {return _parent;}
-        public void release() {}
-        public void setPageContext(PageContext pageContext) {}
-        public void setParent(Tag parent) {_parent = parent;}
-    }
-
     public boolean shouldRenderFooter()
     {
         assert _columns != null;
@@ -374,31 +151,17 @@
         {
             if(((ColumnModel)_columns.get(i)).getFooterText() != null) return 
true;
         }
-        
+
         return false;
     }
-    
-    public final void openHeaderRow(StringBuffer buf)
-    {
-        buf.append("\n<thead>");
-        buf.append("\n<tr");
-        _cssPolicy.writeStyleClass(buf, StylePolicy.HEADER_ROW_CLASS);
-        buf.append(">");
-    }
 
-    public void closeHeaderRow(StringBuffer buf)
-    {
-        buf.append("</tr>\n");
-        buf.append("</thead>\n");
-    }
-    
     private final void renderHeader(StringBuffer buf, List columns, 
StylePolicy cssPolicy, SortService sortService)
     {
         if(_logger.isDebugEnabled()) _logger.debug("render header");
 
         openHeaderRow(buf);
         for(int i = 0; i < columns.size(); i++)
-        {       
+        {
             ColumnModel cm = (ColumnModel)columns.get(i);
 
             cm.openHeaderCell(buf);
@@ -408,21 +171,6 @@
         closeHeaderRow(buf);
     }
 
-    public void openDataRow(StringBuffer buf)
-    {
-        // render the row against the current data item
-        buf.append("\n<tr");
-        if(getCurrentIndex() % 2 == 0)
-            _cssPolicy.writeStyleClass(buf, StylePolicy.ROW_CLASS);
-        else _cssPolicy.writeStyleClass(buf, StylePolicy.ALT_ROW_CLASS);
-        buf.append(">");
-    }
-
-    public void closeDataRow(StringBuffer buf)
-    {
-        buf.append("</tr>");
-    }
-
     private void renderBody(StringBuffer buf, int index, List columns, 
StylePolicy cssPolicy, SortService sortService, int groupDepth)
     {
         if(_logger.isDebugEnabled()) _logger.debug("render body");
@@ -439,7 +187,6 @@
             column.onDataCellPreRender();
 
             // handle grouping
-            boolean disableGroup = false;
             if(groupDepth > NO_GROUPING && i < groupDepth)
             {
                 if(i == 0)
@@ -447,7 +194,7 @@
                     if(column.getCanGroup())
                         column.setShouldGroup(true);
                 }
-                else 
+                else
                 {
                     ColumnModel prevColumn = (ColumnModel)columns.get(i-1);
                     if(prevColumn.getShouldGroup() && column.getCanGroup())
@@ -470,6 +217,47 @@
         closeDataRow(buf);
     }
 
+    public void openTable(StringBuffer buf)
+    {
+        buf.append("\n<table");
+        _cssPolicy.writeStyleClass(buf, StylePolicy.TABLE_CLASS);
+        buf.append(">");
+    }
+
+    public void closeTable(StringBuffer buf)
+    {
+        buf.append("\n</table>\n");
+    }
+
+    public final void openHeaderRow(StringBuffer buf)
+    {
+        buf.append("\n<thead>");
+        buf.append("\n<tr");
+        _cssPolicy.writeStyleClass(buf, StylePolicy.HEADER_ROW_CLASS);
+        buf.append(">");
+    }
+
+    public void closeHeaderRow(StringBuffer buf)
+    {
+        buf.append("</tr>\n");
+        buf.append("</thead>\n");
+    }
+
+    public void openDataRow(StringBuffer buf)
+    {
+        // render the row against the current data item
+        buf.append("\n<tr");
+        if(getCurrentIndex() % 2 == 0)
+            _cssPolicy.writeStyleClass(buf, StylePolicy.ROW_CLASS);
+        else _cssPolicy.writeStyleClass(buf, StylePolicy.ALT_ROW_CLASS);
+        buf.append(">");
+    }
+
+    public void closeDataRow(StringBuffer buf)
+    {
+        buf.append("</tr>");
+    }
+
     public static void openFooterRow(StringBuffer buf)
     {
         buf.append("\n<tr>");
@@ -477,7 +265,7 @@
 
     public static void closeFooterRow(StringBuffer buf)
     {
-        buf.append("</tr>");
+        buf.append("\n</tr>");
     }
 
     private static void renderFooter(StringBuffer buf, List columns, 
StylePolicy cssPolicy)
@@ -494,7 +282,68 @@
         }
         closeFooterRow(buf);
     }
-    
+
+    public void setDataSet(PagedDataSet dataSet) {_dataSet = dataSet;}
+    public PagedDataSet getDataSet() {return _dataSet;}
+
+    public void setSortService(SortService sortService) {_sortService = 
sortService;}
+    public SortService getSortService()
+    {
+        if(_sortService == null)
+            _sortService = SortService.getInstance(_pageContext.getRequest(), 
_name);
+
+        return _sortService;
+    }
+
+    public void setFilterService(FilterService filterService) {_filterService 
= filterService;}
+    public FilterService getFilterService()
+    {
+        if(_filterService == null)
+            _filterService = 
FilterService.getInstance(_pageContext.getRequest(), _name);
+
+        return _filterService;
+    }
+
+    public void setPagerService(PagerService pagerService) {_pagerService = 
pagerService;}
+    public PagerService getPagerService()
+    {
+        if(_pagerService == null)
+            _pagerService = 
PagerService.getInstance(_pageContext.getRequest(), _name);
+
+        return _pagerService;
+    }
+
+    public void setName(String name) {_name = name;}
+    public String getName() {return _name;}
+
+    public void setPageContext(PageContext pageContext) {_pageContext = 
pageContext;}
+    public PageContext getPageContext() {return _pageContext;}
+
+    public List getColumns()
+    {
+        if(_columns != null)
+            return Collections.unmodifiableList(_columns);
+        else return Collections.EMPTY_LIST;
+    }
+
+    public ColumnModel getColumn(int index)
+    {
+        assert _columns != null;
+        assert index < _columns.size();
+
+        ColumnModel cm = (ColumnModel)_columns.get(index);
+
+        return cm;
+    }
+
+    public void setCssPolicy(StylePolicy cssPolicy) {_cssPolicy = cssPolicy;}
+    public StylePolicy getCssPolicy() {return _cssPolicy;}
+
+    public void setGroupDepth(int groupDepth) {_groupDepth = groupDepth;}
+    public int getGroupDepth() {return _groupDepth;}
+
+    public int getDataSetSize() {return _dataSet.getSize();}
+
     /* ===========================================================
      *
      * IDataAccessProvider implementation
@@ -503,12 +352,12 @@
      */
     public int getCurrentIndex()
     {
-        return _index;
+        return _dataSet.getCurrentIndex();
     }
     
     public Object getCurrentItem()
     {
-        return _dataItem;
+        return _dataSet.getCurrentItem();
     }
 
     public Object getCurrentMetadata()
@@ -516,14 +365,14 @@
         throw new UnsupportedOperationException("Metadata is not available on 
the current data item.");
     }
 
-    public void setDataSource(String dataSource)
+    public void setDataSource(String dataSourceRef)
     {
-        _dataSource = dataSource;
+        throw new UnsupportedOperationException("Need to remove this method 
from IDataAccessProvider!");
     }
 
     public String getDataSource()
     {
-        return _dataSource;
+        return _dataSet.getDataSourceRef();
     }
     
     public IDataAccessProvider getProviderParent()
@@ -531,24 +380,14 @@
         return _grid.getProviderParent();
     }
 
-    public boolean isBindingOnClient()
-    {
-        return false;
-    }
-
     public Object nextDataItem()
     {
-        _dataItem = _dataSetIterator.next();
-        _index++;
-
-        if(_logger.isDebugEnabled()) _logger.debug("next index: " + _index);
-        
-        return _dataItem;
+        return _dataSet.next();
     }
 
     public boolean hasNextDataItem()
     {
-        boolean hasNext = _dataSetIterator.hasNext();
+        boolean hasNext = _dataSet.hasNext();
         if(_logger.isDebugEnabled()) _logger.debug("data set hasNext: " + 
hasNext);
         return hasNext;
     }

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/IFilter.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/IFilter.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/IFilter.java
        Tue Jul 27 09:55:01 2004
@@ -18,12 +18,6 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
-
-// internal imports
-
-// external imports
-
 /**
  *
  */

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ISort.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ISort.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/ISort.java
  Tue Jul 27 09:55:01 2004
@@ -18,12 +18,6 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
-
-// internal imports
-
-// external imports
-
 /**
  *
  */

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/PagerModel.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/PagerModel.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/PagerModel.java
     Tue Jul 27 09:55:01 2004
@@ -18,15 +18,10 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.services.PagerService;
 import org.apache.beehive.netui.pageflow.util.PageflowTagUtils;
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
  *
  */
@@ -44,7 +39,7 @@
 
     private PagerService _pagerService = null;
 
-    public PagerModel(DataGridModel model, PagerService pagerService)
+    public PagerModel(DataGridModel model)
     {
         _pagerService = model.getPagerService();
         _model = model;

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/StylePolicy.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/StylePolicy.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/StylePolicy.java
    Tue Jul 27 09:55:01 2004
@@ -18,13 +18,8 @@
  */
 package org.apache.beehive.netui.datagrid.model;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
  *
  */
@@ -32,7 +27,7 @@
 {
     private static final Logger _logger = 
Logger.getInstance(StylePolicy.class);
 
-    // @todo: is this the correct delimiter relative to the CSS spec?
+    // todo: is this the correct delimiter relative to the CSS spec?
     private static final String DELIM = ".";
 
     public static final int TABLE_CLASS = 1;
@@ -102,8 +97,7 @@
         case DATA_CELL_CLASS: return getDataCellClass();
         case FOOTER_CELL_CLASS: return getFooterCellClass();
         case HEADER_CELL_SORTED_CLASS: return getHeaderCellSortedClass();
-            //case DATA_CELL_SORTED_CLASS: return getDataCellSortedClass();
-        default: 
+        default:
             {
                 if(_logger.isDebugEnabled()) _logger.debug("Unable to file 
style class for class type \"" + cssClassType + "\"."); 
                 return "";
@@ -111,8 +105,7 @@
         }
     }
 
-    // @todo: should the styleClass be an int that selects which
-    // style to use from a switch or something?
+    // todo: should the styleClass be an int that selects which style to use 
from a switch or something?
     private void writeStyleClass(StringBuffer buf, String cssClass)
     {
         if(cssClass.equals(""))

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/AnchorColumnModel.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/AnchorColumnModel.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/AnchorColumnModel.java
 Tue Jul 27 09:55:01 2004
@@ -18,16 +18,10 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
 import java.net.MalformedURLException;
-
 import java.util.HashMap;
-import java.util.Iterator;
-
-import javax.servlet.ServletResponse;
 import javax.servlet.jsp.PageContext;
 
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
 import org.apache.beehive.netui.datagrid.model.DataGridModel;
 
@@ -39,10 +33,8 @@
 import org.apache.beehive.netui.util.ParamHelper;
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
- * @todo: significant JavaScript support
+ * todo: significant JavaScript support
  */
 public class AnchorColumnModel
     extends ColumnModel
@@ -78,15 +70,6 @@
             _logger.debug("add parameter named \"" + name + "\"");
 
         ParamHelper.addParam(_params,name,value);
-        
-//         _logger.debug("map identityHashCode: " + 
System.identityHashCode(_params));
-//         Iterator iter = _params.keySet().iterator();
-//         while(iter.hasNext()) 
-//         {
-//             Object key = iter.next();
-//             Object val = _params.get(key);
-//             _logger.debug("map has key: " + key + " with value: " + val);
-//         }
     }
 
     public void renderDataCell(StringBuffer buffer)
@@ -108,41 +91,24 @@
             href = PageflowTagUtils.createActionURL(pc, _action);
             if(_logger.isDebugEnabled()) _logger.debug("action URL \"" + href 
+ "\"");
         }
-        else href = tm.evaluateExpression(_href, "href");
-        
+        else href = _href;
+
         assert href != null;
         sHref = href.toString();
 
         if(_logger.isDebugEnabled()) 
             _logger.debug("handle param set of size: " + (_params != null ? 
_params.size() : 0));
 
-        HashMap nowParams = null;
-        if ((_params != null) && (_params.size()>0)) 
-        {
-            nowParams = new HashMap();
-            Iterator keys = _params.keySet().iterator();
-            while(keys.hasNext())
-            {
-                Object key = keys.next();
-                Object value = _params.get(key);
-                if(value instanceof String)
-                {
-                    value = tm.evaluateExpression((String)value, "paramValue");
-                }
-                nowParams.put(key, value);
-            }
-        }
-
-        String url = calculateURL(pc, sHref, nowParams);
+        String url = calculateURL(pc, sHref, _params);
 
         if(_logger.isDebugEnabled()) _logger.debug("calculated URL: " + url);
-        
+
         buffer.append("<a");
         renderAttribute(buffer, url, "href");
         buffer.append(">");
         buffer.append("<span");
         buffer.append(">");
-        Object value = tm.evaluateExpression(getValue(), "value");
+        Object value = getValue();
         buffer.append(value);
         buffer.append("</span>");
         buffer.append("</a>");
@@ -157,6 +123,8 @@
             url = PageflowTagUtils.computeURL(pageContext, null, destination, 
null, null, queryParams, null, true);
 
             String type = URLRewriter.ACTION_UNSECURE;
+
+            // todo: BUG -- there is an ArrayIndexOutOfBounds exception thrown 
when URL is ""
             if (URLRewriterService.needsSecure(pageContext.getRequest(), 
pageContext.getServletContext(), url, true))
                 type = URLRewriter.ACTION_SECURE;
 

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultFilter.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultFilter.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultFilter.java
     Tue Jul 27 09:55:01 2004
@@ -18,16 +18,11 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
 import java.util.HashMap;
 
-// internal imports
 import org.apache.beehive.netui.datagrid.model.IFilter;
 import org.apache.beehive.netui.datagrid.services.IllegalFilterException;
-
 import org.apache.beehive.netui.util.logging.Logger;
-
-// external imports
 
 /**
  *

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultSort.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultSort.java
       (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultSort.java
       Tue Jul 27 09:55:01 2004
@@ -18,13 +18,8 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ISort;
 import org.apache.beehive.netui.util.logging.Logger;
-
-// external imports
 
 /**
  *

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultStylePolicy.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultStylePolicy.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/DefaultStylePolicy.java
        Tue Jul 27 09:55:01 2004
@@ -18,13 +18,8 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.StylePolicy;
 import org.apache.beehive.netui.util.logging.Logger;
-
-// external imports
 
 /**
  *

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/EmptyStylePolicy.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/EmptyStylePolicy.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/EmptyStylePolicy.java
  Tue Jul 27 09:55:01 2004
@@ -18,13 +18,8 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.StylePolicy;
 import org.apache.beehive.netui.util.logging.Logger;
-
-// external imports
 
 /**
  *

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/ImageColumnModel.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/ImageColumnModel.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/ImageColumnModel.java
  Tue Jul 27 09:55:01 2004
@@ -18,17 +18,11 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
-
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
- * @todo: significant JavaScript support
+ * todo: support the significant JavaScript support
  */
 public class ImageColumnModel
     extends ColumnModel
@@ -76,15 +70,15 @@
     public void renderDataCell(StringBuffer buffer)
     {
         // render the value data from the super
-        // @todo: right now, this goes on the left-side of the rendered image; 
need to make this configurable
+        // todo: right now, this goes on the left-side of the rendered image; 
need to make this configurable
         if(getValue() != null)
             super.renderDataCell(buffer);
 
-        // @todo: need to render the image as the HTML tags render the image
+        // todo: need to render the image as the HTML tags render the image
         buffer.append("<img src=\"");
 
-        Object src = getDataGridModel().evaluateExpression(_src, "src");
-        
+        Object src = _src;
+
         buffer.append(src);
         buffer.append("\"");
 

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/LegacyStylePolicy.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/LegacyStylePolicy.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/model/impl/LegacyStylePolicy.java
 Tue Jul 27 09:55:01 2004
@@ -18,12 +18,7 @@
  */
 package org.apache.beehive.netui.datagrid.model.impl;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.StylePolicy;
-
-// external imports
 
 /**
  *

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/FilterService.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/FilterService.java
       (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/FilterService.java
       Tue Jul 27 09:55:01 2004
@@ -303,7 +303,6 @@
                 }
             }
         }
-        else System.out.println("_altParams has no additional parameters");
 
         if(_logger.isDebugEnabled()) _logger.debug("filter query string with 
alt params: " + buf.toString());
 

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/IllegalFilterException.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/IllegalFilterException.java
      (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/services/IllegalFilterException.java
      Tue Jul 27 09:55:01 2004
@@ -18,12 +18,6 @@
  */
 package org.apache.beehive.netui.datagrid.services;
 
-// java imports
-
-// internal imports
-
-// external imports
-
 /**
  *
  */

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/AttributeHelper.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/AttributeHelper.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/AttributeHelper.java
 Tue Jul 27 09:55:01 2004
@@ -18,12 +18,6 @@
  */
 package org.apache.beehive.netui.datagrid.util;
 
-// java imports
-
-// internal imports
-
-// external imports
-
 /**
  *
  */

Added: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/PagedDataSet.java
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/datagrid/util/PagedDataSet.java
    Tue Jul 27 09:55:01 2004
@@ -0,0 +1,136 @@
+/*
+ * B E A   S Y S T E M S
+ * Copyright 2002-2004  BEA Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.datagrid.util;
+
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.apache.beehive.netui.util.logging.Logger;
+
+/**
+ *
+ */
+public class PagedDataSet
+    implements Iterator
+{
+    private Logger _logger = Logger.getInstance(PagedDataSet.class);
+
+    private ArrayList _list = null;
+    private Iterator _dataSetIterator = null;
+    private Object _currentItem = null;
+
+    private String _dataSourceRef = null;
+    private int _currentIndex = 0;
+    private int _dataSetSize = 0;
+
+    private int _startWindow = -1;
+    private int _endWindow = -1;
+
+    private boolean _advancedToPage = false;
+
+    public PagedDataSet(String dataSourceRef, Iterator iterator)
+    {
+        _dataSourceRef = dataSourceRef;
+
+        if(iterator == null)
+            _dataSetIterator = Collections.EMPTY_LIST.iterator();
+        else _dataSetIterator = iterator;
+
+        if(_logger.isDebugEnabled()) _logger.debug("iterator type: " + 
_dataSetIterator.getClass().getName());
+
+        _list = new ArrayList();
+        while(_dataSetIterator.hasNext())
+        {
+            _list.add(_dataSetIterator.next());
+            _dataSetSize++;
+            if(_logger.isDebugEnabled()) _logger.debug("dataSetSize: " + 
_dataSetSize);
+        }
+        _dataSetIterator = _list.iterator();
+    }
+
+    public void createWindow(int startWindow, int endWindow)
+    {
+        _startWindow = startWindow;
+        _endWindow = endWindow;
+    }
+
+    public boolean hasNext()
+    {
+        // paging support -- advanced to the correct data window if necessary
+        if(!_advancedToPage && _startWindow > -1)
+        {
+            assert _currentIndex == 0;
+
+            while(_dataSetIterator.hasNext() && _currentIndex != _startWindow)
+            {
+                _dataSetIterator.next();
+                _currentIndex++;
+            }
+            _advancedToPage = true;
+        }
+        else if(_endWindow > -1 && (_currentIndex >= _endWindow))
+        {
+            if(_logger.isDebugEnabled()) _logger.debug("current index: " + 
_currentIndex + " _endRenderWindiw: " +
+                                                       _endWindow + " end data 
set: " + (_currentIndex >= _endWindow));
+            return false;
+        }
+
+        boolean hasNext = _dataSetIterator.hasNext();
+        if(!hasNext)
+        {
+            _currentIndex = -1;
+            _currentItem = null;
+        }
+
+        return hasNext;
+    }
+
+    public Object next()
+    {
+        _currentItem = _dataSetIterator.next();
+        _currentIndex++;
+        return _currentItem;
+    }
+
+    public void remove()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getDataSourceRef()
+    {
+        return _dataSourceRef;
+    }
+
+    public int getSize()
+    {
+        return _dataSetSize;
+    }
+
+    public int getCurrentIndex()
+    {
+        return _currentIndex;
+    }
+
+    public Object getCurrentItem()
+    {
+        return _currentItem;
+    }
+}

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AbstractColumn.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AbstractColumn.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AbstractColumn.java
  Tue Jul 27 09:55:01 2004
@@ -18,20 +18,16 @@
  */
 package org.apache.beehive.netui.tags.datagrid;
 
-// java imports
 import javax.servlet.jsp.tagext.Tag;
 
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
 import org.apache.beehive.netui.datagrid.model.DataGridModel;
 
 import org.apache.beehive.netui.tags.AbstractBaseTag;
 import org.apache.beehive.netui.tags.html.Formattable;
-import org.apache.beehive.netui.tags.html.FormatTag;
+import org.apache.beehive.netui.tags.html.FormatTag.Formatter;
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
  *
  */
@@ -44,45 +40,53 @@
     private Columns _parent = null;
     private DataGrid _dataGrid = null;
 
+    private String _value = null;
+    private Boolean _filterable = null;
+    private Boolean _sortable = null;
+    private String _sortExpression = null;
+    private String _filterExpression = null;
+    private String _headerText = null;
+    private String _footerText = null;
+
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setFilterable(boolean filterable) 
{getColumnModel().setFilterable(new Boolean(filterable));}
+    public void setFilterable(boolean filterable) {_filterable = new 
Boolean(filterable);}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setSortable(boolean sortable) 
{getColumnModel().setSortable(new Boolean(sortable));}
+    public void setSortable(boolean sortable) {_sortable = new 
Boolean(sortable);}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setSortExpression(String sortExpression) 
{getColumnModel().setSortExpression(sortExpression);}
+    public void setSortExpression(String sortExpression) {_sortExpression = 
sortExpression;}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setFilterExpression(String filterExpression) 
{getColumnModel().setFilterExpression(filterExpression);}
+    public void setFilterExpression(String filterExpression) 
{_filterExpression = filterExpression;}
 
     /**
-     * @netui:attribute required="false"
-     * @netui.tldx:attribute language="netuiexpression"
+     * @netui:attribute required="false" rtexprvalue="true"
+     * @netui.tldx:attribute
      */
-    public void setHeaderText(String headerText) 
{getColumnModel().setHeaderText(headerText);}
+    public void setHeaderText(String headerText) {_headerText = headerText;}
 
     /**
-     * @netui:attribute required="false"
-     * @netui.tldx:attribute language="netuiexpression"
+     * @netui:attribute required="false" rtexprvalue="true"
+     * @netui.tldx:attribute
      */
-    public void setFooterText(String footerText) 
{getColumnModel().setFooterText(footerText);}
+    public void setFooterText(String footerText) {_footerText = footerText;}
 
     /**
-     * @netui:attribute required="true"
-     * @netui.tldx:attribute language="netuiexpression"
+     * @netui:attribute required="true" rtexprvalue="true"
+     * @netui.tldx:attribute
      */
-    public void setValue(String value) {getColumnModel().setValue(value);}
+    public void setValue(String value) {_value = value;}
 
-    public void addFormatter(FormatTag.Formatter formatter)
+    public void addFormatter(Formatter formatter)
     {
         getColumnModel().addFormatter(formatter);
     }
@@ -95,10 +99,10 @@
         assert getParent() instanceof Columns;
         assert getColumnModel() != null;
         
-        if(_logger.isDebugEnabled()) _logger.debug("start tag.  grid render 
state: " + gridRenderState + " columns render state: " + columnsRenderState);
+        if(_logger.isDebugEnabled())
+            _logger.debug("start tag.  grid render state: " + gridRenderState 
+ " columns render state: " + columnsRenderState);
         
-        // when starting to render, the ColumnModel associated with this tag
-        // needs to be created
+        // when starting to render, the ColumnModel associated with this tag 
needs to be created
         if(gridRenderState == DataGrid.START_RENDER_STATE)
         {
             ColumnModel cm = getColumnModel();
@@ -111,6 +115,19 @@
         {
             ColumnModel cm = getDataGrid().getNextColumnModel();
             setColumnModel(cm);
+
+            cm.setValue(_value);
+            cm.setHeaderText(_headerText);
+            cm.setFooterText(_footerText);
+            if(_filterable != null)
+                cm.setFilterable(_filterable);
+            cm.setFilterExpression(_filterExpression);
+            if(_sortable != null)
+                cm.setSortable(_sortable);
+            cm.setSortExpression(_sortExpression);
+
+            // allow subclasses to apply attributes to their ColumnModel 
objects
+            applyAttributes();
         }
 
         if(columnsRenderState == Columns.DATA_RENDER_STATE)
@@ -123,82 +140,81 @@
         if(_logger.isDebugEnabled()) _logger.debug("end tag");
 
         int retVal = EVAL_PAGE;
-        int renderType = getDataGrid().getRenderType();
         int gridRenderState = getDataGrid().getRenderState();
 
-        if(renderType == DataGrid.JSP_TAG_RENDERING)
+        if (gridRenderState == DataGrid.START_RENDER_STATE)
+        {
+            retVal = EVAL_PAGE;
+        }
+        else if (gridRenderState == DataGrid.GRID_RENDER_STATE)
         {
-            if(gridRenderState == DataGrid.START_RENDER_STATE)
+            StringBuffer buf = new StringBuffer();
+            int renderState = getColumnsTag().getRenderState();
+            ColumnModel cm = getColumnModel();
+
+            // todo: need to assert that the identityHashCode of 'cm' is 
well-known
+            DataGridModel dgm = getDataGrid().getDataGridModel();
+
+            if (_logger.isDebugEnabled())
             {
-                retVal = EVAL_PAGE;
+                _logger.debug("current column\n\trender state: " + 
renderState);
+                _logger.debug("\tmodel: " + cm);
+                _logger.debug("\tidentity hash code: " + 
System.identityHashCode(cm));
             }
-            else if(gridRenderState == DataGrid.GRID_RENDER_STATE)
+
+            assert dgm != null;
+            assert cm != null;
+
+            if (renderState == Columns.HEADER_RENDER_STATE)
             {
-                StringBuffer buf = new StringBuffer();
-                int renderState = getColumnsTag().getRenderState();
-                ColumnModel cm = getColumnModel();
-                // @todo: need to assert that the identityHashCode of 'cm' is 
well-known
-                DataGridModel dgm = getDataGrid().getDataGridModel();
-                
-                if(_logger.isDebugEnabled()) _logger.debug("current column 
render state: " + renderState);
-                if(_logger.isDebugEnabled()) _logger.debug("current column 
model: " + cm);
-                
-                assert dgm != null;
-                assert cm != null;
-                
-                if(renderState == Columns.HEADER_RENDER_STATE)
-                {
-                    if(_logger.isDebugEnabled()) _logger.debug("render a 
column's header cell");
-                    
-                    cm.openHeaderCell(buf);
-                    cm.renderHeader(buf);
-                    cm.closeHeaderCell(buf);
-                }
-                else if(renderState == Columns.DATA_RENDER_STATE)
-                {
-                    if(_logger.isDebugEnabled()) _logger.debug("render a 
column's data cell");
+                if (_logger.isDebugEnabled()) _logger.debug("render a column's 
header cell");
 
-                    cm.onDataCellPreRender();
-                    
-                    int index = getDataGrid().getCurrentIndex();
-                    int groupDepth = dgm.getGroupDepth();
-
-                    if(_logger.isDebugEnabled()) _logger.debug("column index: 
" + index);
-
-                    // handle grouping
-                    boolean disableGroup = false;
-                    if(groupDepth > Columns.NO_GROUPING && index < groupDepth)
-                    {
-                        if(index == 0)
-                        {
-                            if(cm.getCanGroup())
-                                cm.setShouldGroup(true);
-                        }
-                        else 
-                        {
-                            ColumnModel prevColumn = dgm.getColumn(index-1);
-                            if(cm.getShouldGroup() && cm.getCanGroup())
-                                cm.setShouldGroup(true);
-                        }
-                    }
+                cm.openHeaderCell(buf);
+                cm.renderHeader(buf);
+                cm.closeHeaderCell(buf);
+            }
+            else if (renderState == Columns.DATA_RENDER_STATE)
+            {
+                if (_logger.isDebugEnabled()) _logger.debug("render a column's 
data cell");
 
-                    cm.openDataCell(buf);
-                    cm.renderDataCell(buf);
-                    cm.closeDataCell(buf);
-                    cm.onDataCellPostRender();
-                }
-                else if(renderState == Columns.FOOTER_RENDER_STATE)
+                cm.onDataCellPreRender();
+
+                int index = getDataGrid().getCurrentIndex();
+                int groupDepth = dgm.getGroupDepth();
+
+                if (_logger.isDebugEnabled()) _logger.debug("column index: " + 
index);
+
+                // handle grouping
+                if (groupDepth > Columns.NO_GROUPING && index < groupDepth)
                 {
-                    if(_logger.isDebugEnabled()) _logger.debug("render a 
column's footer cell");
-                    
-                    cm.openFooterCell(buf);
-                    cm.renderFooterCell(buf);
-                    cm.closeFooterCell(buf);
+                    if (index == 0)
+                    {
+                        if (cm.getCanGroup())
+                            cm.setShouldGroup(true);
+                    }
+                    else
+                    {
+                        if (cm.getShouldGroup() && cm.getCanGroup())
+                            cm.setShouldGroup(true);
+                    }
                 }
-                
-                if(buf != null && buf.length() > 0)
-                    getDataGrid().appendContent(buf.toString());
+
+                cm.openDataCell(buf);
+                cm.renderDataCell(buf);
+                cm.closeDataCell(buf);
+                cm.onDataCellPostRender();
+            }
+            else if (renderState == Columns.FOOTER_RENDER_STATE)
+            {
+                if (_logger.isDebugEnabled()) _logger.debug("render a column's 
footer cell");
+
+                cm.openFooterCell(buf);
+                cm.renderFooterCell(buf);
+                cm.closeFooterCell(buf);
             }
+
+            if (buf != null && buf.length() > 0)
+                getDataGrid().appendContent(buf.toString());
         }
 
         localRelease();
@@ -211,15 +227,27 @@
         super.localRelease();
         _parent = null;
         _dataGrid = null;
+
+        _value = null;
+        _filterable = null;
+        _filterExpression = null;
+        _sortable = null;
+        _sortExpression = null;
+        _headerText = null;
+        _footerText = null;
     }
 
     protected abstract ColumnModel getColumnModel();
 
     protected abstract void setColumnModel(ColumnModel model);
 
-    // @todo: cache this
+    protected void applyAttributes()
+    {
+    }
+
     protected Columns getColumnsTag()
     {
+        // todo: error reporting
         assert getParent() instanceof Columns;
         
         if(_parent != null)
@@ -232,13 +260,15 @@
 
     protected DataGrid getDataGrid()
     {
+        if(_dataGrid != null)
+            return _dataGrid;
+
         Tag dataGrid = findAncestorWithClass(this, DataGrid.class);
         
         assert dataGrid != null;
         _dataGrid = (DataGrid)dataGrid;
 
-        // @todo: error reporting
-        
+        // todo: error reporting
         return _dataGrid;
     }
 

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AnchorColumn.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AnchorColumn.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/AnchorColumn.java
    Tue Jul 27 09:55:01 2004
@@ -89,28 +89,29 @@
 
     private AnchorColumnModel _column;
 
+    private String _href = null;
+    private String _scope = null;
+    private String _action = null;
+
     /**
-     * @jsptagref.attributedescription
-     * The URL that is invoked when the column header is clicked.
-     * 
+     * @jsptagref.attributedescription The URL that is invoked when the column 
header is clicked.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>string_href</i>
      *
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setHref(String href) 
{((AnchorColumnModel)getColumnModel()).setHref(href);}
+    public void setHref(String href) {_href = href;}
 
     /**
      * @netui:attribute required="false"
      */ 
-    public void setScope(String scope) 
{((AnchorColumnModel)getColumnModel()).setScopeId(scope);}
+    public void setScope(String scope) {_scope = scope;}
 
     /**
      * @netui:attribute required="false"
      * @netui.tldx:attribute category="general" reftype="netui-action-url"
      */ 
-    public void setAction(String action) 
{((AnchorColumnModel)getColumnModel()).setAction(action);}
+    public void setAction(String action) {_action = action;}
 
     public void addParameter(String name, Object value)
         throws JspException
@@ -123,15 +124,26 @@
         return "AnchorColumn";
     }
 
+    protected void applyAttributes()
+    {
+        _column.setAction(_action);
+        _column.setHref(_href);
+        _column.setScopeId(_scope);        
+    }
+
     public void localRelease()
     {
         super.localRelease();
         _column.removeAllParameters();
         _column = null;
+        _href = null;
+        _scope = null;
+        _action = null;
     }
 
     protected void setColumnModel(ColumnModel column)
     {
+        assert column instanceof AnchorColumnModel;
         _column = (AnchorColumnModel)column;
     }
 

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/Columns.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/Columns.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/Columns.java
 Tue Jul 27 09:55:01 2004
@@ -87,11 +87,8 @@
     public String getTagName() {return "Columns";}
     
     /**
-     * @jsptagref.attributedescription
-     * The action method that will handle the filter operation.
-     * 
+     * @jsptagref.attributedescription The action method that will handle the 
filter operation.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>string_filterAction</i>
      *
      * @netui:attribute required="false"
@@ -99,11 +96,8 @@
     public void setFilterAction(String filterAction) {_filterAction = 
filterAction;}
 
     /**
-     * @jsptagref.attributedescription
-     * The action method that will handle the sort operation.
-     * 
+     * @jsptagref.attributedescription The action method that will handle the 
sort operation.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>string_sortAction</i>
      *
      * @netui:attribute required="false"
@@ -114,13 +108,11 @@
      * @netui:attribute required="false"
      */
     public void setDefaultSortable(boolean sortable) {_sortable = new 
Boolean(sortable);}
-    public Boolean getDefaultSortable(boolean sortable) {return _sortable;}
 
     /**
      * @netui:attribute required="false"
      */
     public void setDefaultFilterable(boolean filterable) {_filterable = new 
Boolean(filterable);}
-    public Boolean getDefaultFilterable(boolean filterable) {return 
_filterable;}
 
     /**
      * @netui:attribute required="false"
@@ -134,22 +126,19 @@
         assert _grid != null;
         _gridModel = _grid.getDataGridModel();
 
-        int gridRenderType = _grid.getRenderType();
-        if(gridRenderType == DataGrid.JSP_TAG_RENDERING)
+        int gridRenderState = _grid.getRenderState();
+        if (gridRenderState == DataGrid.START_RENDER_STATE)
         {
-            int gridRenderState = _grid.getRenderState();
-            if(gridRenderState == DataGrid.START_RENDER_STATE)
-            {
-            }
-            else if(gridRenderState == DataGrid.GRID_RENDER_STATE)
-            {
-                StringBuffer content = new StringBuffer();
-                _renderState = HEADER_RENDER_STATE;
-                _gridModel.openHeaderRow(content);
-                _grid.appendContent(content.toString());
-            }
+            // no-op
         }
-        
+        else if (gridRenderState == DataGrid.GRID_RENDER_STATE)
+        {
+            StringBuffer content = new StringBuffer();
+            _renderState = HEADER_RENDER_STATE;
+            _gridModel.openHeaderRow(content);
+            _grid.appendContent(content.toString());
+        }
+
         return EVAL_BODY_BUFFERED;
     }
 
@@ -157,69 +146,64 @@
     {
         int retVal = EVAL_BODY_BUFFERED;
 
-        int gridRenderType = _grid.getRenderType();
-        if(gridRenderType == DataGrid.JSP_TAG_RENDERING)
+        int gridRenderState = _grid.getRenderState();
+        if (gridRenderState == DataGrid.START_RENDER_STATE)
         {
-            int gridRenderState = _grid.getRenderState();
-            if(gridRenderState == DataGrid.START_RENDER_STATE)
+            retVal = SKIP_BODY;
+        }
+        else if (gridRenderState == DataGrid.GRID_RENDER_STATE)
+        {
+            _grid.resetColumnModelIndex();
+            StringBuffer content = new StringBuffer();
+            if (_renderState == HEADER_RENDER_STATE)
             {
-                retVal = SKIP_BODY;
+                _gridModel.closeHeaderRow(content);
+                _gridModel.openDataRow(content);
+
+                //_gridModel.moveCursorToStart();
+                // prime the pump with the next item of data to render
+                if (_gridModel.hasNextDataItem()) // && 
!_gridModel.endDataSet())
+                {
+                    _gridModel.nextDataItem();
+                    _renderState = DATA_RENDER_STATE;
+                }
+                else
+                {
+                    // todo: need to handle the "no-data" case here
+                    _renderState = FOOTER_RENDER_STATE;
+                }
             }
-            else if(gridRenderState == DataGrid.GRID_RENDER_STATE)
+            else if (_renderState == DATA_RENDER_STATE)
             {
-                _grid.resetColumnModelIndex();
-                StringBuffer content = new StringBuffer();
-                if(_renderState == HEADER_RENDER_STATE)
+                _gridModel.closeDataRow(content);
+                if (_gridModel.hasNextDataItem()) // && 
!_gridModel.endDataSet())
                 {
-                    _gridModel.closeHeaderRow(content);
                     _gridModel.openDataRow(content);
-                    
-                    _gridModel.moveCursorToStart();
-                    // prime the pump with the next item of data to render
-                    if(_gridModel.hasNextDataItem() && 
!_gridModel.endDataSet())
-                    {
-                        _gridModel.nextDataItem();
-                        _renderState = DATA_RENDER_STATE;
-                    }
-                    else
-                    {
-                        // @todo: need to handle the "no-data" case here
-                        _renderState = FOOTER_RENDER_STATE;
-                    }
+                    _gridModel.nextDataItem();
                 }
-                else if(_renderState == DATA_RENDER_STATE)
+                else
                 {
-                    _gridModel.closeDataRow(content);
-                    if(_gridModel.hasNextDataItem() && 
!_gridModel.endDataSet())
+                    if (_gridModel.shouldRenderFooter())
                     {
-                        _gridModel.openDataRow(content);
-                        _gridModel.nextDataItem();
+                        _renderState = FOOTER_RENDER_STATE;
+                        DataGridModel.openFooterRow(content);
                     }
-                    else 
+                    else
                     {
-                        if(_gridModel.shouldRenderFooter())
-                        {
-                            _renderState = FOOTER_RENDER_STATE;
-                            _gridModel.openFooterRow(content);
-                        }
-                        else 
-                        {
-                            _renderState = -1;
-                            retVal = SKIP_BODY;
-                        }
+                        _renderState = -1;
+                        retVal = SKIP_BODY;
                     }
                 }
-                else if(_renderState == FOOTER_RENDER_STATE)
-                {
-                     _gridModel.closeFooterRow(content);
-                    _renderState = -1;
-                    retVal = SKIP_BODY;
-                }
-                
-                _grid.appendContent(content.toString());                
             }
+            else if (_renderState == FOOTER_RENDER_STATE)
+            {
+                DataGridModel.closeFooterRow(content);
+                _renderState = -1;
+                retVal = SKIP_BODY;
+            }
+
+            _grid.appendContent(content.toString());
         }
-        else retVal = SKIP_BODY;
 
         if(_logger.isDebugEnabled()) _logger.debug("render columns body with 
state: " + _renderState);
         return retVal;

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/DataGrid.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/DataGrid.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/DataGrid.java
        Tue Jul 27 09:55:01 2004
@@ -18,31 +18,30 @@
  */
 package org.apache.beehive.netui.tags.datagrid;
 
-// java imports
 import java.util.List;
+import java.util.Iterator;
 
 import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.JspException;
 
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
 import org.apache.beehive.netui.datagrid.model.DataGridModel;
 import org.apache.beehive.netui.datagrid.model.impl.DefaultStylePolicy;
 import org.apache.beehive.netui.datagrid.model.impl.EmptyStylePolicy;
 import org.apache.beehive.netui.datagrid.model.impl.LegacyStylePolicy;
+import org.apache.beehive.netui.datagrid.util.PagedDataSet;
 
 import org.apache.beehive.netui.tags.AbstractBaseTag;
 import org.apache.beehive.netui.script.common.IDataAccessProvider;
+import org.apache.beehive.netui.script.common.DataAccessProviderStack;
 import org.apache.beehive.netui.util.logging.Logger;
-
-// external imports
+import org.apache.beehive.netui.util.iterator.IteratorFactory;
 
 /**
- * @todo: need to expose a ColumnIterator so that the "current" column can be 
- *        fetched by the child tags
+ * todo: need to expose a ColumnIterator so that the "current" column can be 
fetched by the child tags
  *
  * @netui:tag name="dataGrid" description="Renders an HTML table containing a 
data set"
- * @netui.tldx:tag whitespace="indent" 
- *                 renderer="workshop.netui.jspdesigner.tldx.GridRenderer" 
+ * @netui.tldx:tag whitespace="indent" 
renderer="workshop.netui.jspdesigner.tldx.GridRenderer"
  *                 netuiexpressioninfo=""
  */
 public class DataGrid
@@ -57,22 +56,24 @@
     public static final int START_RENDER_STATE = 10;
     public static final int GRID_RENDER_STATE = 20;
     public static final int END_RENDER_STATE = 30;
-    
+
+    public static final String DEFAULT_STYLE_POLICY = "default";
+
     private DataGridModel _gridModel = null;
-    private JspWriter _out = null;
     private String _name = null;
-    private String _cssClassPolicy = "default"; 
-    
-    private int _renderType = JSP_TAG_RENDERING; 
+    private String _cssClassPolicy = DEFAULT_STYLE_POLICY;
+    private String _dataSource = null;
+
     private int _renderState = START_RENDER_STATE;
-    
-    private ColumnModel _currentColumn = null;
+
+    // todo: switch to StringBuilder or Writer / StringWriter
     private StringBuffer _content = null;
     private int _columnModelIndex = 0;
 
     public DataGrid()
     {
         super();
+
         _gridModel = new DataGridModel(this);
     }
 
@@ -89,83 +90,84 @@
     /**
      * @netui:attribute required="false"
      */
-    public void setCssClassPolicy(String cssClassPolicy)
-    {
-        _cssClassPolicy = cssClassPolicy;
-    }
+    public void setCssClassPolicy(String cssClassPolicy) {_cssClassPolicy = 
cssClassPolicy;}
 
     public void setGroupDepth(int groupDepth) 
{_gridModel.setGroupDepth(groupDepth);}
 
     public int doStartTag()
+        throws JspException
     {
-        _out = pageContext.getOut();
         _gridModel.setPageContext(pageContext);
         _gridModel.setName(_name);
 
+        // String dataSource
+        String dataSource = getDataSource();
+        dataSource = "{" + dataSource + "}";
+
+        // ensure the dataSource is a valid expression
+        String validExpr = ensureValidExpression(dataSource, "dataSource", 
"DataSourceError");
+        Object ds = evaluateExpression(validExpr, "dataSource");
+        Iterator iterator = IteratorFactory.createIterator(ds);
+        PagedDataSet dataSet = new PagedDataSet(dataSource, iterator);
+
+        _gridModel.setDataSet(dataSet);
+
         if(_cssClassPolicy.equals("default"))
-            // @todo: allocate and reuse for all grids
+            // todo: perf -- allocate and reuse for all grids
             _gridModel.setCssPolicy(new DefaultStylePolicy());
         else if(_cssClassPolicy.equals("none"))
             _gridModel.setCssPolicy(new EmptyStylePolicy());
         else if(_cssClassPolicy.equals("legacy"))
             _gridModel.setCssPolicy(new LegacyStylePolicy());
 
-        if(_renderType == JSP_TAG_RENDERING)
-        {
-            // @todo: implement state machine rendering here...
-            _renderState = START_RENDER_STATE;
-            _content = new StringBuffer();
-        }
-        
+        // todo: implement state machine rendering here...
+        _renderState = START_RENDER_STATE;
+        _content = new StringBuffer();
+
+        // todo: optimize -- this doesn't need to happen when the data set is 
empty
+        DataAccessProviderStack.addDataAccessProvider(this, pageContext);
+
         return EVAL_BODY_BUFFERED;
     }
 
     public int doAfterBody()
     {
-        if(_renderType == DATAGRID_MODEL_RENDERING)
-            return SKIP_BODY;
-        else
+        int retVal = EVAL_BODY_BUFFERED;
+        if (_renderState == START_RENDER_STATE)
         {
-            int retVal = EVAL_BODY_BUFFERED;
-            if(_renderState == START_RENDER_STATE)
+            // print the column information
+            if (_logger.isDebugEnabled())
             {
-                // print the column information
-                if(_logger.isDebugEnabled())
+                _logger.debug("registered columns:");
+                List columns = _gridModel.getColumns();
+                for (int i = 0; i < columns.size(); i++)
                 {
-                    _logger.debug("registered columns:");
-                    List columns = _gridModel.getColumns();
-                    for(int i = 0; i < columns.size(); i++)
-                    {
-                        _logger.debug("column[" + i + "]: " + 
columns.get(i).getClass().getName());
-                    }
+                    _logger.debug("column[" + i + "]: " + 
columns.get(i).getClass().getName());
                 }
-                _gridModel.initialize();
-                _gridModel.renderPager(_content);
-                _gridModel.openTable(_content);
-                
-                _renderState = GRID_RENDER_STATE;
             }
-            else if(_renderState == GRID_RENDER_STATE)
-            {
-                _gridModel.closeTable(_content);
-                // @todo: need something like this to un-init the data set / 
set the index to -1 / etc
-                //_gridModel.destroy();
+            _gridModel.initialize();
+            _gridModel.renderPager(_content);
+            _gridModel.openTable(_content);
 
-                _renderState = END_RENDER_STATE;
-                retVal = SKIP_BODY;
-            }
-            else throw new RuntimeException("The DataGrid's render state '" + 
_renderState + "' is invalid");
-            
-            return retVal;
+            _renderState = GRID_RENDER_STATE;
         }
+        else if (_renderState == GRID_RENDER_STATE)
+        {
+            _gridModel.closeTable(_content);
+            // todo: need something like this to un-init the data set / set 
the index to -1 / etc
+            //_gridModel.destroy();
+
+            _renderState = END_RENDER_STATE;
+            retVal = SKIP_BODY;
+        }
+        else throw new RuntimeException("The DataGrid's render state '" + 
_renderState + "' is invalid");
+
+        return retVal;
     }
 
     public int doEndTag()
     {
-        if(_renderType == DATAGRID_MODEL_RENDERING)
-            _gridModel.render(_out);
-        else
-            write(_content.toString());
+        write(_content.toString());
 
         localRelease();
         
@@ -175,12 +177,10 @@
     public void localRelease()
     {
         super.localRelease();
+
         _gridModel = new DataGridModel(this);
-        _out = null;
-        _cssClassPolicy = "default";
-        _currentColumn = null;
+        _cssClassPolicy = DEFAULT_STYLE_POLICY;
         _renderState = START_RENDER_STATE;
-        _renderType = JSP_TAG_RENDERING;
         _columnModelIndex = 0;
         _content = null;
         _name = null;
@@ -222,18 +222,11 @@
         return _renderState;
     }
 
-    public int getRenderType()
-    {
-        return _renderType;
-    }
-    
     public void appendContent(String content)
     {
         if(_content == null)
             _content = new StringBuffer();
 
-        if(_logger.isDebugEnabled()) _logger.debug("adding content:::::\n" + 
content.toString() + "\n:::::\n");
-        
         _content.append(content);
     }
 
@@ -266,12 +259,12 @@
      */
     public void setDataSource(String dataSource)
     {
-        _gridModel.setDataSource(dataSource);
+        _dataSource = dataSource;
     }
 
     public String getDataSource()
     {
-        return _gridModel.getDataSource();
+        return _dataSource;
     }
     
     public IDataAccessProvider getProviderParent()

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/ImageColumn.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/ImageColumn.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/ImageColumn.java
     Tue Jul 27 09:55:01 2004
@@ -18,16 +18,10 @@
  */
 package org.apache.beehive.netui.tags.datagrid;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.impl.ImageColumnModel;
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
-import org.apache.beehive.netui.tags.AbstractBaseTag;
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
  *
  * @jsptagref.tagdescription
@@ -49,70 +43,64 @@
     private static final Logger logger = Logger.getInstance(ImageColumn.class);
 
     private ImageColumnModel _column;
+    private String _src = null;
+    private String _align = null;
+    private String _hspace = null;
+    private String _vspace = null;
+    private String _border = null;
+    private String _height = null;
+    private String _width = null;
 
     /**
-     * @jsptagref.attributedescription
-     * The source of the image to display.
-     * 
+     * @jsptagref.attributedescription The source of the image to display.
      * @jsptagref.databindable Read Only
-     * 
      * @jsptagref.attributesyntaxvalue <i>literal_or_expression_src</i>
      *
-     * @netui:attribute required="true"
-     * @netui.tldx:attribute language="netuiexpression"
+     * @netui:attribute required="true" rtexprvalue="true"
      */
-    public void setSrc(String src) 
{((ImageColumnModel)getColumnModel()).setSrc(src);}
+    public void setSrc(String src) {_src = src;}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setAlign(String align) 
{((ImageColumnModel)getColumnModel()).setAlign(align);}
+    public void setAlign(String align) {_align = align;}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setHspace(String hspace) 
{((ImageColumnModel)getColumnModel()).setHspace(hspace);}
+    public void setHspace(String hspace) {_hspace = hspace;}
 
     /**
-     * @jsptagref.attributedescription
-     * Integer. The width of the border around the image.
-     * 
+     * @jsptagref.attributedescription Integer. The width of the border around 
the image.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>integer_border</i>
      *
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setVspace(String vspace) 
{((ImageColumnModel)getColumnModel()).setVspace(vspace);}
+    public void setVspace(String vspace) {_vspace = vspace;}
 
     /**
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setBorder(String border) 
{((ImageColumnModel)getColumnModel()).setBorder(border);}
+    public void setBorder(String border) {_border = border;}
 
     /**
-     * @jsptagref.attributedescription
-     * Integer. The height of the image to be displayed in pixels.
-     * 
+     * @jsptagref.attributedescription  Integer. The height of the image to be 
displayed in pixels.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>integer_height</i>
      *
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setHeight(String height) 
{((ImageColumnModel)getColumnModel()).setHeight(height);}
+    public void setHeight(String height) {_height = height;}
 
     /**
-     * @jsptagref.attributedescription
-     * Integer. The width of the image to be displayed in pixels.
-     * 
+     * @jsptagref.attributedescription Integer. The width of the image to be 
displayed in pixels.
      * @jsptagref.databindable false
-     * 
      * @jsptagref.attributesyntaxvalue <i>integer_width</i>
      *
-     * @netui:attribute required="false"
+     * @netui:attribute required="false" rtexprvalue="true"
      */
-    public void setWidth(String width) 
{((ImageColumnModel)getColumnModel()).setWidth(width);}
+    public void setWidth(String width) {_width = width;}
 
     public String getTagName()
     {
@@ -123,10 +111,29 @@
     {
         super.localRelease();
         _column = null;
+        _src = null;
+        _border = null;
+        _height = null;
+        _width = null;
+        _hspace = null;
+        _vspace = null;
+        _align = null;
+    }
+
+    protected void applyAttributes()
+    {
+        _column.setSrc(_src);
+        _column.setBorder(_border);
+        _column.setHeight(_height);
+        _column.setWidth(_width);
+        _column.setHspace(_hspace);
+        _column.setVspace(_vspace);
+        _column.setAlign(_align);
     }
 
     protected void setColumnModel(ColumnModel column)
     {
+        assert column instanceof ImageColumnModel;
         _column = (ImageColumnModel)column;
     }
 
@@ -137,3 +144,4 @@
         else return _column;
     }
 }
+

Modified: 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/LiteralColumn.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/LiteralColumn.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/tags-datagrid/org/apache/beehive/netui/tags/datagrid/LiteralColumn.java
   Tue Jul 27 09:55:01 2004
@@ -18,16 +18,9 @@
  */
 package org.apache.beehive.netui.tags.datagrid;
 
-// java imports
-import javax.servlet.jsp.JspException;
-
-// internal imports
 import org.apache.beehive.netui.datagrid.model.ColumnModel;
-import org.apache.beehive.netui.tags.AbstractBaseTag;
 import org.apache.beehive.netui.util.logging.Logger;
 
-// external imports
-
 /**
  *
  * @netui:tag name="literalColumn" description="Renders a column of data in a 
NetUI grid"
@@ -55,6 +48,7 @@
 
     protected void setColumnModel(ColumnModel column)
     {
+        assert column instanceof ColumnModel;
         _column = column;
     }
 

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/Controller.jpf
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/Controller.jpf
    (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/Controller.jpf
    Tue Jul 27 09:55:01 2004
@@ -1,27 +1,33 @@
 /*
+ * B E A   S Y S T E M S
+ * Copyright 2002-2004  BEA Systems, Inc.
  *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
  */
 package databinding.datagrid.basic;
 
-// java imports
-
-// internal imports
 import org.apache.beehive.netui.pageflow.Forward;
 import org.apache.beehive.netui.pageflow.PageFlowController;
 import org.apache.beehive.netui.pageflow.annotations.Jpf;
 
-// external imports
-
 /**
  *
  */
 public class Controller
     extends PageFlowController
 {
-    /**
-     * @jpf:action
-     * @jpf:forward name="success" path="index.jsp"
-     */
     @Jpf.Action(
         forwards = {
             @Jpf.Forward(
@@ -29,21 +35,6 @@
                 path = "index.jsp") 
         })
     public Forward begin()
-    {
-        return new Forward("success");
-    }
-
-    /**
-     * @jpf:action
-     * @jpf:forward name="success" path="actionTest.jsp"
-     */
-    @Jpf.Action(
-        forwards = {
-            @Jpf.Forward(
-                name = "success",
-                path = "actionTest.jsp") 
-        })
-    public Forward postback()
     {
         return new Forward("success");
     }

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/index.jsp
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/index.jsp
 (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/basic/index.jsp
 Tue Jul 27 09:55:01 2004
@@ -3,26 +3,23 @@
 <%@ taglib uri="beehive-netui-tags-databinding.tld" prefix="netui-data"%>
 <%@ taglib uri="beehive-netui-tags-template.tld" prefix="netui-template"%>
 <%@ taglib uri="beehive-netui-tags-datagrid.tld" prefix="netui-datagrid"%>
+<%@ page 
import="org.apache.beehive.netui.script.common.DataAccessProviderBean"%>
 <netui-template:template templatePage="../site/template.jsp">
     <netui-template:setAttribute name="title" value="Basic Data Grid"/>
     <netui-template:section name="body">
     <p>
 <%@ include file="../util/portfolioXmlBean.jsp" %>
 <br/>
-<br/>
 <netui-datagrid:dataGrid dataSource="pageContext.stocks" name="portfolio">
     <netui-datagrid:columns defaultSortable="true" defaultFilterable="false" 
sortAction="index.jsp" filterAction="index.jsp">
         <netui-datagrid:literalColumn headerText="Symbol" 
value="${container.item.symbol}" sortExpression="symbol"/>
-        <netui-datagrid:anchorColumn headerText="Web" 
href="${container.item.web}" value="${container.item.name}" 
sortExpression="web">
-            <netui-datagrid:parameter name="rowid" value="${container.index}"/>
-            <netui-datagrid:parameter name="symbol" 
value="${container.item.symbol}"/>
+        <netui-datagrid:literalColumn sortable="false" headerText="Price" 
value="${container.item.price}"/>
+        <netui-datagrid:anchorColumn headerText="Web" 
href="${container.item.web}" value="${container.item.name}">
+            <netui:parameter name="rowid" value="${container.index}"/>
+            <netui:parameter name="symbol" value="${container.item.symbol}"/>
         </netui-datagrid:anchorColumn>
-        <netui-datagrid:literalColumn sortable="false" headerText="Price" 
value="${container.item.price}">
-            <netui:formatNumber pattern="$#,###,###.00" type="currency"/>
-        </netui-datagrid:literalColumn>
     </netui-datagrid:columns>
 </netui-datagrid:dataGrid>
-<br/>
 <br/>
 <netui:anchor href="index.jsp">Reset</netui:anchor>
 <br/>

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/util/portfolioXmlBean.jsp
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/util/portfolioXmlBean.jsp
       (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/util/portfolioXmlBean.jsp
       Tue Jul 27 09:55:01 2004
@@ -1,8 +1,6 @@
-
 <%--
-    Create a portfolio XMLBean in pageContext.stocks
+    Create a portfolio XMLBean in pageContext.stocks.
 --%>
-
 <%
 try
 {
@@ -14,4 +12,4 @@
 {
     out.write("exception: " + e.toString());
 }
-%>  
+%>

Reply via email to