package jenkins.model.lazy;
import jenkins.model.lazy.AbstractLazyLoadRunMap.Direction;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* Set that backs {@link AbstractLazyLoadRunMap#entrySet()}.
*
* @author Kohsuke Kawaguchi
*/
class LazyLoadRunMapEntrySet<R> extends AbstractSet<Entry<Integer,R>> {
private final AbstractLazyLoadRunMap<R> owner;
/**
* Lazily loaded all entries.
*/
private Set<Entry<Integer,R>> all;
LazyLoadRunMapEntrySet(AbstractLazyLoadRunMap<R> owner) {
this.owner = owner;
}
private synchronized Set<Entry<Integer,R>> all() {
if (all==null)
all = new BuildReferenceMapAdapter<R>(owner,owner.all()).entrySet();
return all;
}
synchronized void clearCache() {
all = null;
}
@Override
public int size() {
return all().size();
}
@Override
public boolean isEmpty() {
return owner.newestBuild()==null;
}
@Override
public boolean contains(Object o) {
if (o instanceof Entry) {
Entry e = (Entry) o;
Object k = e.getKey();
if (k instanceof Integer) {
return owner.getByNumber((Integer)k).equals(e.getValue());
}
}
return false;
}
@Override
public Iterator<Entry<Integer,R>> iterator() {
return new Iterator<Entry<Integer,R>>() {
R last = null;
R next = owner.newestBuild();
public boolean hasNext() {
return next!=null;
}
public Entry<Integer,R> next() {
last = next;
if (last!=null) {
next = owner.search(owner.getNumberOf(last)-1, Direction.DESC);
} else
throw new NoSuchElementException();
return entryOf(last);
}
private Entry<Integer, R> entryOf(R r) {
return new SimpleImmutableEntry<Integer, R>(owner.getNumberOf(r),r);
}
public void remove() {
if (last==null)
throw new UnsupportedOperationException();
owner.removeValue(last);
}
};
}
@Override
public Object[] toArray() {
return all().toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return all().toArray(a);
}
@Override
public boolean add(Entry<Integer, R> integerREntry) {
throw new UnsupportedOperationException();
}
@Override
public boolean remove(Object o) {
if (o instanceof Entry) {
Entry e = (Entry) o;
return owner.removeValue((R)e.getValue());
}
return false;
}
}