package br.com.citframework.integracao.core; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * Implementa��o b�sica de {@link Page} * * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 01/10/2014 * @see <a href="http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/PageImpl.html">org.springframework.data.domain.PageImpl</a> */ public class PageImpl<T> implements Page<T>, Serializable { private static final long serialVersionUID = 3177625856508331195L; private final long total; private final Pageable pageable; private final List<T> content = new ArrayList<>(); /** * Cria uma nova {@link PageImpl} com o conte�do informado. Como resultado, ter� uma {@link Page} being identical * to the entire {@link List}. * * @param content * n�o deve ser {@code null}. */ public PageImpl(final List<T> content) { this(content, null, null == content ? 0 : content.size()); } /** * Cria uma nova {@link Page} with the given content and the given governing {@link Pageable}. * * @param content * conte�do a ser inclu�do na {@link Page}. N�o deve ser {@code null}. * @param pageable * {@link Pageable}: pode ser {@code null}. */ public PageImpl(final List<T> content, final Pageable pageable) { this(content, pageable, null == content ? 0 : content.size()); } /** * Cria uma {@link Page}. * * @param content * conte�do desta p�gina, n�o deve ser {@code null}. * @param pageable * informa��es da pagina��o, pode ser {@code null}. * @param total * o total de itens dispon�veis */ public PageImpl(final List<T> content, final Pageable pageable, final long total) { if (content == null) { throw new IllegalArgumentException("Content must not be null!"); } this.content.addAll(content); this.pageable = pageable; this.total = total; } @Override public Iterator<T> iterator() { return content.iterator(); } @Override public int getTotalPages() { return this.getSize() == 0 ? 1 : (int) Math.ceil((double) total / (double) this.getSize()); } @Override public long getTotalElements() { return total; } @Override public int getNumber() { return pageable == null ? 0 : pageable.getPageNumber(); } @Override public int getSize() { return pageable == null ? 0 : pageable.getPageSize(); } @Override public int getNumberOfElements() { return content.size(); } @Override public List<T> getContent() { return Collections.unmodifiableList(content); } @Override public boolean hasContent() { return !content.isEmpty(); } @Override public boolean isFirst() { return !this.hasPrevious(); } @Override public boolean isLast() { return !this.hasNext(); } @Override public boolean hasNext() { return this.getNumber() + 1 < this.getTotalPages(); } @Override public boolean hasPrevious() { return this.getNumber() > 0; } @Override public Pageable nextPageable() { return this.hasNext() ? pageable.next() : null; } @Override public Pageable previousPageable() { if (this.hasPrevious()) { return pageable.previousOrFirst(); } return null; } @Override public String toString() { String contentType = "UNKNOWN"; final List<T> content = this.getContent(); if (content.size() > 0) { contentType = content.get(0).getClass().getName(); } return String.format("Page %s of %d containing %s instances", this.getNumber(), this.getTotalPages(), contentType); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof PageImpl<?>)) { return false; } final PageImpl<?> that = (PageImpl<?>) obj; final boolean contentEqual = this.content.equals(that.content); final boolean pageableEqual = this.pageable == null ? that.pageable == null : this.pageable.equals(that.pageable); return this.total == that.total && contentEqual && pageableEqual; } @Override public int hashCode() { int result = 17; result += 31 * (pageable == null ? 0 : pageable.hashCode()); result += 31 * content.hashCode(); result += 31 * (int) (total ^ total >>> 32); return result; } }