2.3.3 Page-by-Page Iterator Page-by-Page Iterator (1) n Intención n n También conocido como n n Acceder a una lista grande de Value Objects de una manera eficiente Value List Handler Motivación n En MiniBank necesitamos recuperar los datos de todas las cuentas de un usuario y los de las operaciones realizadas a una cuenta entre dos fechas <<Interface>> AccountFacadeDelegate + createAccount(accountVO : AccountVO) : AccountVO + findAccount(accountIdentifier : Long) : AccountVO + addToAccount(accountIdentifier : Long, amount : double) : void + withdrawFromAccount(accountIdentifier : Long, amont : double) : void + findAccountsByUserIdentifier(userIdentifier : Long, startIndex : int, count : int) : Collection + removeAccount(accountIdentifier : Long) : void + transfer(sourceAccountIdentifier : Long, destinationAccountIdentifier : Long, amount : double) : void + findAccountOperationsByDate(accountIdentifier : Long, startDate : Calendar, endDate : Calendar, startIndex : int, count : int) : Collection Page-by-Page Iterator (2) n Aplicabilidad n n n n El usuario está interesado en visualizar la lista de Value Objects en trozos, pudiendo ir hacia adelante o atrás La lista completa no cabría en la pantalla La lista completa no cabría en memoria Estructura PageByPageIterator n BusinessDelegate/ SessionFacade DAO Participantes n PageByPageIterator n n Puede ser una clase que implementa un interfaz con operaciones setCursor(int), setPageSize(int), getCurrentList(), hasNext(), etc. Normalmente es cualquier clase que invoque repetidamente una operación findXXX(startIndex, count, ...) Page-by-Page Iterator (3) n Participantes (cont) n BusinessDelegate/SessionFacade (PlainAccountFacadeDelegate) y DAO (SQLAccountDAO y SQLAccountOperationDAO) n n Colaboraciones n n Proporcionan acceso a la lista de VOs El PageByPageIterator lleva la cuenta de la posición actual del cliente, permitiendo obtener el siguiente trozo hacia delante o atrás por medio del BussinessDelegate/SessionFacade Consecuencias n Beneficios n n Se accede a la lista eficientemente Riesgos n Las inserciones y borrados que se hagan a la lista (en la fuente de datos) mientras un cliente accede a ella, pueden provocar que éste no vea uno de los elementos o lo vea más de una vez Page-by-Page Iterator (4) n Implementación n n Las conexiones a la fuente de datos se deben cerrar después de cada acceso a un trozo de la lista ¿ Cómo posicionarse en una fila de un java.sql.ResultSet ? n n Hasta JDBC 2.0 la única manera portable es llamando “n” veces a ResultSet.next Si el driver soporta JDBC 2.0 o superior, existe una alternativa más eficiente: ResultSet.absolute (scrollable result sets) n n Es la opción usada en MiniBank Código de ejemplo n Véanse es.udc.fbellas.j2ee.minibank.model.account.d ao.AbstractSQLAcountDAO.findByUserIdentifier y es.udc.fbellas.j2ee.minibank.model.accountop eration.dao.AbstractSQLAcountOperationDAO.fi ndByDate en MiniBank Page-by-Page Iterator (y 5) n Patrones relacionados n n n Iterator Data Access Object Value Object