Author: hlship
Date: Sun Mar  9 10:41:16 2008
New Revision: 635315

URL: http://svn.apache.org/viewvc?rev=635315&view=rev
Log:
TAPESTRY-2245: GridDataSource getAvailableRows() method called inefficiently

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Grid.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Grid.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Grid.java?rev=635315&r1=635314&r2=635315&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Grid.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Grid.java
 Sun Mar  9 10:41:16 2008
@@ -57,6 +57,12 @@
     private GridDataSource _source;
 
     /**
+     * A wrapper around the provided GridDataSource that caches access to the 
availableRows property. This is the source
+     * provided to sub-components.
+     */
+    private GridDataSource _cachingSource;
+
+    /**
      * The number of rows of data displayed on each page. If there are more 
rows than will fit, the Grid will divide up
      * the rows into "pages" and (normally) provide a pager to allow the user 
to navigate within the overall result
      * set.
@@ -207,7 +213,43 @@
     private FormSupport _formSupport;
 
     /**
-     * Default implementation only allows a single column to be the sort 
column, and stores the sort information as
+     * A version of GridDataSource that caches the availableRows property. 
This addresses TAPESTRY-2245.
+     */
+    class CachingDataSource implements GridDataSource
+    {
+        private boolean _availableRowsCached;
+
+        private int _availableRows;
+
+        public int getAvailableRows()
+        {
+            if (!_availableRowsCached)
+            {
+                _availableRows = _source.getAvailableRows();
+                _availableRowsCached = true;
+            }
+
+            return _availableRows;
+        }
+
+        public void prepare(int startIndex, int endIndex, List<SortConstraint> 
sortConstraints)
+        {
+            _source.prepare(startIndex, endIndex, sortConstraints);
+        }
+
+        public Object getRowValue(int index)
+        {
+            return _source.getRowValue(index);
+        }
+
+        public Class getRowType()
+        {
+            return _source.getRowType();
+        }
+    }
+
+    /**
+     * Default implementation that only allows a single column to be the sort 
column, and stores the sort information as
      * persistent fields of the Grid component.
      */
     class DefaultGridSortModel implements GridSortModel
@@ -314,14 +356,16 @@
 
         setupDataSource();
 
-        return _source.getAvailableRows() == 0 ? _empty : null;
+        return _cachingSource.getAvailableRows() == 0 ? _empty : null;
     }
 
     void setupDataSource()
     {
         // If there's no rows, display the empty block placeholder.
 
-        int availableRows = _source.getAvailableRows();
+        _cachingSource = new CachingDataSource();
+
+        int availableRows = _cachingSource.getAvailableRows();
 
         if (availableRows == 0) return;
 
@@ -338,7 +382,7 @@
 
         int endIndex = Math.min(startIndex + _rowsPerPage - 1, availableRows - 
1);
 
-        _source.prepare(startIndex, endIndex, _sortModel.getSortContraints());
+        _cachingSource.prepare(startIndex, endIndex, 
_sortModel.getSortContraints());
 
     }
 
@@ -347,7 +391,7 @@
         // Skip rendering of component (template, body, etc.) when there's 
nothing to display.
         // The empty placeholder will already have rendered.
 
-        if (_source.getAvailableRows() == 0) return false;
+        if (_cachingSource.getAvailableRows() == 0) return false;
 
         return null;
     }
@@ -359,7 +403,7 @@
 
     public GridDataSource getDataSource()
     {
-        return _source;
+        return _cachingSource;
     }
 
     public GridSortModel getSortModel()


Reply via email to