package jenkins.security;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.ExtensionList;
import hudson.ExtensionPoint;
import jenkins.model.Jenkins;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
/**
* There are cases where a plugin need to provide a {@link QueueItemAuthenticator} that cannot be controlled or
* configured by the user. This extension point provides the mechanism whereby the a {@link QueueItemAuthenticator}
* can be provided either before or after those provided by {@link QueueItemAuthenticatorConfiguration} which
* will use {@link Extension#ordinal()} of {@code 100}
* @since 1.592
*/
public abstract class QueueItemAuthenticatorProvider implements ExtensionPoint {
@NonNull
public abstract List<QueueItemAuthenticator> getAuthenticators();
public static Iterable<QueueItemAuthenticator> authenticators() {
return new IterableImpl();
}
private static class IteratorImpl implements Iterator<QueueItemAuthenticator> {
private final Iterator<QueueItemAuthenticatorProvider> providers;
private Iterator<QueueItemAuthenticator> delegate = null;
private IteratorImpl() {
providers = ExtensionList.lookup(QueueItemAuthenticatorProvider.class).iterator();
}
@Override
public boolean hasNext() {
while ((delegate == null || !delegate.hasNext()) && (providers.hasNext())) {
final QueueItemAuthenticatorProvider provider = providers.next();
if (provider == null) {
continue;
}
delegate = new ArrayList<QueueItemAuthenticator>(provider.getAuthenticators()).iterator();
}
return delegate != null && delegate.hasNext();
}
@Override
public QueueItemAuthenticator next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return delegate.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
}
private static class IterableImpl implements Iterable<QueueItemAuthenticator> {
@Override
public Iterator<QueueItemAuthenticator> iterator() {
return new IteratorImpl();
}
}
}