/**
   * Get data size
   *
   * @param pageContext
   * @param dataRecords
   * @param filterData
   * @return
   * @throws Exception
   */
  public static Integer getSmartDataSize(
      PageContext pageContext, Map<String, String> parameters, IDataRecordList<?> dataRecords)
      throws Exception {
    Integer dataSize = 0;

    // get dataRecords
    IDataRecordList<?> records = dataRecords;
    if (records == null) {
      // get them from the request
      Object obj = pageContext.getRequest().getAttribute(SmartConstants.DATA);
      if (obj != null && obj instanceof IDataRecordList<?>) records = (IDataRecordList<?>) obj;
    }

    // get filter data
    // get it from the request
    String filterName = parameters.get(SmartConstants.PARAM_NAME);
    FilterData fd = FilterDataUtil.getFilterData(pageContext, filterName);
    if (fd != null) {
      // if the object implement the IEnableFilter interface. then get the data from the
      // "getFilterRecords" method.
      if (records instanceof IEnableFilter<?>) {
        // change to IEnableFilter object
        IEnableFilter<?> filterList = (IEnableFilter<?>) records;
        dataSize = filterList.getFilterRecordSize(fd);
      }
    } else {
      dataSize = records.getAllRecordSize();
    }
    return dataSize;
  }
  /**
   * PRIORITY:context JSP file > interface if user has define the data by user the "list" attribute,
   * then get it at first TODO get the row data from the context
   *
   * @return
   * @throws Exception
   */
  @SuppressWarnings("unchecked")
  public static List<SmartRow> getSmartRowList(
      SmartTableContext context, IDataRecordList<?> dataRecords) throws Exception {
    PageContext pageContext = context.getPageContext();
    List<SmartRow> srs = new ArrayList<SmartRow>();

    Map<String, String> parameters = context.getParameters();
    PreferenceConfigure configure = context.getConfigure();

    // get dataRecords
    IDataRecordList<?> records = dataRecords;
    if (records == null) {
      // get them from the request
      Object obj = pageContext.getRequest().getAttribute(SmartConstants.DATA);
      if (obj != null && obj instanceof IDataRecordList) records = (IDataRecordList<?>) obj;
    }

    // get filter data
    // get it from the request
    String filterName = parameters.get(SmartConstants.PARAM_NAME);
    FilterData fd = FilterDataUtil.getFilterData(pageContext, filterName);

    // if can not find the sort by and sort order in the parameters.
    // get the default value from the configure object.
    String sortBy = parameters.get(SmartConstants.PARAMS_SORT_BY);
    if (sortBy == null) sortBy = configure.getSortBy();

    String order = parameters.get(SmartConstants.PARAMS_SORT_ORDER);
    if (order == null) order = configure.getSortOrder();
    SortOrder sortOrder = SortOrderUtil.transfer(order);

    // transfer IDataRecordList to SmartRow object
    // get the row data from the context
    List beans = new ArrayList();
    if (fd != null) {
      // if the object implement the IEnableFilter interface. then get the data from the
      // "getFilterRecords" method.
      if (records instanceof IEnableFilter) {
        // change to IEnableFilter object
        IEnableFilter<?> filterList = (IEnableFilter<?>) records;

        Integer dataSize = filterList.getFilterRecordSize(fd);
        Integer beginIndex = getBeginIndex(dataSize, context);
        Integer endIndex = getEndIndex(dataSize, context);

        // invoke the getFilterRecords method
        beans = filterList.getFilterRecords(fd, beginIndex, endIndex, sortBy, sortOrder);
      }
    } else {
      Integer dataSize = records.getAllRecordSize();
      Integer beginIndex = getBeginIndex(dataSize, context);
      Integer endIndex = getEndIndex(dataSize, context);

      // invoke the getRecords method
      beans = records.getRecords(beginIndex, endIndex, sortBy, sortOrder);
    }

    // get the current page smart row object
    for (int i = 0; i < beans.size(); i++) {
      Object bean = beans.get(i);
      SmartRow row = new SmartRow();

      row.setObj(bean);
      srs.add(row);
    }
    return srs;
  }