package com.corej2eepatterns.dao.rowset;

// importy

public class ReadOnlyRowSet implements RowSet, Serializable {

  . . . 

  private Object[] dataRows;

  . . .  

  /** zbir wierszy tylko do odczytu */
  public boolean isReadOnly() {
    return true;
  }

  public void setReadOnly(boolean flag) throws SQLException {
    throw new SQLException(
        "ReadOnlyRowSet: Metoda nieobsugiwana");
  }

  // Wypenia zbir wierszy bez pierwszych wierszy startRow
  // z ResultSet maksymalnie liczb wierszy podan
  // w parametrze howManyRows 
  public void populate(ResultSet resultSet, 
      int startRow, int howManyRows)
      throws SQLException {

    // cz kodu nie jest przedstawiona, by uatwi zrozumienie metody

    // utworzenie listy przechowujacej wartoci wierszy
    List dataRows = . . . ;

    // okrelenie liczby kolumn dla kadej metadanej
    int numberOfColumns =
        resultSet.getMetaData().getColumnCount();

    // pominicie poczatkowych wierszy okrelonych w beginAtRow
    setStartPosition(startAtRow, resultSet);

    // jeli nie okrelono liczby wierszy, 
    // pobranie wszystkich z resultset
    if (howManyRows <= 0) {
      howManyRows = Integer.MAX_VALUE;
    }
    int processedRows = 0;
    while ((resultSet.next()) &&
        (processedRows++ < howManyRows)) {
      Object[] values = new Object[numberOfColumns];

      // pobranie wartoci aktualnego wiersza i zapisanie
      // ich w tablicy wartoci
      for (int i=0; i<numberOfColumns; i++) {
        Object columnValue =
            this.getColumnValue(resultSet, i);
        values[i] = columnValue;
      }

      // dodanie tablicy wartoci do listy
      dataRows.add(values);
    }

  } // koniec konstruktora

  . . .

  // ustawienie zbioru wynikw na wiersz podany w startAtRow
  private void setStartPosition(
      int startAtRow, ResultSet resultSet) 
      throws SQLException {
    if (startAtRow > 0) {
      if (resultSet.getType() !=
          ResultSet.TYPE_FORWARD_ONLY) {
        // przesunicie kursora za pomoc interfejsu JDBC 2.0
        if (!resultSet.absolute(startAtRow)) {
          resultSet.last();
        }
      } else {
        // jeli brak obsugi interfejsu JDBC 2.0
        // pominicie pierwszych beginAtRow wierszy
        for (int i=0; i< startAtRow; i++) {
          if (!resultSet.next()) {
            resultSet.last();
            break;
          }
        }
      }
    }
  }

  // Odczytanie wartoci kolumny dla aktualnego wiersza i
  // utworzenie dla niej odpowiedniego obiektu Javy.
  // Zwrcenie null, jeli bd odczytu wartoci lub warto null z SQL.
  private Object getColumnValue(
      ResultSet resultSet, int columnIndex) {

    . . .

  }

  // implementacja metod z RowSet i ResultInterface
  . . .

}