daily pastebin goal
17%
SHARE
TWEET

Abstract PageableDatamodel

a guest Mar 12th, 2011 120 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package org.luca.jsf.model.rf;
  2.  
  3. import java.io.Serializable;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import javax.faces.context.FacesContext;
  9.  
  10. import org.ajax4jsf.model.DataVisitor;
  11. import org.ajax4jsf.model.ExtendedDataModel;
  12. import org.ajax4jsf.model.Range;
  13. import org.ajax4jsf.model.SequenceRange;
  14. import org.luca.domain.Identifiable;
  15.  
  16.  
  17. /**
  18.  * Scrollable datamodel based on:
  19.  * http://gochev.blogspot.com/2009/08/richfaces-server-side-paging-with.html
  20.  */
  21. public abstract class PageableDatamodel<T extends Identifiable> extends ExtendedDataModel<T>
  22.                 implements Serializable
  23. {
  24.  
  25.         private Integer currentId;
  26.  
  27.         private Integer rowCount;
  28.  
  29.         private Map<Integer, T> wrappedData = new HashMap<Integer, T>();
  30.  
  31.  
  32.         /**
  33.          * Returns an item by id.
  34.          *
  35.          * @param start
  36.          * @param numberOfRows
  37.          * @return
  38.          */
  39.         protected abstract T getItemById( Integer id );
  40.  
  41.  
  42.         /**
  43.          * Returns a data page.
  44.          *
  45.          * @param start
  46.          * @param numberOfRows
  47.          * @return
  48.          */
  49.         protected abstract List<T> getItemsRanged( int start, int numberOfRows );
  50.  
  51.  
  52.         /**
  53.          * Returns the total count for items.
  54.          *
  55.          * @return
  56.          */
  57.         protected abstract int getItemsTotalCount();
  58.  
  59.  
  60.         /**
  61.          * This method never called from framework. (non-Javadoc)
  62.          *
  63.          * @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
  64.          */
  65.         @Override
  66.         public Object getRowKey()
  67.         {
  68.                 return currentId;
  69.         }
  70.  
  71.  
  72.         /**
  73.          * This method normally called by Visitor before request Data Row.
  74.          */
  75.         @Override
  76.         public void setRowKey( Object key )
  77.         {
  78.                 this.currentId = (Integer) key;
  79.         }
  80.  
  81.  
  82.         /**
  83.          * This is main part of Visitor pattern. Method called by framework many times during request
  84.          * processing.
  85.          */
  86.         @Override
  87.         public void walk( FacesContext context, DataVisitor visitor, Range range, Object argument )
  88.         {
  89.                 int firstRow = ((SequenceRange) range).getFirstRow();
  90.                 int numberOfRows = ((SequenceRange) range).getRows();
  91.  
  92.                 for ( T item : getItemsRanged( firstRow, numberOfRows ) )
  93.                 {
  94.                         wrappedData.put( item.getId(), item );
  95.                         visitor.process( context, item.getId(), argument );
  96.                 }
  97.         }
  98.  
  99.  
  100.         @Override
  101.         public int getRowCount()
  102.         {
  103.                 if ( null == rowCount )
  104.                 {
  105.                         rowCount = getItemsTotalCount();
  106.                         return rowCount;
  107.                 }
  108.                 else
  109.                 {
  110.                         return rowCount;
  111.                 }
  112.         }
  113.  
  114.  
  115.         /**
  116.          * This is main way to obtain data row. It is intensively used by framework. We strongly
  117.          * recommend use of local cache in that method.
  118.          */
  119.         @Override
  120.         public T getRowData()
  121.         {
  122.                 if ( currentId == null )
  123.                 {
  124.                         return null;
  125.                 }
  126.                 else
  127.                 {
  128.                         T ret = wrappedData.get( currentId );
  129.                         if ( null == ret )
  130.                         {
  131.                                 ret = getItemById( currentId );
  132.                                 wrappedData.put( currentId, ret );
  133.                                 return ret;
  134.                         }
  135.                         else
  136.                         {
  137.                                 return ret;
  138.                         }
  139.                 }
  140.         }
  141.  
  142.  
  143.         /**
  144.          * Never called by framework.
  145.          */
  146.         @Override
  147.         public boolean isRowAvailable()
  148.         {
  149.                 if ( null == currentId )
  150.                 {
  151.                         return false;
  152.                 }
  153.                 else
  154.                 {
  155.                         return (null != wrappedData.get( currentId ));
  156.                 }
  157.         }
  158.  
  159.  
  160.         /**
  161.          * Unused rudiment from old JSF staff.
  162.          */
  163.         @Override
  164.         public int getRowIndex()
  165.         {
  166.                 return 0;
  167.         }
  168.  
  169.  
  170.         /**
  171.          * Unused rudiment from old JSF staff.
  172.          */
  173.         @Override
  174.         public void setRowIndex( int rowIndex )
  175.         {
  176.                 throw new UnsupportedOperationException();
  177.         }
  178.  
  179.  
  180.         /**
  181.          * Unused rudiment from old JSF staff.
  182.          */
  183.         @Override
  184.         public Object getWrappedData()
  185.         {
  186.                 throw new UnsupportedOperationException();
  187.         }
  188.  
  189.  
  190.         /**
  191.          * Unused rudiment from old JSF staff.
  192.          */
  193.         @Override
  194.         public void setWrappedData( Object data )
  195.         {
  196.                 throw new UnsupportedOperationException();
  197.         }
  198.  
  199. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top