Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/org/adblockplus/android/configurators/ProxyConfigurators.java

Issue 4705284891082752: Proxy configurators (Closed)
Patch Set: Last batch of review issues Created Aug. 24, 2014, 11:52 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/org/adblockplus/android/configurators/ProxyConfigurators.java
diff --git a/src/org/adblockplus/android/configurators/ProxyConfigurators.java b/src/org/adblockplus/android/configurators/ProxyConfigurators.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ccc99aa584b751587b663f02433ba446ff6d10c
--- /dev/null
+++ b/src/org/adblockplus/android/configurators/ProxyConfigurators.java
@@ -0,0 +1,148 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.adblockplus.android.configurators;
+
+import java.lang.reflect.Constructor;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.adblockplus.android.Utils;
+
+import android.content.Context;
+import android.util.Log;
+
+/**
+ * Common proxy configurator methods.
+ */
+public final class ProxyConfigurators
+{
+ private static final String TAG = Utils.getTag(ProxyConfigurators.class);
+ private static final ArrayList<Class<?>> CONFIGURATORS = new ArrayList<Class<?>>();
+ private static final HashMap<ProxyRegistrationType, Class<?>> CONFIGURATOR_MAP = new HashMap<ProxyRegistrationType, Class<?>>();
+ private static final HashMap<Class<?>, ProxyRegistrationType> CONFIGURATOR_INV_MAP = new HashMap<Class<?>, ProxyRegistrationType>();
+
+ static
+ {
+ /*
+ * Add new proxy-configurators here.
+ *
+ * Note: order of adding is important (as later added configurators act as fallbacks for earlier ones).
+ */
+ add(CyanogenProxyConfigurator.class);
+ add(IptablesProxyConfigurator.class);
+ add(NativeProxyConfigurator.class);
+ add(ManualProxyConfigurator.class);
+ }
+
+ private ProxyConfigurators()
+ {
+ // no instantiation
+ }
+
+ private static void add(final Class<?> clazz)
+ {
+ try
+ {
+ final Constructor<?> ctor = clazz.getConstructor(Context.class);
+ final ProxyConfigurator pc = (ProxyConfigurator) ctor.newInstance((Context) null);
+ final ProxyRegistrationType type = pc.getType();
+
+ if (!CONFIGURATOR_MAP.containsKey(type))
+ {
+ CONFIGURATORS.add(clazz);
+ CONFIGURATOR_MAP.put(type, clazz);
+ CONFIGURATOR_INV_MAP.put(clazz, type);
+ }
+ else
+ {
+ // We fail hard here.
+ throw new IllegalArgumentException("Duplicate proxy configurator (" + clazz + ") for type: " + type);
+ }
+ }
+ catch (final Exception e)
+ {
+ // We fail hard here.
+ throw new IllegalStateException("Failed to register proxy configurator (" + clazz + ")", e);
+ }
+ }
+
+ private static ProxyConfigurator initialize(final Context context, final ProxyConfigurator from)
+ {
+ int i = 0;
+
+ if (from != null)
+ {
+ // Scan through configurators to find last used one
+ while (i < CONFIGURATORS.size() && !CONFIGURATORS.get(i).equals(from.getClass()))
+ {
+ i++;
+ }
+ // One after last-used
+ i++;
+ }
+
+ // Loop through configurators until one succeeds to initialize
+ while (i < CONFIGURATORS.size())
+ {
+ try
+ {
+ final Class<?> clazz = CONFIGURATORS.get(i);
+ final Constructor<?> ctor = clazz.getConstructor(Context.class);
+ final ProxyConfigurator pc = (ProxyConfigurator) ctor.newInstance(context);
+ if (pc.initialize())
+ {
+ return pc;
+ }
+ }
+ catch (final Exception e)
+ {
+ Log.d(TAG, "Configurator exception", e);
+ // We don't need to handle exceptions here, only success matters
+ }
+
+ i++;
+ }
+
+ return null;
+ }
+
+ public static ProxyConfigurator registerProxy(final Context context, final InetAddress address, final int port)
+ {
+ ProxyConfigurator pc = null;
+
+ do
+ {
+ pc = initialize(context, pc);
+
+ if (pc != null)
+ {
+ if (pc.registerProxy(address, port))
+ {
+ Log.d(TAG, "Using '" + pc.toString() + "'");
+ return pc;
+ }
+
+ pc.shutdown();
+ }
+ }
+ while (pc != null);
+
+ return null;
+ }
+}

Powered by Google App Engine
This is Rietveld