package org.constellation.database.api.domain;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
import static org.apache.sis.util.ArgumentChecks.ensurePositive;
/**
* @author Fabien Bernard (Geomatys).
*/
public class PageImpl<T> implements Page<T>, Serializable {
private static final long serialVersionUID = -6536523769502359793L;
// -------------------------------------------------------------------------
// Properties
// -------------------------------------------------------------------------
private final List<T> content;
private final Pageable pageable;
private final long total;
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
public PageImpl(Pageable pageable, List<T> content, long total) {
ensureNonNull("pageable", pageable);
ensureNonNull("content", content);
ensurePositive("total", total);
this.pageable = pageable;
this.content = content;
this.total = total;
}
// -------------------------------------------------------------------------
// Page implementation
// -------------------------------------------------------------------------
@Override
public int getNumber() {
return pageable.getPageNumber();
}
@Override
public int getSize() {
return pageable.getPageSize();
}
@Override
public int getTotalPages() {
return getSize() == 0 ? 1 : (int) Math.ceil((double) total / (double) getSize());
}
@Override
public int getNumberOfElements() {
return content.size();
}
@Override
public long getTotalElements() {
return total;
}
@Override
public boolean hasPreviousPage() {
return getNumber() > 1;
}
@Override
public boolean isFirstPage() {
return !hasPreviousPage();
}
@Override
public boolean hasNextPage() {
return getNumber() < getTotalPages();
}
@Override
public boolean isLastPage() {
return !hasNextPage();
}
@Override
public Pageable nextPageable() {
return pageable.next();
}
@Override
public Pageable previousPageable() { return pageable.previousOrFirst(); }
@Override
public List<T> getContent() {
return content;
}
@Override
public <O> Page<O> transform(Function<T, O> function) {
return new PageImpl<>(pageable, Lists.transform(content, function), total);
}
// -------------------------------------------------------------------------
// Iterable implementation
// -------------------------------------------------------------------------
@Override
public Iterator<T> iterator() {
return content.iterator();
}
}