/* * Copyright 2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.api.internal; import groovy.lang.Closure; import org.gradle.api.NamedDomainObjectList; import org.gradle.api.Namer; import org.gradle.api.internal.collections.CollectionEventRegister; import org.gradle.api.internal.collections.CollectionFilter; import org.gradle.api.internal.collections.FilteredList; import org.gradle.api.specs.Spec; import org.gradle.api.specs.Specs; import org.gradle.internal.reflect.Instantiator; import java.util.*; public class DefaultNamedDomainObjectList<T> extends DefaultNamedDomainObjectCollection<T> implements NamedDomainObjectList<T> { public DefaultNamedDomainObjectList(DefaultNamedDomainObjectList<? super T> objects, CollectionFilter<T> filter, Instantiator instantiator, Namer<? super T> namer) { super(objects, filter, instantiator, namer); } public DefaultNamedDomainObjectList(Class<T> type, CollectionEventRegister<T> collectionEventRegister, Instantiator instantiator, Namer<? super T> namer) { super(type, new ArrayList<T>(), collectionEventRegister, new UnfilteredIndex<T>(), instantiator, namer); } public DefaultNamedDomainObjectList(Class<T> type, Instantiator instantiator, Namer<? super T> namer) { super(type, new ArrayList<T>(), instantiator, namer); } public void add(int index, T element) { assertMutable(); assertCanAdd(element); getStore().add(index, element); didAdd(element); getEventRegister().getAddAction().execute(element); } public boolean addAll(int index, Collection<? extends T> c) { assertMutable(); boolean changed = false; int current = index; for (T t : c) { if (!hasWithName(getNamer().determineName(t))) { getStore().add(current, t); didAdd(t); getEventRegister().getAddAction().execute(t); changed = true; current++; } } return changed; } @Override protected List<T> getStore() { return (List<T>) super.getStore(); } public T get(int index) { return getStore().get(index); } public T set(int index, T element) { assertMutable(); assertCanAdd(element); T oldElement = getStore().set(index, element); if (oldElement != null) { didRemove(oldElement); } getEventRegister().getRemoveAction().execute(oldElement); didAdd(element); getEventRegister().getAddAction().execute(element); return oldElement; } public T remove(int index) { assertMutable(); T element = getStore().remove(index); if (element != null) { didRemove(element); } getEventRegister().getRemoveAction().execute(element); return element; } public int indexOf(Object o) { return getStore().indexOf(o); } public int lastIndexOf(Object o) { return getStore().lastIndexOf(o); } public ListIterator<T> listIterator() { return new ListIteratorImpl(getStore().listIterator()); } public ListIterator<T> listIterator(int index) { return new ListIteratorImpl(getStore().listIterator(index)); } public List<T> subList(int fromIndex, int toIndex) { return Collections.unmodifiableList(getStore().subList(fromIndex, toIndex)); } @Override protected <S extends T> Collection<S> filteredStore(CollectionFilter<S> filter) { return new FilteredList<T, S>(this, filter); } @Override public NamedDomainObjectList<T> matching(Closure spec) { return matching(Specs.<T>convertClosureToSpec(spec)); } @Override public NamedDomainObjectList<T> matching(Spec<? super T> spec) { return new DefaultNamedDomainObjectList<T>(this, createFilter(spec), getInstantiator(), getNamer()); } @Override public <S extends T> NamedDomainObjectList<S> withType(Class<S> type) { return new DefaultNamedDomainObjectList<S>(this, createFilter(type), getInstantiator(), getNamer()); } @Override public List<T> findAll(Closure cl) { return findAll(cl, new ArrayList<T>()); } private class ListIteratorImpl implements ListIterator<T> { private final ListIterator<T> iterator; private T lastElement; public ListIteratorImpl(ListIterator<T> iterator) { this.iterator = iterator; } public boolean hasNext() { return iterator.hasNext(); } public boolean hasPrevious() { return iterator.hasPrevious(); } public T next() { lastElement = iterator.next(); return lastElement; } public T previous() { lastElement = iterator.previous(); return lastElement; } public int nextIndex() { return iterator.nextIndex(); } public int previousIndex() { return iterator.previousIndex(); } public void add(T t) { assertMutable(); assertCanAdd(t); iterator.add(t); didAdd(t); getEventRegister().getAddAction().execute(t); } public void remove() { assertMutable(); iterator.remove(); didRemove(lastElement); getEventRegister().getRemoveAction().execute(lastElement); lastElement = null; } public void set(T t) { assertMutable(); assertCanAdd(t); iterator.set(t); didRemove(lastElement); getEventRegister().getRemoveAction().execute(lastElement); didAdd(t); getEventRegister().getAddAction().execute(t); lastElement = null; } } }