/* * 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.el.mvel; import org.mule.runtime.api.metadata.DataType; import org.mule.runtime.api.metadata.TypedValue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.Map; import static java.util.Arrays.asList; import static java.util.Collections.emptyIterator; import static java.util.Collections.singletonList; public class MVELSplitDataIterator implements Iterator<TypedValue<?>> { private Iterator<?> delegate; private int bachSize; public MVELSplitDataIterator(Iterator<?> delegate, int bachSize) { this.delegate = delegate; this.bachSize = bachSize; } @Override public boolean hasNext() { return delegate.hasNext(); } @Override public TypedValue<?> next() { if (bachSize > 0) { int i = 0; ArrayList<Object> bachedElements = new ArrayList<>(); while (delegate.hasNext() && i < bachSize) { bachedElements.add(delegate.next()); i++; } return new TypedValue<>(bachedElements, DataType.builder().fromObject(bachedElements).build()); } else { Object next = delegate.next(); return new TypedValue<>(next, DataType.builder().fromObject(next).build()); } } public static Iterator<TypedValue<?>> createFrom(Object result, int bachSize) { Iterator<Object> iter; if (result instanceof Object[]) { iter = asList((Object[]) result).iterator(); } else if (result instanceof Iterable<?>) { iter = ((Iterable<Object>) result).iterator(); } else if (result instanceof Iterator<?>) { iter = (Iterator<Object>) result; } else if (result instanceof Map<?, ?>) { iter = ((Map) result).values().iterator(); } else if (result == null) { iter = emptyIterator(); } else { iter = singletonList(result).iterator(); } return new MVELSplitDataIterator(iter, bachSize); } }