summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/btr/proxy/search/ProxySearch.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/btr/proxy/search/ProxySearch.java')
-rw-r--r--src/main/java/com/btr/proxy/search/ProxySearch.java258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/main/java/com/btr/proxy/search/ProxySearch.java b/src/main/java/com/btr/proxy/search/ProxySearch.java
new file mode 100644
index 0000000..19db95f
--- /dev/null
+++ b/src/main/java/com/btr/proxy/search/ProxySearch.java
@@ -0,0 +1,258 @@
+package com.btr.proxy.search;
+
+import java.awt.GraphicsEnvironment;
+import java.net.ProxySelector;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.btr.proxy.search.browser.firefox.FirefoxProxySearchStrategy;
+import com.btr.proxy.search.browser.ie.IEProxySearchStrategy;
+import com.btr.proxy.search.desktop.DesktopProxySearchStrategy;
+import com.btr.proxy.search.desktop.gnome.GnomeProxySearchStrategy;
+import com.btr.proxy.search.desktop.kde.KdeProxySearchStrategy;
+import com.btr.proxy.search.desktop.win.WinProxySearchStrategy;
+import com.btr.proxy.search.env.EnvProxySearchStrategy;
+import com.btr.proxy.search.java.JavaProxySearchStrategy;
+import com.btr.proxy.selector.misc.BufferedProxySelector;
+import com.btr.proxy.selector.misc.ProxyListFallbackSelector;
+import com.btr.proxy.selector.pac.PacProxySelector;
+import com.btr.proxy.util.Logger;
+import com.btr.proxy.util.PlatformUtil;
+import com.btr.proxy.util.ProxyException;
+import com.btr.proxy.util.Logger.LogBackEnd;
+import com.btr.proxy.util.Logger.LogLevel;
+
+/*****************************************************************************
+ * Main class to setup and initialize the proxy detection system.<br/>
+ * This class can be used to select a proxy discovery strategy.<br/>
+ * Implements the "Builder" pattern.<br/>
+ * Use <code>addStrategy</code> to add one or more search strategies.<br/>
+ * If you are done call the <code>getProxySelector</code> method. <br/>
+ * Then the strategies are asked one after the other for a ProxySelector until
+ * an valid selector is found. <br/>
+ * <p>
+ * Invoke the static <code>getDefaultProxySearch</code> method to use a default search strategy.
+ * </p>
+ * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009
+ ****************************************************************************/
+
+public class ProxySearch implements ProxySearchStrategy {
+
+ private static final int DEFAULT_PAC_CACHE_SIZE = 20;
+
+ private static final long DEFAULT_PAC_CACHE_TTL = 1000*60*10; // 10 Minutes
+
+ private List<ProxySearchStrategy> strategies;
+ private int pacCacheSize;
+ private long pacCacheTTL;
+
+ /*****************************************************************************
+ * Types of proxy detection supported by the builder.
+ ****************************************************************************/
+
+ public enum Strategy {
+ /// Use the platform settings.
+ OS_DEFAULT,
+ /// Use the settings of the platforms default browser.
+ BROWSER,
+ /// Use Firefox settings
+ FIREFOX,
+ /// Use InternetExplorer settings
+ IE,
+ /// Use environment variables for proxy settings.
+ ENV_VAR,
+ /// Use windows default proxy settings.
+ WIN,
+ /// Use KDE desktop default proxy settings.
+ KDE,
+ /// Use KDE desktop default proxy settings.
+ GNOME,
+ /// Use Java Networking system properties
+ JAVA
+ }
+
+ /*************************************************************************
+ * Constructor
+ ************************************************************************/
+
+ public ProxySearch() {
+ super();
+ this.strategies = new ArrayList<ProxySearchStrategy>();
+ this.pacCacheSize = DEFAULT_PAC_CACHE_SIZE;
+ this.pacCacheTTL = DEFAULT_PAC_CACHE_TTL;
+ }
+
+ /*************************************************************************
+ * Sets up a ProxySearch that uses a default search strategy suitable for
+ * every platform.
+ * @return a ProxySearch initialized with default settings.
+ ************************************************************************/
+
+ public static ProxySearch getDefaultProxySearch() {
+ ProxySearch s = new ProxySearch();
+
+ // Test if we are a server or a client.
+ boolean headless = GraphicsEnvironment.isHeadless();
+
+ if (headless) {
+ s.addStrategy(Strategy.JAVA);
+ s.addStrategy(Strategy.OS_DEFAULT);
+ s.addStrategy(Strategy.ENV_VAR);
+ } else {
+ s.addStrategy(Strategy.JAVA);
+ s.addStrategy(Strategy.BROWSER);
+ s.addStrategy(Strategy.OS_DEFAULT);
+ s.addStrategy(Strategy.ENV_VAR);
+ }
+ Logger.log(ProxySearch.class, LogLevel.TRACE, "Using default search priority: {0}", s);
+
+ return s;
+ }
+
+ /*************************************************************************
+ * Adds an search strategy to the list of proxy searches strategies.
+ * @param strategy the search strategy to add.
+ ************************************************************************/
+
+ public void addStrategy(Strategy strategy) {
+ switch (strategy) {
+ case OS_DEFAULT:
+ this.strategies.add(new DesktopProxySearchStrategy());
+ break;
+ case BROWSER:
+ this.strategies.add(getDefaultBrowserStrategy());
+ break;
+ case FIREFOX:
+ this.strategies.add(new FirefoxProxySearchStrategy());
+ break;
+ case IE:
+ this.strategies.add(new IEProxySearchStrategy());
+ break;
+ case ENV_VAR:
+ this.strategies.add(new EnvProxySearchStrategy());
+ break;
+ case WIN:
+ this.strategies.add(new WinProxySearchStrategy());
+ break;
+ case KDE:
+ this.strategies.add(new KdeProxySearchStrategy());
+ break;
+ case GNOME:
+ this.strategies.add(new GnomeProxySearchStrategy());
+ break;
+ case JAVA:
+ this.strategies.add(new JavaProxySearchStrategy());
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown strategy code!");
+ }
+ }
+
+ /*************************************************************************
+ * Sets the cache size of the PAC proxy selector cache.
+ * This defines the number of URLs that are cached together with the PAC
+ * script result. This improves performance because for URLs that are
+ * in the cache the script is not executed again.
+ * You have to set this before you add any strategies that may create a
+ * PAC script proxy selector.
+ * @param size of the cache. Set it to 0 to disable caching.
+ * @param ttl is the time to live of the cache entries as amount of milliseconds.
+ ************************************************************************/
+
+ public void setPacCacheSettings(int size, long ttl) {
+ this.pacCacheSize = size;
+ this.pacCacheTTL = ttl;
+ }
+
+ /*************************************************************************
+ * Gets the search strategy for the platforms default browser.
+ * @return a ProxySearchStrategy, null if no supported browser was found.
+ ************************************************************************/
+
+ private ProxySearchStrategy getDefaultBrowserStrategy() {
+ switch (PlatformUtil.getDefaultBrowser()) {
+ case IE:
+ return new IEProxySearchStrategy();
+ case FIREFOX:
+ return new FirefoxProxySearchStrategy();
+ }
+ return null;
+ }
+
+ /*************************************************************************
+ * Gets the proxy selector that will use the configured search order.
+ * @return a ProxySelector, null if none was found for the current
+ * builder configuration.
+ ************************************************************************/
+
+ public ProxySelector getProxySelector() {
+ Logger.log(getClass(), LogLevel.TRACE, "Executing search strategies to find proxy selector");
+ for (ProxySearchStrategy strat : this.strategies) {
+ try {
+ ProxySelector selector = strat.getProxySelector();
+ if (selector != null) {
+ selector = installBufferingAndFallbackBehaviour(selector);
+ return selector;
+ }
+ } catch (ProxyException e) {
+ Logger.log(getClass(), LogLevel.DEBUG, "Strategy {0} failed trying next one.", e);
+ // Ignore and try next strategy.
+ }
+ }
+
+ return null;
+ }
+
+ /*************************************************************************
+ * If it is PAC and we have caching enabled set it here.
+ * @param selector
+ * @return
+ ************************************************************************/
+
+ private ProxySelector installBufferingAndFallbackBehaviour(ProxySelector selector) {
+ if (selector instanceof PacProxySelector) {
+ if (this.pacCacheSize > 0) {
+ selector = new BufferedProxySelector(this.pacCacheSize, this.pacCacheTTL, selector);
+ }
+ selector = new ProxyListFallbackSelector(selector);
+ }
+ return selector;
+ }
+
+ /*************************************************************************
+ * toString
+ * @see java.lang.Object#toString()
+ ************************************************************************/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("Proxy search: ");
+ for (ProxySearchStrategy strat : this.strategies) {
+ sb.append(strat);
+ sb.append(" ");
+ }
+ return sb.toString();
+ }
+
+ /*************************************************************************
+ * For testing only. Will print the logging & proxy information to the console.
+ * @param args the command line arguments.
+ ************************************************************************/
+
+ public static void main(String[] args) {
+ ProxySearch ps = ProxySearch.getDefaultProxySearch();
+ Logger.setBackend(new LogBackEnd() {
+
+ public void log(Class<?> clazz, LogLevel loglevel, String msg,
+ Object... params) {
+ System.out.println(MessageFormat.format(msg, params));
+ }
+
+ public boolean isLogginEnabled(LogLevel logLevel) {
+ return true;
+ }
+ });
+ ps.getProxySelector();
+ }
+
+}