Advertisement
Guest User

Abstract PageableDatamodel

a guest
Mar 12th, 2011
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.56 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement