package de.invesdwin.util.collections;
import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
import java.util.Spliterator;
import javax.annotation.concurrent.NotThreadSafe;
@NotThreadSafe
public abstract class ADelegateList<E> extends ADelegateCollection<E> implements List<E> {
private final List<E> delegateList = (List<E>) super.getDelegate();
@Override
public List<E> getDelegate() {
return delegateList;
}
@Override
public boolean addAll(final int index, final Collection<? extends E> c) {
final Collection<E> allowedElements = filterAllowedElements(c);
return getDelegate().addAll(index, allowedElements);
}
@Override
public E get(final int index) {
return getDelegate().get(index);
}
@Override
public E set(final int index, final E element) {
if (isAddAllowed(element)) {
return getDelegate().set(index, element);
} else {
return get(index);
}
}
@Override
public void add(final int index, final E element) {
if (isAddAllowed(element)) {
getDelegate().add(index, element);
}
}
@Override
public E remove(final int index) {
return getDelegate().remove(index);
}
@Override
public int indexOf(final Object o) {
return getDelegate().indexOf(o);
}
@Override
public int lastIndexOf(final Object o) {
return getDelegate().lastIndexOf(o);
}
@Override
public ListIterator<E> listIterator() {
return getDelegate().listIterator();
}
@Override
public ListIterator<E> listIterator(final int index) {
return getDelegate().listIterator(index);
}
@Override
public List<E> subList(final int fromIndex, final int toIndex) {
return getDelegate().subList(fromIndex, toIndex);
}
@Override
protected abstract List<E> newDelegate();
public static <T> List<T> maybeUnwrapToRoot(final List<T> list) {
List<T> cur = list;
while (cur instanceof ADelegateList) {
final ADelegateList<T> c = (ADelegateList<T>) cur;
cur = c.getDelegate();
}
return cur;
}
@Override
public Spliterator<E> spliterator() {
return getDelegate().spliterator();
}
}