/*
* 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.routing.outbound;
import org.mule.runtime.api.exception.MuleRuntimeException;
import org.mule.runtime.api.i18n.I18nMessageFactory;
import org.mule.runtime.core.routing.MessageSequence;
import java.util.ArrayList;
import java.util.Collection;
import java.util.NoSuchElementException;
/**
* A {@link MessageSequence} wrapper that partitions the wrapped sequence in collections of the specified size.
*/
public class PartitionedMessageSequence<Q> implements MessageSequence<Collection<Q>> {
private MessageSequence<Q> delegate;
private int groupSize;
public PartitionedMessageSequence(MessageSequence<Q> seq, int groupSize) {
if (groupSize <= 1) {
throw new MuleRuntimeException(I18nMessageFactory.createStaticMessage("group size must be greater than 1"));
}
this.delegate = seq;
this.groupSize = groupSize;
}
@Override
public Integer size() {
return delegate.size() == null ? null : (delegate.size() / groupSize) + ((delegate.size() % groupSize) > 0 ? 1 : 0);
}
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public Collection<Q> next() {
if (!delegate.hasNext()) {
throw new NoSuchElementException();
}
Collection<Q> batch = new ArrayList<>();
int i = groupSize;
while (i > 0 && delegate.hasNext()) {
batch.add(delegate.next());
i--;
}
return batch;
}
@Override
public boolean isEmpty() {
return !hasNext();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}