/*
 * Created on Jan 9, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package org.pva.beans;

import java.util.List;
import java.util.ArrayList;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 * @author Laszlo.Spoor
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class PagedObjectList
{
  // Logger
  protected Logger log = LogManager.getLogger(getClass());
  
  // De (sub) mList van objecten.
  protected List        mList;
  
  // De pagesize (pagesize) van de objectmList
  protected int         mPageSize;
  
  // De huidige positie waar het resultset naar moet kijken.
  private int           mCurrentRow;
    
  /**
   * Constructor
   */
  public PagedObjectList (List pList, int pPageSize, int pCurrentRow)
  {
    mList = pList;
    mPageSize = pPageSize;
    mCurrentRow = pCurrentRow;
   } //PagedObjectList
  
  /**
   * Returns the logger instance of this class
   * 
   * @return Logger
   */
  protected Logger log ()
  {
    return log;
  } //log()
  
  /**
   * Returns the List interface of this class
   * 
   * @return List a limited Collection of Objects
   */
  protected List getList ()
  {
    return mList;
  } //getList()

  /**
   * Haalt een subset op van de totale recordset. Er wordt eerst gekeken of de 
   * mPageSize + mCurrentRow niet groter is dan het resultaat, anders wordt
   * de maximale lengte teruggegeven. Indien de list was gecreerd door alleen de
   * List als parameter mee te geven, dan wordt de gehele lijst meegegeven.
   */
  public ArrayList getSubSetList()
  {
    List lst = null;
    if (mCurrentRow + mPageSize > mList.size())
    {
      lst = mList.subList(mCurrentRow, mList.size());
    } //if
    else
    {
      lst = mList.subList(mCurrentRow, mCurrentRow + mPageSize);
    } //else
    return new ArrayList(lst);
  } //getSubSetList()
    
  /**
   * Geeft de totale lengte van de mList.
   */
  public Integer getMaxSize()
  {
    return new Integer (mList.size()); 
  } //getMaxFetchSize()
  
  /**
   * Geeft de huidige positie op in de recordset.
   */
  public Integer getCurrentRow ()
  {
    return new Integer(mCurrentRow);
  } //getCurrentRow()
  
  /**
   * Geeft true als er een volgende resultset bestaat, false als dat niet het
   * geval is.
   */
  public boolean hasNextSet()
  {
    return (mList.size() > mCurrentRow + mPageSize) ? true : false;
  } //getHasNextSet()
  
  /**
   * Geeft true als er een vorige resultset van deze mList bestaat, false
   * als dit niet het geval is.
   */
  public boolean hasPreviousSet()
  {
    return (mCurrentRow > 0 ) ? true : false;
  } //getHasPreviousSet()
 
  /**
   * Geeft de mCurrentRow waarde van de volgende dataset. Indien er de mCurrentRow
   * + de paginaLengte groter is dan het resultset, dan wordt de maximale lengte
   * van de recordset terug gegeven.
   */
  public int getNextSet ()
  {
    if ( mList == null ) return 0;

    int result = mCurrentRow + mPageSize;
    if (result < mList.size())
    {
      return result;
    } //if
    else
    {
      return mList.size();
    } //else
  }  //getNextSet()
    
  /**
   * Bepaalt de mCurrentRow van de vorige record set. Indien de mCurrentRow negatief
   * wordt, dan wordt de mCurrentRow op 0 gezet.
   */
  public int getPreviousSet()
  {
    if (mList == null) return 0;
    
    int result = mCurrentRow - mPageSize;
    
    if (result > 0)
    {
      return result;    
    }
    else
    {
      return 0;
    } 
  } //getPrevious
      
} //PagedObjectList

