/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *******************************************************************************/
package org.apache.ofbiz.base.util.collections;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * Stores the result of a subset of data items from a source (such
 * as EntityListIterator).
 */
public class PagedList<E> implements Iterable<E> {

    protected int startIndex;
    protected int endIndex;
    protected int size;
    protected int viewIndex;
    protected int viewSize;
    protected List<E> data;

    /**
     * Default constructor - populates all fields in this class
     * @param startIndex
     * @param endIndex
     * @param size
     * @param viewIndex
     * @param viewSize
     * @param data
     */
    public PagedList(int startIndex, int endIndex, int size, int viewIndex, int viewSize, List<E> data) {
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.size = size;
        this.viewIndex = viewIndex;
        this.viewSize = viewSize;
        this.data = data;
    }

    /**
     * @param viewIndex
     * @param viewSize
     * @return an empty PagedList object
     */
    public static <E> PagedList<E> empty(int viewIndex, int viewSize) {
        List<E> emptyList = Collections.emptyList();
        return new PagedList<E>(0, 0, 0, viewIndex, viewSize, emptyList);
    }

    /**
     * @return the start index (for paginator) or known as low index
     */
    public int getStartIndex() {
        return startIndex;
    }

    /**
     * @return the end index (for paginator) or known as high index
     */
    public int getEndIndex() {
        return endIndex;
    }

    /**
     * @return the size of the full list, this can be the 
     * result of <code>EntityListIterator.getResultsSizeAfterPartialList()</code>
     */
    public int getSize() {
        return size;
    }

    /**
     * @return the paged data. Eg - the result from <code>EntityListIterator.getPartialList()</code>
     */
    public List<E> getData() {
        return data;
    }

    /**
     * @return the view index supplied by client
     */
    public int getViewIndex() {
        return viewIndex;
    }

    /**
     * @return the view size supplied by client
     */
    public int getViewSize() {
        return viewSize;
    }

    /**
     * @return an interator object over the data returned in getData() method
     *         of this class
     */
    @Override
    public Iterator<E> iterator() {
        return this.data.iterator();
    }

}
