/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.internal.streaming.object.iterator; import java.io.IOException; import java.util.List; import java.util.NoSuchElementException; /** * Implementation of {@link Consumer} that obtains a {@link List} from a {@link Producer} and returns the elements one by one. * This implementation is not thread-safe. * * @since 3.5.0 */ public class ListConsumer<T> extends AbstractConsumer<T, List<T>> { private List<T> currentPage = null; private int index; private int pageSize; public ListConsumer(Producer<List<T>> producer) { super(producer); this.reset(); } /** * {@inheritDoc} */ @Override protected T doConsume() throws NoSuchElementException { if (this.isConsumed()) { throw new NoSuchElementException(); } T element = this.currentPage.get(this.index); this.index++; return element; } @Override protected boolean checkConsumed() { if (this.index >= this.pageSize) { this.loadNextPage(this.producer); return this.pageSize == 0; } return false; } /** * {@inheritDoc} */ @Override public int getSize() { return this.producer.getSize(); } /** * {@inheritDoc} */ @Override public void close() throws IOException { super.close(); this.currentPage = null; } private void reset() { this.index = 0; this.pageSize = this.currentPage == null ? 0 : this.currentPage.size(); } private void loadNextPage(Producer<List<T>> producer) { this.currentPage = producer.produce(); this.reset(); } }