package com.btr.proxy.selector.fixed; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Proxy.Type; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /***************************************************************************** * This proxy selector is configured with a fixed proxy. This proxy will be * returned for all URIs passed to the select method. * * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009 ****************************************************************************/ public class FixedProxySelector extends ProxySelector { private List proxyList; /************************************************************************* * Constructor * @param proxy the proxy to use. ************************************************************************/ public FixedProxySelector(Proxy... proxy) { super(); if (proxy.length == 0) throw new IllegalArgumentException("Empty list was passed"); this.proxyList = Collections.unmodifiableList(Arrays.asList(proxy)); if (this.proxyList.contains(null)) throw new NullPointerException("List conains NULL proxy"); } /************************************************************************* * Constructor * @param proxyHost the host name or IP address of the proxy to use. * @param proxyPort the port of the proxy. ************************************************************************/ public FixedProxySelector(Proxy.Type type, String proxyHost, int proxyPort) { this(new Proxy(type, InetSocketAddress.createUnresolved(proxyHost, proxyPort))); } /************************************************************************* * connectFailed * @see java.net.ProxySelector#connectFailed(java.net.URI, java.net.SocketAddress, java.io.IOException) ************************************************************************/ @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { final List list = this.proxyList; if (list.size() < 2) return; if (!list.get(0).address().equals(sa)) return; // We only care if the failing one is the first one in list List newList = new ArrayList<>(list.size()); Proxy broken = null; for (Proxy p : list) { if (p.address().equals(sa)) { broken = p; } else { newList.add(p); } } if (broken != null) { newList.add(broken); } this.proxyList = Collections.unmodifiableList(newList); } /************************************************************************* * select * @see java.net.ProxySelector#select(java.net.URI) ************************************************************************/ @Override public List select(URI uri) { return this.proxyList; } public Type getType() { return this.proxyList.get(0).type(); } }