package de.invesdwin.util.collections.iterable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.annotation.concurrent.NotThreadSafe; import de.invesdwin.util.collections.ADelegateList; import de.invesdwin.util.collections.iterable.collection.ArrayListCloseableIterable; import de.invesdwin.util.collections.iterable.collection.ArraySubListCloseableIterable; import de.invesdwin.util.collections.iterable.collection.CollectionCloseableIterable; import de.invesdwin.util.collections.iterable.collection.ListCloseableIterable; @NotThreadSafe public final class WrapperCloseableIterable<E> implements ICloseableIterable<E> { private final Iterable<? extends E> delegate; private WrapperCloseableIterable(final Iterable<? extends E> delegate) { this.delegate = delegate; } @SuppressWarnings("deprecation") @Override public ICloseableIterator<E> iterator() { return WrapperCloseableIterator.maybeWrap(delegate.iterator()); } @SuppressWarnings("unchecked") public static <T> Iterable<T> maybeUnwrap(final ICloseableIterable<? extends T> iterator) { if (iterator instanceof WrapperCloseableIterable) { final WrapperCloseableIterable<T> it = (WrapperCloseableIterable<T>) iterator; return (Iterable<T>) it.delegate; } else { return (Iterable<T>) iterator; } } @SuppressWarnings("unchecked") public static <T> ICloseableIterable<T> maybeWrap(final Iterable<? extends T> iterable) { if (iterable instanceof ICloseableIterable) { return (ICloseableIterable<T>) iterable; } else if (iterable instanceof Collection) { return maybeWrap((Collection<T>) iterable); } else { return new WrapperCloseableIterable<T>(iterable); } } @SuppressWarnings("unchecked") public static <T> ICloseableIterable<T> maybeWrap(final List<? extends T> iterable) { final List<? extends T> unwrappedList = ADelegateList.maybeUnwrapToRoot(iterable); if (unwrappedList instanceof ArrayList) { return new ArrayListCloseableIterable<T>((ArrayList<T>) unwrappedList); } else if (unwrappedList.getClass().equals(ArraySubListCloseableIterable.SUBLIST_CLASS)) { return new ArraySubListCloseableIterable<T>(unwrappedList); } else { return new ListCloseableIterable<T>(unwrappedList); } } @SuppressWarnings("unchecked") public static <T> ICloseableIterable<T> maybeWrap(final Collection<? extends T> iterable) { if (iterable instanceof List) { return maybeWrap((List<T>) iterable); } else { return new CollectionCloseableIterable<T>(iterable); } } }