/* * 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; import org.mule.runtime.api.streaming.object.CursorIterator; import org.mule.runtime.api.streaming.object.CursorIteratorProvider; import org.mule.runtime.core.internal.streaming.AbstractCursorIterator; import java.io.IOException; import java.util.NoSuchElementException; /** * A {@link CursorIterator} which pulls its data from an {@link ObjectStreamBuffer}. * * @see ObjectStreamBuffer * @since 4.0 */ public class BufferedCursorIterator<T> extends AbstractCursorIterator<T> { private final ObjectStreamBuffer<T> buffer; private Bucket<T> bucket = null; public BufferedCursorIterator(ObjectStreamBuffer<T> buffer, CursorIteratorProvider provider) { super(provider); this.buffer = buffer; } /** * {@inheritDoc} */ @Override public boolean hasNext() { return buffer.hasNext(getPosition()); } /** * {@inheritDoc} */ @Override protected T doNext(long p) { Position position = buffer.toPosition(p); if (bucket == null || !bucket.contains(position)) { bucket = buffer.getBucketFor(position).orElse(bucket); } if (bucket != null) { return bucket.get(position.getItemIndex()).orElseThrow(NoSuchElementException::new); } else { throw new NoSuchElementException(); } } /** * {@inheritDoc} */ @Override public void release() { bucket = null; } /** * {@inheritDoc} */ @Override protected void doClose() throws IOException { } /** * {@inheritDoc} */ @Override public int getSize() { return buffer.getSize(); } }