package netflix.karyon.jersey.blocking; import com.google.common.collect.Iterators; import com.sun.jersey.spi.container.ContainerProvider; import com.sun.jersey.spi.service.ServiceFinder; import java.util.Iterator; /** * @author Nitesh Kant */ class ServiceIteratorProviderImpl<T> extends ServiceFinder.ServiceIteratorProvider<T> { static { /** * This iterator provider override makes it possible to not mandate the presence of a jar with a META-INF/ based * Service provider discovery which is the default for jersey. */ ServiceFinder.setIteratorProvider(new ServiceIteratorProviderImpl()); } @SuppressWarnings("rawtypes") private static final Iterator<? extends ContainerProvider> nettyContainerProviderIter = Iterators.singletonIterator(new NettyContainerProvider()); private final ServiceFinder.DefaultServiceIteratorProvider<T> defaultProvider; ServiceIteratorProviderImpl() { defaultProvider = new ServiceFinder.DefaultServiceIteratorProvider<T>(); } public static void registerWithJersey() { // Static block does the register. } @Override @SuppressWarnings("unchecked") public Iterator<T> createIterator(Class<T> service, String serviceName, ClassLoader loader, boolean ignoreOnClassNotFound) { Iterator<T> defaultIterator = defaultProvider.createIterator(service, serviceName, loader, ignoreOnClassNotFound); if (service.isAssignableFrom(NettyContainerProvider.class)) { return (Iterator<T>) Iterators.concat(defaultIterator, nettyContainerProviderIter); } return defaultIterator; } @Override @SuppressWarnings("unchecked") public Iterator<Class<T>> createClassIterator(Class<T> service, String serviceName, ClassLoader loader, boolean ignoreOnClassNotFound) { return defaultProvider.createClassIterator(service, serviceName, loader, ignoreOnClassNotFound); } }